第五章 區塊鏈交易原理

1、概述

本章介紹區塊鏈交易的原理,重點介紹交易過程中,如何證明錢的歸屬、如何證明錢是誰付的。

在介紹交易過程之前,需要先介紹一個概念:未花費的交易輸出(UTXO——Unspent Transaction Output)。

區塊鏈中使用UTXO代表用戶持有的價值,代表用戶收到的還沒有花費的價值。

區塊鏈中每一個比特幣無論經過了多少次流轉,都是來源於挖礦獎勵(幣基交易)。幣基交易是礦工挖礦時的獎勵,該交易的輸入爲空,輸出是贏得記賬權的礦工。

礦工把比特幣轉移給A,這時候對於礦工來說,比特幣已經花費,狀態就變成已花費了,而對於A來說,它收到了礦工的比特幣,此時比特幣的狀態爲未花費。

比特幣在流轉過程中,對於付款人來說,這是一筆輸出,而且已經花費了;對於收款人來說,這筆輸出還未花費。

2、交易原理分析

我們以1個例子來看看交易的原理:假設A交易1個比特幣給B,B又把這個比特幣交易給C。

第四章 區塊鏈共識機制一章中,我們已經介紹了一筆交易的完成過程,前2步屬於交易過程,後面的屬於共識過程,這裏不再贅述。

首先B收到A的1個比特幣後,B就有了1筆UTXO,大致結構如下:
在這裏插入圖片描述
我們可以看到,記錄分成3部分:hash、in、out。

  • hash:代表着交易的唯一標識,是對所有交易信息進行hash而來的。
  • in:代表着交易的付款方,此處是A。
    • address:A的地址,在區塊鏈中通過地址唯一標識一個用戶,每個用戶有用一對公私鑰,可以認爲地址是通過公鑰經過一系列計算得來的。
    • value:交易的金額。
    • pkscript:此處的加鎖腳本並不會執行,僅僅是從上一筆交易的output中拷貝的pkscript。
    • sigscript:解鎖腳本是付款方使用私鑰做的簽名,簽名用來證明這筆交易是他本人發起的,防止抵賴。
    • preHash:這個字段我不確定有,但是看實際的交易,會發現每筆交易都是可以追溯的,一直到最初的幣基交易,我認爲會存在這個字段,來標記該筆交易來自哪裏。任何一筆in,肯定來源於之前的out。
  • out:代表着交易的收款方,此處是B。
    • address:B的地址。
    • value:金額。
    • pkscript:加鎖腳本在交易驗證過程中非常重要。它的作用是在用戶花費這筆錢的時候,需要證明這筆錢是他的,否則任何人都可以花不就亂了。它其實是一個棧結構,裏面是一條條的命令,驗證過程就是依次執行這些命令,都通過了則驗證通過。在花費這筆UTXO時,各個礦工會驗證該加鎖腳本,驗證通過後才允許交易。
    • nextHash:該字段指的是這筆錢,花出去時的交易標誌。這個字段肯定不在賬本中,可能存儲在其它位置了。

當B把這筆錢交易給C的時候,會創建如下的記錄:
在這裏插入圖片描述
觀察一下記錄的變更:

  • hash:變成了003
  • in:
    • address:是B的地址,因爲現在B是付款方了。
    • pkscript:其實等同於上筆交易中out部分的pkscript
    • sigscript:B用私鑰對交易信息做的簽名,證明是B花的錢。
    • preHash:002,就是上筆交易。
  • out:
    • address:是C的地址,因爲現在C是收款方了。
    • pkscript:加鎖腳本,證明這筆錢現在歸C了。

2.1 加鎖腳本、解鎖腳本

繼續往下看之前,你需要了解公鑰和比特幣地址之間的關係:

以公鑰 K 爲輸入,計算其 SHA256 哈希值,並以此結果計算 RIPEMD160 哈希值,得到一個長度爲 160 比特(20 字節)的數字:

A = RIPEMD160(SHA256(K))

公式中,K 是公鑰,A 是生成的比特幣地址。

pkscript 加鎖腳本是驗證錢屬於自己的手段,每個UTXO都會有一個加鎖腳本,加鎖腳本是這樣的:

OP_DUP
OP_HASH160
9bcc25cea896e5ebf5e38850a2038e215f2393cb
OP_EQUALVERIFY
OP_CHECKSIG

它由一條條的命令及數據組成。在B要花費這個UTXO時,其它節點會按照這個腳本進行驗證,驗證通過則進行挖礦,否則直接丟棄。下面看看這些命令的含義:

  • OP_DUP:複製棧頂數據,這裏指的是公鑰。
  • OP_HASH160:進行hash計算。
  • 9bcc25cea896e5ebf5e38850a2038e215f2393cb:要對比的值,這裏是地址。
  • OP_EQUALVERIFY:使用hash值與上面的值比較,判斷是否相等。
  • OP_CHECKSIG:對解鎖腳本中的簽名信息進行驗籤。

2.2 多個輸入輸出

上面的例子比較簡單,交易的金額正好等於一筆UTXO。現實生活中,更多的是一筆UTXO大於要支付的金額,或者多筆UTXO合在一起纔夠支付的金額,這種情況下如何處理呢?

UTXO是不支持拆分的,這跟傳統的交易有所區別。

一筆交易中,分爲輸入、輸出兩個部分,區塊鏈中對於輸入是沒有限制的,輸出最多是兩個:一個是收款方,一個是找零。

比如:B要支付給C150個比特幣,B有3個UTXO:40,50,60,則交易記錄如下所示:
在這裏插入圖片描述

參考資料

談談自己對比特幣腳本的理解

發佈了49 篇原創文章 · 獲贊 35 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章