比特幣等數字貨幣的核心運行原理與案例
關於比特幣等數字貨幣是如何運行的問題,本文整理了幾個關鍵的問題來分開描述。
- 數字貨幣定義。
- 如何將一個數字貨幣進行分割成多個數字貨幣。
- 如何將多個數字貨幣進行整合成一個電子貨幣。
- 如何表示一個沒有被花費數字貨幣。
- 數字貨幣的交易流程是什麼。
定義
有一些關鍵詞,翻譯成中文後,完全失去了原來的意思了。本文約定關鍵詞如下:
- 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 和下一個人的公鑰進行數字簽名,並將數字簽名附在這枚數字貨幣(數字簽名鏈)的後面。收款人對數字簽名進行檢驗,就能校驗自己是否收到了數字貨幣。
一枚數字貨幣,從被創造出來開始,在不斷地被交易,被附上數字簽名。我們可以等價的認為一枚數字貨幣,就是一條數字簽名鏈。如:
- Owner 0s 將他的數字簽名和 Owner 1s 的公鑰附在了第一筆交易的尾端(從左到右)
- 比特幣系統驗證無誤後,這枚電子貨幣就屬於了 Owner 1s。
- Owner 1s 將他的數字簽名和 Owner 2s 的公鑰附在了第二筆交易的尾端
- 比特幣系統驗證無誤後,這枚電子貨幣就屬於了 Owner 2s。
- 第三筆交易也是類似...
比特幣交易輸入和輸出
首先,關於比特幣交易必須記住下面四個原則:
- 我們發送的任何比特幣金額總是被發送到一個地址。
- 我們收到的任何比特幣金額都被鎖定到接收地址 - 通常與我們的錢包相關聯。
- 如果需要消費比特幣,我們花的比特幣金額總是來自之前收到的錢(存儲在用戶的wallet中)
- 接收地址收到比特幣,但他們不發送比特幣 - 比特幣是在wallet中來打包交易並發送。
我們的錢包的比特幣金額是通過錢包的地址來進行關聯:
例如:用戶創建一個全新的錢包,它收到3,0.01,0.2三個不同數額的比特幣:您發送3比特幣到與錢包相關的地址和兩個付款由alice另一個地址。 錢包報告有3.21BTC餘額,但如果分析錢包的內部組織,你會發現他們的金額不是簡單的加權在一起(不是321 mil satoshi),雖然他們的起源交易是0.01,0.2和3 BTC。但收到的比特幣金額內部不會混合,而是作為發送到錢包的確切金額分開。上面例子中的三個金額被稱為他們原始交易的輸出。
使用電子貨幣進行交易
在比特幣中,一枚電子貨幣的價值由 value 來衡量,單位是 satoshi。1 BTC = 100,000,000 satoshi。一筆交易本質就是價值的轉移,即所有者對他的一枚或多枚電子貨幣進行數字簽名,即 inputs。比特幣系統驗證後,創建一枚或多枚屬於收款人的電子貨幣,即 outputs。注意一枚電子貨幣,就像一張人民幣一樣,不能撕開成兩半用,但是可以將其兌換成若干個等值的電子貨幣。
舉個例子:Alice 支付 Bob 價值 0.2 BTC 的電子貨幣,Bob 收到一個 0.15 BTC 的電子貨幣,並且找零給 Alice 一個 0.05 BTC 的電子貨幣。
- Alice 創建一次交易。
- Alice 選擇一枚價值 0.2 BTC 的電子貨幣作為本次交易的 inputs。
- Alice 付給 Bob 一枚價值 0.15 BTC 的電子貨幣,並找零給自己 0.05 BTC 的電子貨幣,這部分是本次交易的 outputs。
- 比特幣系統驗證通過後,Bob 就收到了一枚 0.15 BTC 的電子貨幣。
當這筆交易結束後,Alice 那一枚 0.2 BTC 的電子貨幣,就被比特幣系統這個「造幣廠」作廢了,而「造幣廠」同時發行兩枚新的電子貨幣,一枚 0.15 BTC 的電子貨幣給了 Bob,一枚 0.05 BTC 的電子貨幣找零給了 Alice。只有不被「造幣廠」作廢的電子貨幣,才能用於交易,這樣就能夠防止 double-spend。「造幣廠」發行的電子貨幣稱為 output,其中,沒有作廢的電子貨幣稱為 Unspent Transaction Output,縮寫為 UTXO。個人認為UTXO是比特幣最偉大的設計!
TX : Transaction(交易)
TXO : TX output(交易輸出):包含一個value值和一段腳本,該腳本規定了誰有權使用這筆交易(比如需要私鑰簽名)。
UTXO: Unspent TXO(未花費的交易輸出):只有對「尚未使用過」的交易簽名才能是有效簽名
比特幣區塊鏈不維護每個比特幣地址的個人餘額。然而,個人比特幣錢包應用程序可以掃描區塊鏈資料庫內容以及特定比特幣地址的總UTXO的總量(即特定比特幣地址的餘額總和被列為比特幣「接收者」的所有UTXO輸出)。
只有UTXO的概念才能產生下一個問題:誰可以從UTXO中花費比特幣,答案是:誰可以證明他們是位於比特幣地址後面的{sk,pk}密鑰對的合法所有者,誰就可以進行實際交易。
交易的數據格式
下圖這是一筆比特幣交易:
主要包含四個獨立的部分:
- 黃色部分表示的是:hash - txid(Transaction ID)
- 藍色大括弧表示的是:交易的描述信息和元數據
- 粉紅色部分表示的是:inputs
- 綠色部分表示的是:outputs
比特幣交易驗證
讓我們用經典的bob和alice的例子來解釋挖掘節點如何驗證鮑勃有權利用艾麗斯先前向他發送(即傳送給)比特幣。我會忽略支付「礦工費」,以保持下面的描述儘可能簡單。
讓我們假設在過去的某個時候,Alice在一些早期的交易中總共擁有1.6 BTC(比特幣)。為了使圖表儘可能清晰,該交易沒有顯示在圖表上。
在某一時刻,Alice提交比特幣交易信息(在下圖中顯示為Alice的交易信息),其中她將先前分配的1.6 BTC分成兩個交易輸出:輸出#0向Bob的比特幣地址和輸出#1發送0.8 BTC發送0.8比特幣到她自己的比特幣地址(被認為是一個簡單的「改變」等價物)。Alice事務的兩個輸出都包含單獨的鎖定腳本。輸出#0鎖定腳本指定了bob的消費條件,輸出#1鎖定腳本指定了alice的消費條件。
在網路礦工接受Alice的交易並將其置於一個區塊之後,其輸出將被自動視為新的總UTXO的一部分。這就是為什麼Alice的交易被標記為「之前」 - 它已經是區塊鏈內容的一部分。
現在,如果鮑勃想「花」並將那些0.8比特幣(由愛麗斯分配給他)發送給佐伊的比特幣地址,他必須準備自己的比特幣交易消息,有1個輸入和1個輸出(對不起,鮑勃在這裡沒有任何變化案件)。
Bob的事務輸入#0引用Alice事務的輸出#0並且還包含「解鎖腳本」。Bob的輸入#0的解鎖腳本包含:
- 從Alice和Bob的交易消息中結合一些選定的標準交易數據的數字簽名(由Bob的sk產生)
- 鮑勃的PK,可以用來驗證數字簽名
驗證節點將如何確保提交「當前」事務的「Bob」是真正擁有Alice的事務輸出#0的鎖定腳本中列出的比特幣地址的「真正的Bob」?這就是比特幣腳本作為自動化工具派上用場的地方。驗證挖掘節點只需從Bob的事務輸入#0執行解鎖腳本,緊接著從Alice的事務輸出#0執行鎖定腳本。如果兩個腳本的組合順序執行的最終結果返回TRUE,則Bob證明他有權從Alice的輸出#0中花費比特幣,否則該交易被廢棄為無效。
在執行腳本命令的過程中,我不會詳細討論比特幣腳本虛擬機如何操作堆棧。這已經在許多文章中得到了解釋。相反,我將嘗試描述執行腳本的主要目標。基本上,Bob的解鎖腳本和Alice的鎖定腳本的組合順序執行必須證明兩件事情,以便Bob的比特幣交易被接受為有效的:
- Bob的pk是什麼時候雙重哈希(先用SHA-256,然後用RIPEMD-160)產生一個160位的輸出,它完全匹配Alice的事務輸出中指定的比特幣地址值#0鎖定腳本
- 可以使用Bob提供的pk(在Bob的交易輸入#0中提供)適當地驗證從Alice和Bob的交易中選擇的標準交易數據提供的數字簽名(在Bob的交易輸入#0內)。
如果步驟1和步驟2都成立,則Bob有權使用這些0.8 BTC,並且可以將交易添加到下一個區塊鏈中。
一句話總結:比特幣協議功能的核心就是以前交易輸出被重新用作新交易的輸入的機制
推薦閱讀:
※還有誰能阻止比特幣(Bitcoin)征服地球?
※區塊鏈與物聯網結合:解讀數字貨幣IOTA在機器經濟中的應用
※我們可能低估了區塊鏈的進化速度
TAG:比特币Bitcoin | 区块链Blockchain | 数字化货币 |