在上篇文章中,著重介紹了數(shù)字簽名,在這篇文章中,深入到比特幣交易源碼的部分進行探究,并回答以下問題:
- 如何給電子貨幣一個單位。
- 如何將一個電子貨幣進行分割成多個電子貨幣。
- 如何將多個電子貨幣進行整合成一個電子貨幣。
- 如何表示一個沒有被花費電子貨幣。
- 電子貨幣的交易流程是什么。
定義
有一些關鍵詞,翻譯成中文后,完全失去了原來的意思了。本文約定關鍵詞如下:
- inputs: 交易輸入的集合,由一個或多個 input 組成
- input: 一個交易輸入。一個交易輸入通常是由一個 UTXO 和數(shù)字簽名等信息組成
- outputs: 交易輸出的集合
- output: 交易輸出的新的電子貨幣。通常是由電子貨幣的值和驗證數(shù)字簽名的腳本組成
- double-spend: 雙花。一枚電子貨幣可能被兩次或多次
- UTXO: Unspent Transaction Output 的縮寫。通常引用一個 output
- tx: Bitcoin transaction 的縮寫。交易。
- txid: Transaction id 的縮寫。指的是交易的 hash 值。
- satoshi: 1 BTC = 100,000,000 satoshi
電子貨幣
比特幣白皮書中對電子貨幣進行了定義:
將一枚電子貨幣定義為數(shù)字簽名鏈( a chain of digital signatures)。電子貨幣從所有者轉移給下一個人是通過,所有者使用私鑰,對交易 Transactions 和下一個人的公鑰進行數(shù)字簽名,并將數(shù)字簽名附在這枚電子貨幣(數(shù)字簽名鏈)的后面。收款人對數(shù)字簽名進行檢驗,就能校驗自己是否收到了電子貨幣。
一枚電子貨幣,從被創(chuàng)造出來開始,在不斷地被交易,被附上數(shù)字簽名。我們可以等價的認為一枚電子貨幣,就是一條數(shù)字簽名鏈。如:
- Owner 0 將他的數(shù)字簽名和 Owner 1 的公鑰附在了第一筆交易的尾端(從左到右)
- 比特幣系統(tǒng)驗證無誤后,這枚電子貨幣就屬于了 Owner 1。
- 此時 Owner 1 擁有的電子貨幣為: ... => Owner 0
- Owner 1 將他的數(shù)字簽名和 Owner 2 的公鑰附在了第二筆交易的尾端
- 比特幣系統(tǒng)驗證無誤后,這枚電子貨幣就屬于了 Owner 2。
- 此時 Owner 2 擁有的電子貨幣為: ... => Owner 0 => Owner 1
- 第三筆交易也是類似...

使用電子貨幣進行交易
在比特幣中,一枚電子貨幣的價值由 value 來衡量,單位是 satoshi。1 BTC = 100,000,000 satoshi。一筆交易本質就是價值的轉移,即所有者對他的一枚或多枚電子貨幣進行數(shù)字簽名,即 inputs。比特幣系統(tǒng)驗證后,創(chuàng)建一枚或多枚屬于收款人的電子貨幣,即 outputs。注意一枚電子貨幣,就像一張人民幣一樣,不能撕開成兩半用,但是可以將其兌換成若干個等值的電子貨幣。
舉個例子:Alice 支付 Bob 價值 0.2 BTC 的電子貨幣,Bob 收到一個 0.15 BTC 的電子貨幣,并且找零給 Alice 一個 0.05 BTC 的電子貨幣。
- Alice 創(chuàng)建一次交易。
- Alice 選擇一枚價值 0.2 BTC 的電子貨幣作為本次交易的 inputs。
- Alice 付給 Bob 一枚價值 0.15 BTC 的電子貨幣,并找零給自己 0.05 BTC 的電子貨幣,這部分是本次交易的 outputs。
- 比特幣系統(tǒng)驗證通過后,Bob 就收到了一枚 0.15 BTC 的電子貨幣。

當這筆交易結束后,Alice 那一枚 0.2 BTC 的電子貨幣,就被比特幣系統(tǒng)這個“造幣廠”作廢了,而“造幣廠”同時發(fā)行兩枚新的電子貨幣,一枚 0.15 BTC 的電子貨幣給了 Bob,一枚 0.05 BTC 的電子貨幣找零給了 Alice。只有不被“造幣廠”作廢的電子貨幣,才能用于交易,這樣就能夠防止 double-spend?!霸鞄艔S”發(fā)行的電子貨幣稱為 output,其中,沒有作廢的電子貨幣稱為 Unspent Transaction Output,縮寫為 UTXO。
交易的數(shù)據(jù)格式
下圖這是一筆早期比特幣交易。

主要包含四個獨立的部分:
- 黃色部分表示的是:hash - txid(Transaction ID)
- 藍色大括號表示的是:交易的描述信息和元數(shù)據(jù)
- 粉紅色部分表示的是:inputs
- 綠色部分表示的是:outputs
transaction 的一般格式
| 名稱 | 描述 |
|---|---|
| version | 比特幣系統(tǒng)的版本號 |
| hash | 本次交易的 hash 值 |
| inputs | 由 input 組成的數(shù)組 |
| outputs | 由 output 組成的數(shù)組 |
| lockTime | 值為 0,立刻執(zhí)行交易;值不為 0,在指定區(qū)塊高度或時間戳執(zhí)行交易。 |
output 的數(shù)據(jù)格式
| 名稱 | 描述 |
|---|---|
| value | 電子貨幣的價值,單位 BTC |
| scriptPubKey | 通常是收款人公鑰等組成的鎖定腳本 |
input 的數(shù)據(jù)格式
| 名稱 | 描述 |
|---|---|
| prevTxId | 上一筆交易的 hash 值 |
| outputIndex | 上一筆交易 outputs 的 index |
| scriptSig | 通常由付款人的數(shù)字簽名和收款人的公鑰等組成的解鎖腳本。 |
注意,input 實際上是一個引用。在計算交易時,是通過 prevTxId 和 outputIndex 屬性,找到上次交易的 output 作為本次交易實際的 input。這樣,每一個Tx Input都和之前的某個Tx Output關聯(lián)了起來。這就在代碼層面上定義了一條數(shù)字簽名鏈即一枚電子貨幣。

雖然本節(jié)談論的是電子貨幣,但重心卻在于交易,這是因為貨幣本身依附于交易而存在的。
我是這樣理解的貨幣的。財富是一切能夠滿足人類物質需求和精神需求的事物。在財富的需求端,人類對財富的種類需求各式各樣,張三需要吃飽,李四想要精神自由。在財富的生產(chǎn)端,由于生產(chǎn)要素的不同和社會分工的存在,生產(chǎn)的財富種類也各式各樣。貨幣的誕生,就是是為了滿足人類對財富交易的需求。因此我們可以說,貨幣的本源是交易,而不是一般等價物的本身。在探究比特幣系統(tǒng)的實現(xiàn)上,我們也可以發(fā)現(xiàn)它淡化了“貨幣”的概念,專注于“交易”本身。
參考文章:
Bitcoin: A Peer-to-Peer Electronic Cash System
How a Bitcoin Transaction Works
比特幣源碼研讀班-蔣宏偉