在上篇文章中,着重介紹了數字簽名,在這篇文章中,深刻到比特幣交易源碼的部分進行探究,並回答如下問題:git
有一些關鍵詞,翻譯成中文後,徹底失去了原來的意思了。本文約定關鍵詞以下:segmentfault
比特幣白皮書中對電子貨幣進行了定義:數組
將一枚電子貨幣定義爲**數字簽名鏈**( a chain of digital signatures)。電子貨幣從全部者轉移給下一我的是經過,全部者使用私鑰,對交易 Transactions 和下一我的的公鑰進行數字簽名,並將數字簽名附在這枚電子貨幣(數字簽名鏈)的後面。收款人對數字簽名進行檢驗,就能校驗本身是否收到了電子貨幣。
一枚電子貨幣,從被創造出來開始,在不斷地被交易,被附上數字簽名。咱們能夠等價的認爲一枚電子貨幣,就是一條數字簽名鏈。如:spa
在比特幣中,一枚電子貨幣的價值由 value 來衡量,單位是 satoshi。1 BTC = 100,000,000 satoshi。一筆交易本質就是價值的轉移,即全部者對他的一枚或多枚電子貨幣進行數字簽名,即 inputs。比特幣系統驗證後,建立一枚或多枚屬於收款人的電子貨幣,即 outputs。注意一枚電子貨幣,就像一張人民幣同樣,不能撕開成兩半用,可是能夠將其兌換成若干個等值的電子貨幣。翻譯
舉個例子:Alice 支付 Bob 價值 0.2 BTC 的電子貨幣,Bob 收到一個 0.15 BTC 的電子貨幣,而且找零給 Alice 一個 0.05 BTC 的電子貨幣。code
當這筆交易結束後,Alice 那一枚 0.2 BTC 的電子貨幣,就被比特幣系統這個「造幣廠」做廢了,而「造幣廠」同時發行兩枚新的電子貨幣,一枚 0.15 BTC 的電子貨幣給了 Bob,一枚 0.05 BTC 的電子貨幣找零給了 Alice。只有不被「造幣廠」做廢的電子貨幣,才能用於交易,這樣就可以防止 double-spend。「造幣廠」發行的電子貨幣稱爲 output,其中,沒有做廢的電子貨幣稱爲 Unspent Transaction Output,縮寫爲 UTXO。blog
下圖這是一筆早期比特幣交易。ip
主要包含四個獨立的部分:rem
transaction 的通常格式get
名稱 | 描述 |
---|---|
version | 比特幣系統的版本號 |
hash | 本次交易的 hash 值 |
inputs | 由 input 組成的數組 |
outputs | 由 output 組成的數組 |
lockTime | 值爲 0,馬上執行交易;值不爲 0,在指定區塊高度或時間戳執行交易。 |
output 的數據格式
名稱 | 描述 |
---|---|
value | 電子貨幣的價值,單位 BTC |
scriptPubKey | 一般是收款人公鑰等組成的鎖定腳本 |
input 的數據格式
名稱 | 描述 |
---|---|
prevTxId | 上一筆交易的 hash 值 |
outputIndex | 上一筆交易 outputs 的 index |
scriptSig | 一般由付款人的數字簽名和收款人的公鑰等組成的解鎖腳本。 |
注意,input 其實是一個引用。在計算交易時,是經過 prevTxId 和 outputIndex 屬性,找到上次交易的 output 做爲本次交易實際的 input。
參考文章: