比特幣交易(二)

在上篇文章中,着重介紹了數字簽名,在這篇文章中,深刻到比特幣交易源碼的部分進行探究,並回答如下問題:git

  • 如何給電子貨幣一個單位。
  • 如何將一個電子貨幣進行分割成多個電子貨幣。
  • 如何將多個電子貨幣進行整合成一個電子貨幣。
  • 如何表示一個沒有被花費電子貨幣。
  • 電子貨幣的交易流程是什麼。

定義

有一些關鍵詞,翻譯成中文後,徹底失去了原來的意思了。本文約定關鍵詞以下:segmentfault

  • inputs: 交易輸入的集合,由一個或多個 input 組成
  • input: 一個交易輸入。一個交易輸入一般是由一個 UTXO 和數字簽名等信息組成
  • outputs: 交易輸出的集合
  • output: 交易輸出的新的電子貨幣。一般是由電子貨幣的值和驗證數字簽名的腳本組成
  • double-spend: 雙花。一枚電子貨幣可能被兩次或屢次
  • UTXO: Unspent Transaction Output 的縮寫。一般引用一個 output
  • tx: Bitcoin transaction 的縮寫。交易。
  • txid: Transaction id 的縮寫。指的是交易的 hash 值。
  • satoshi: 1 BTC = 100,000,000 satoshi

電子貨幣

比特幣白皮書中對電子貨幣進行了定義:數組

將一枚電子貨幣定義爲**數字簽名鏈**( a chain of digital signatures)。電子貨幣從全部者轉移給下一我的是經過,全部者使用私鑰,對交易 Transactions 和下一我的的公鑰進行數字簽名,並將數字簽名附在這枚電子貨幣(數字簽名鏈)的後面。收款人對數字簽名進行檢驗,就能校驗本身是否收到了電子貨幣。

一枚電子貨幣,從被創造出來開始,在不斷地被交易,被附上數字簽名。咱們能夠等價的認爲一枚電子貨幣,就是一條數字簽名鏈。如:spa

  1. Owner 0's 將他的數字簽名和 Owner 1's 的公鑰附在了第一筆交易的尾端(從左到右)
  2. 比特幣系統驗證無誤後,這枚電子貨幣就屬於了 Owner 1's。
  3. Owner 1's 將他的數字簽名和 Owner 2's 的公鑰附在了第二筆交易的尾端
  4. 比特幣系統驗證無誤後,這枚電子貨幣就屬於了 Owner 2's。
  5. 第三筆交易也是相似...

使用電子貨幣進行交易

在比特幣中,一枚電子貨幣的價值由 value 來衡量,單位是 satoshi。1 BTC = 100,000,000 satoshi。一筆交易本質就是價值的轉移,即全部者對他的一枚或多枚電子貨幣進行數字簽名,即 inputs。比特幣系統驗證後,建立一枚或多枚屬於收款人的電子貨幣,即 outputs。注意一枚電子貨幣,就像一張人民幣同樣,不能撕開成兩半用,可是能夠將其兌換成若干個等值的電子貨幣。翻譯

舉個例子:Alice 支付 Bob 價值 0.2 BTC 的電子貨幣,Bob 收到一個 0.15 BTC 的電子貨幣,而且找零給 Alice 一個 0.05 BTC 的電子貨幣。code

  1. Alice 建立一次交易。
  2. Alice 選擇一枚價值 0.2 BTC 的電子貨幣做爲本次交易的 inputs。
  3. Alice 付給 Bob 一枚價值 0.15 BTC 的電子貨幣,並找零給本身 0.05 BTC 的電子貨幣,這部分是本次交易的 outputs。
  4. 比特幣系統驗證經過後,Bob 就收到了一枚 0.15 BTC 的電子貨幣。

當這筆交易結束後,Alice 那一枚 0.2 BTC 的電子貨幣,就被比特幣系統這個「造幣廠」做廢了,而「造幣廠」同時發行兩枚新的電子貨幣,一枚 0.15 BTC 的電子貨幣給了 Bob,一枚 0.05 BTC 的電子貨幣找零給了 Alice。只有不被「造幣廠」做廢的電子貨幣,才能用於交易,這樣就可以防止 double-spend。「造幣廠」發行的電子貨幣稱爲 output,其中,沒有做廢的電子貨幣稱爲 Unspent Transaction Output,縮寫爲 UTXO。blog

交易的數據格式

下圖這是一筆早期比特幣交易。ip

主要包含四個獨立的部分:rem

  • 黃色部分表示的是:hash - txid(Transaction ID)
  • 藍色大括號表示的是:交易的描述信息和元數據
  • 粉紅色部分表示的是:inputs
  • 綠色部分表示的是:outputs

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。

參考文章:

Bitcoin: A Peer-to-Peer Electronic Cash System

Transaction

How a Bitcoin Transaction Works