比特幣運轉機制
1. 比特幣的UTXO模型
首先,在講比特幣交易過程之前要說明一個事情。比特幣系統是沒有餘額的概念的,它使用的是UTXO模型(Unspent Transaction Outputs,未使用過的交易輸出),我們在交易過程中經常說的錢包餘額,實際上是一個錢包地址的UTXO集合。所以,在比特幣網路中,儲存比特幣餘額的是交易輸出,準確點說就是未使用過的交易輸出,而每一筆交易的輸入實際上引用的是上一筆交易的輸出。下圖是比特幣系統中交易輸入輸出的過程
圖,每一筆交易記錄了時間、傳送人、接收人和金額。那如果要計算A的餘額,那麼就要遍歷所有跟A有關的交易,減去A傳送的每一筆金額,並加上A接收的每一筆金額,可以計算出。
- A的餘額 = 20-10=10
- B的餘額 = 20+10+5-5=30
- C的餘額 = 20-5=15
- D的餘額 = 20+5=25
比特幣系統中計算餘額的方法也是類似這樣。所以,要計算一個使用者的比特幣餘額,就需要遍歷整個交易的歷史。而以太坊由於採用了Account模型,也就是採用餘額的概念,所以不需要溯源整個交易歷史。
2. 比特幣區塊鏈如何運作?
比特幣網路從2009年1月開始至今,在沒有專人維護的情況下已經平穩執行7年多,期間沒有出現一次宕機。圖4以Bob接收來自Alice的比特幣的場景,詳細描述了比特幣區塊鏈的工作方式,一併解釋了涉及到的錢包和地址(
圖1,出自A Guide to Bitcoin Mining. Alec Liu
錢包和地址:
1. Bob和Alice的電腦上都有比特幣錢包。
2. 錢包是一種檔案,可以讓使用者訪問多個比特幣地址。
3. 一個地址是一串由字母和數字組成的字串。
4. 每一個地址都有自己的比特幣餘額。
新建一個地址:
5. Bob建立一個新的比特幣地址,用於接收Alice的付款。
私鑰和公鑰:
6. 當Bob建立一個新地址時,他真正在做的是生成一個金鑰對,由一個私鑰和一個公鑰組成。如果你使用私鑰(只有你知道)對一個訊息進行簽名,它可以被對應的公鑰(所有人都知道)所驗證。Bob的新地址代表一個唯一的公鑰,對應的私鑰則儲存在他的錢包裡。公鑰允許所有人來驗證被私鑰簽名的訊息的有效性。
7. 可以將地址看做銀行賬號,但工作方式稍有不同。比特幣使用者可以任意建立多個地址,並且被鼓勵為每一個新的交易單獨建立新地址,以增強隱私性。只要沒有人知道哪些地址是Alice的,她的匿名就受到保護。
提交一個支付:
8. Alice告訴她的比特幣客戶端,她要向Bob的收款地址轉賬。
9. Alice的錢包裡有她的每一個比特幣地址的私鑰。比特幣客戶端用Alice此次使用的付款地址的私鑰,對她的這一交易申請進行簽名。
10. 此時,網路上的任何人都可以使用公鑰來驗證,這個交易申請實際來自一個合法的賬戶所有者。
驗證交易:
11. Gary、Garth和Glenn都是比特幣礦工。
12. 他們的電腦將過去約10分鐘內的交易打包成一個新的交易區塊。
13. 礦工的電腦被設定用於計算加密雜湊(Cryptographic Hash)函式。
14. 加密雜湊函式將一個數據集轉換成特定長度的包含字母和數字的字串,稱為雜湊值。源資料的細微改變會徹底改變雜湊值的結果。並且基本不可能預測初始的資料集將會產生的特定雜湊值。
15. 為相同的資料建立不同的雜湊值,比特幣使用隨機數來實現。隨機數是在進行雜湊計算之前,在資料中新增的隨機數字。改變這個隨機數會產生極不相同的雜湊值。
16. 每一個新的雜湊值包含關於此前所有比特幣交易的資訊。
17. 礦工的電腦基於前一個區塊的雜湊值、新交易區塊和隨機數,來計算新的雜湊值。
18. 建立雜湊在計算上微不足道,但比特幣系統要求新的雜湊值擁有特定格式——必須以特定數量的0作為開始。
19. 礦工無法預測哪個隨機數會產生以要求的數量的0作為開始的雜湊值,所以他們被迫用不同的隨機數建立很多雜湊,直到獲得有效的那一個。
20. 每一個區塊都包含一個名為coinbase的初始交易,這是給勝出礦工的50比特幣的支付——在這個例子中是礦工Gary。Gray的錢包裡生成了一個新地址,裡面的餘額是新挖到的比特幣數量。
- 注:只有在比特幣發行的階段1,每一個區塊的coinbase支付給勝出礦工的新幣是50個。從2009年1月3日創世區塊誕生開始,新比特幣的發行大約每4年減半,2012年11月28日,階段2開始,每一個區塊包含的新幣減為25個,這是歷史上第一次減半;預計今年7月11日,挖礦獎勵會再次減半;直到第33次減半時,每一個區塊從產生0.0021個新幣直接減為0個,比特幣的總量固定在將近2100萬個。
交易驗證:
21. 隨著時間流逝,Alice向Bob的轉賬被埋在了其它更近期的交易下面。任何人要想修改歷史交易的細節,就必須重做一遍Gary的工作,然後再重做所有下一級礦工的工作,因為所有的改變都需要一個完全不同的勝出隨機數。這樣的操作幾乎不可能成功。