區塊鏈三:深入解析比特幣交易原理

本文主要講解比特幣進行交易其中的技術原理, 交易包含的元素,交易驗證。

基於UTXO的餘額管理

比特幣沒有賬戶的概念,每個用戶賬號沒有對應的賬戶記錄,那麼比特幣系統是怎樣確認用戶賬號是否有足夠的餘額進行交易,這是通過他們區塊鏈上的UTXO計算出來。 這不是區塊鏈的必要技術,不同區塊鏈系統可以不同,以太坊就有賬戶爲每個用戶記錄餘額。

UTXO:UTXO 是 Unspent Transaction Output 的縮寫,Transaction act發音簡寫爲X

UTXO的管理餘額

看概念太玄, 其實UTXO主要解決一個問題, 用戶A有多少錢(比特幣), UTXO的方式就是看,一共有多少交易是指向用戶A,而且這些交易還沒被使用,這些交易的總額就是A的可用餘額。舉個栗子,假如有1交易(tx1_A)是指向A(向A轉賬),轉給A 100塊, A就能拿着這筆交易證明自己有100塊, 當A轉賬給B時候拿它爲新轉賬交易(tx1_B),證明A擁有100, 這筆指向A交易即被標記爲已經使用。

UTXO找零

那麼還存存在一個問題,如果A要轉B是10塊錢,怎樣解決? Tx1_A能標記爲部分被使用?這是不可以的,交易要不就未消費要不就已消費, UTXO的解決方法一筆交易作爲輸入可以產生多筆輸出交易。 這好比A擁有100塊,可以同時轉給 B 30塊, C 70塊,這樣tx1_A就作爲 tx1_B, tx1_C兩筆交易的輸入交易。 找零的方法就出來了, A給B轉10塊同時給自己轉90塊, tx1_A -> tx1_B, tx2_A 這樣。

程序員都喜歡看圖,上圖:
在這裏插入圖片描述

具體看比特幣的交易字段:

字段 類型 長度 說明
Version Unit32 4 交易數據格式的版本
tx_in_count Var_int 1+ 輸入交易數量
tx_in tx_in[] 41+ 輸入交易或者比特幣來源列表
Tx_out_count Var_int 1+ 輸出交易數量
Tx_out Tx_out[] 8+ 輸出交易列表
Lock_time Uint32_t 4 鎖定交易的期限

再看看上面兩個結構類型tx_in, tx_out:
tx_in:

字段 類型 長度 說明
Previous_tx_output OutPoint 36 對前面輸出交易的引用
Sript length Var_int 1 對前面輸出交易的引用
Script signature Uchar[] 變長 用於確認這個交易授權的腳本簽名
Sequence Uint32_t 4

tx_out:

字段 類型 長度 說明
value Uint64_t 64 轉多少
Pk Sript length Var_int 1 簽名腳本的長度
PK Script Uchar[] 變長 用於確認這個交易授權的腳本簽名

比特幣的交易驗證

UTXO解決了餘額, 還有解決怎樣確定交易就是指向B,就是A要發起轉賬給B而不是別人。在比特幣系統,用戶身份都是一對祕鑰,交易也是依賴這來證明身份。公鑰是用戶的賬戶,轉賬都是通過轉賬到用戶的公鑰,而私鑰則用於簽名自己發起的交易,確認交易是自己發起的而且交易數據沒有變更,變更後簽名必然驗證不過。

交易結構簡要圖示
在這裏插入圖片描述
1、 證明B確實輸入交易(tx1_B txid:001)的擁有者,這就要回到A轉賬給B時候,
A會把B的公鑰(比特幣裏賬戶其實就是用戶的公鑰)放入簽名腳本,並做簽名放入腳本。
具體腳本
<PubK(X)> // 將放入的公鑰X
OP_DUP // 取棧第一個,即公鑰X
OP_HASH160 // 做hash160處理
<PubKHash(B)> // 放入B公鑰的Hash值
OP_EQUALVERIFY // 兩個值做比較是否相同
OP_CHECKSIG // 校驗簽名
所以這裏X只有放入B的公鑰,才能通過,能證明這個交易是轉給B的。

2、 證明B確實發起了交易tx1_C,最後一OP_CHECKSIG則證明確實B發起tx1_C, 在交易裏面的tx_in結構,有singure字段,是B用私鑰對交易信息簽名產生,通過B的公鑰才能驗證簽名正確,這就保證交易確實B發起的並沒被修改過。

這其中的OP_CHECKSIG算法 運用了橢圓曲線數字簽名算法(ECDSA:The Elliptic Curve Digital Signature Algorithm ),一種利用橢圓曲線進行數字簽名和驗證的算法。具體數學原理我也沒搞懂,不是本主題的重點不能展開,後續搞懂了可以另寫一篇。

所以:
收到這筆交易時候,將B的公鑰,A的公鑰放入交易tx1_B驗證交易確實A給B轉賬,同樣對tx1_C(txid:002)驗證放入C公鑰和B的公鑰驗證確實是轉賬給C和確實B發起。

總結:
比特幣的交易基於UTXO解決了用戶餘額問題,基於腳本簽名解決交易合法性問題,
唯一性就是就是通過一個交易記錄只能被作爲一次輸入, 多節點的唯一性就是區塊鏈工作量證明來判決。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章