比特币交易原理分析
比特幣交易原理分析
最近一直在自學(xué)區(qū)塊鏈,這段時間開始系統(tǒng)總結(jié)一些學(xué)習(xí)的內(nèi)容,寫成博客內(nèi)容,希望能給初學(xué)者或者想要系統(tǒng)學(xué)習(xí)區(qū)塊鏈技術(shù)的同學(xué)一些幫助。
在這一系列技術(shù)總結(jié)后,會帶大家動手從零開發(fā)一個迷你區(qū)塊鏈。
迷你區(qū)塊鏈體驗地址:?http://miniblockchain.shuwoom.com/index
?
版權(quán)聲明:可以轉(zhuǎn)載,但請備注原文鏈接。
關(guān)鍵字:比特幣、區(qū)塊鏈、交易腳本、智能合約、UTXO賬戶模型、價值轉(zhuǎn)移
1.比特幣的UTXO模型
首先,在講比特幣交易過程之前要說明一個事情。比特幣系統(tǒng)是沒有余額的概念的,它使用的是UTXO模型(Unspent Transaction Outputs,未使用過的交易輸出),我們在交易過程中經(jīng)常說的錢包余額,實際上是一個錢包地址的UTXO集合。所以,在比特幣網(wǎng)絡(luò)中,存儲比特幣余額的是交易輸出,準(zhǔn)確點說就是未使用過的交易輸出,而每一筆交易的輸入實際上引用的是上一筆交易的輸出。下圖是比特幣系統(tǒng)中交易輸入輸出的過程:
圖0 比特幣系統(tǒng)中交易輸入輸出過程
如下圖,每一筆交易記錄了時間、發(fā)送人、接收人和金額。那如果要計算A的余額,那么就要遍歷所有跟A有關(guān)的交易,減去A發(fā)送的每一筆金額,并加上A接收的每一筆金額,可以計算出。
-
A的余額 = 20-10=10
-
B的余額 = 20+10+5-5=30
-
C的余額 = 20-5=15
-
D的余額 = 20+5=25
比特幣系統(tǒng)中計算余額的方法也是類似這樣。所以,要計算一個用戶的比特幣余額,就需要遍歷整個交易的歷史。而以太坊由于采用了Account模型,也就是采用余額的概念,所以不需要溯源整個交易歷史。
圖1 賬本
所以,我們可以將UTXO理解為一個幣:它是有一個金額以及一個擁有者。一筆交易若要有效,就必須滿足兩個條件:
(1)這個交易必須包含一個有效簽名,來自它所花費的UTXO的擁有者
(2)被花費的UTXO的總金額必須大于等于該交易產(chǎn)生的UTXO總金額。
2.交易過程
上面,我們介紹了比特幣的UTXO模型,解釋了比特幣“余額”的概念。接下來,我們正式開始講解比特幣的交易過程,并在接下來的分析過程中我們會回答兩個很重要的問題:
(1)如何保證用戶只能使用自己的比特幣?(比特幣賬本是全網(wǎng)公開的)
(2)如何保證一筆交易的有效性?
下圖,是一筆交易的完整過程。這里面交易有兩種類型,一種是Coinbase交易,也就是挖礦獎勵的比特幣,由于沒有發(fā)送人,所以比較特殊。另一種就是我們常見的普通交易了,包含輸入和輸出的。
圖2 比特幣交易基本過程
這里我們假設(shè),由于Alice挖礦被獎勵了12.5個比特幣。而Alice在一筆交易中,需要轉(zhuǎn)賬給Bob10個比特幣。而Bob最終確認(rèn)并接收了Alice發(fā)送的10個比特幣,而同時由于多出了2.5個比特幣。其實這筆交易最終是生成了2個輸出,一個是發(fā)送給Bob的10個比特幣,另一個是找零產(chǎn)生的發(fā)給Alice的2.5個比特幣(備注:這里不考慮交易費)。
在這里面,發(fā)生了幾個關(guān)鍵的操作:
(1)最開始,Alice由于挖礦被獎勵了12.5個比特幣,從而產(chǎn)生一筆Coinbase交易。這個交易中包含一個輸入和一個輸出。輸出中,包含當(dāng)前輸出的索引、金額、鎖定腳本和接受者的公鑰。這里鎖定腳本的作用是,設(shè)定成只有Alice才能使用這筆輸出。而要使用這個UTXO,就必須要證明自己是Alice。如何證明,我們會在后面講解。
(2)然后,由于Alice要發(fā)送給Bob10個比特幣,那么她首先要做的就是確認(rèn)自己有沒有足夠的“余額”去支付這筆交易。我們在上一節(jié)說了,要計算用戶的余額,就要遍歷Alice的所有交易記錄,這里,我們假設(shè)Alice就只有一筆Coinbase交易,也就是說Alice當(dāng)前的余額是12.5個比特幣。由于12.5大于所要支出的10個比特幣,所以交易可以進(jìn)行。
(3)接下來,就是要創(chuàng)建一筆交易。這筆交易包含1個輸入、2個輸出(一個發(fā)送給Alice,一個找零發(fā)給自己)。
由于比特幣采用UTXO模型,一筆交易的輸入實際上使用的是上一筆交易的輸出(UTXO)。輸入中也包含發(fā)送者的公鑰,這里是Alice的公鑰。這里,有一個很重要的問題,我們怎么知道Alice使用的是自己的UTXO呢?如果Alice使用的是別人的UTXO,我們怎么去校驗?zāi)?#xff1f;
這里,我們看到輸入中除了引用上一個交易輸出和發(fā)送者Alice的公鑰,還包含了一個解鎖腳本。解鎖腳本里包含了Alice的對上一筆交易輸出的簽名和自己的公鑰。在《區(qū)塊鏈快速入門》中,我們知道通過數(shù)字簽名技術(shù),我們可以使用公鑰對用戶的簽名(私鑰加密)進(jìn)行驗證從而證明簽名者是否用戶本人。如下圖,我們就可以通過解鎖腳本中提供的Alice的簽名和公鑰去驗證Alice使用的是否是自己的UTXO。
圖3 數(shù)字簽名技術(shù)(簽名和驗證)
(4)上一步,我們驗證了該交易中輸入所引用的上一筆UTXO確實是Alice的,從而證明了該輸入的有效性。接下來,就需要創(chuàng)建2個輸出,一個是給Bod的10個比特幣,同時包含一個鎖定腳本,該鎖定腳本限定只有Bod才能使用;另一個是找零產(chǎn)生的輸出,發(fā)送給Alice的2.5個比特幣,同樣的也包含一個鎖定腳本,并且限定只有Alice本人才能使用。
(5)最后交易創(chuàng)建完成后,就向比特幣網(wǎng)絡(luò)廣播出去,當(dāng)比特幣網(wǎng)絡(luò)確認(rèn)這筆交易并且將這筆交易在下一次挖礦競賽中,將該交易打包進(jìn)區(qū)塊中并得到全網(wǎng)共識確認(rèn)后,這筆交易就確認(rèn)有效了。
比特幣的基本交易過程就基本這樣。
下圖我們可以了解下,一個比特幣真實交易是包含哪些數(shù)據(jù)的?
b6f6b339b546a13822192b06ccbdd817afea5311845f769702ae2912f7d94ab5交易
圖4 普通交易
3.關(guān)鍵概念
一個交易包含以下信息:
-
輸入:一個或多個交易輸入
-
輸出:一個或多個交易輸出
-
時間:交易時間戳UNIX
3.1 交易分類
交易分為2類:
-
Coinbase交易:挖礦獎勵,沒有輸入,只有輸出。如下圖5所示。
-
普通交易:用戶之間的普通轉(zhuǎn)賬交易,如上圖4所示
圖5 Coinbase交易
3.2 交易輸入
交易的輸入結(jié)構(gòu)如下:
圖6 交易輸入結(jié)構(gòu)
3.3 交易輸出
交易的輸出結(jié)構(gòu)如下:
圖7 交易輸出結(jié)構(gòu)
3.4 交易腳本
(1)概念
比特幣客戶端使用一個用類Forth腳本語言編寫的腳本去驗證比特幣的交易,這個腳本語言不是圖靈完備的,不具備循環(huán)等復(fù)雜的特性。它是一種基于堆棧的執(zhí)行語言,該腳本語言的簡單特性,雖然使得它不能實現(xiàn)復(fù)雜的功能,但是也提高了交易腳本的安全性(設(shè)計簡單,減少了攻擊面)。而以太坊就是詬病比特幣交易腳本功能有限,所以設(shè)計了一個圖靈完備的腳本語言,也就是我們常說的智能合約腳本語言,能實現(xiàn)更復(fù)雜的功能,但同時也增加了安全隱患。
當(dāng)一筆比特幣交易被驗證時,每一個輸入中的解鎖腳本與其所引用的輸出中的鎖定腳本同時執(zhí)行,從而檢查這筆交易是否有效。如圖8所示,是最為常見類型的比特幣交易的解鎖和鎖定腳本。
圖8 解鎖腳本和鎖定腳本
(2)驗證過程
當(dāng)我們拿到一筆交易時,如何驗證這個交易輸入是否有效,也就是如何校驗該輸入所引用的輸出是否有效。
首先,將當(dāng)前輸入的解鎖腳本,和該輸入所引用的上一筆交易輸出的鎖定腳本如圖8一樣組合在一起,并進(jìn)行下的驗證過程,最終若返回TRUE,說明交易有效。
圖9 交易有效性校驗過程
從上面的校驗過程,其實我們可以發(fā)現(xiàn),如果要實現(xiàn)多人簽名的校驗以及定時消費的校驗(規(guī)定多久后才能使用),同樣可以采用上述的原理進(jìn)行。
(3)實例分析
下面,我們通過分析一筆比特幣真實交易,來加深了解比特幣的交易腳本驗證過程。
地址:
https://webbtc.com/tx/cca7507897abc89628f450e8b1e0c6fca4ec3f7b34cccf55f3f531c659ff4d79
圖10?cca7507897abc89628f450e8b1e0c6fca4ec3f7b34cccf55f3f531c659ff4d79交易數(shù)據(jù)
為了校驗該交易有效,我們需要對
cca7507897abc89628f450e8b1e0c6fca4ec3f7b34cccf55f3f531c659ff4d79中輸入所引用的上一筆輸出的鎖定腳本與當(dāng)前輸入中的解鎖腳本進(jìn)行校驗。
解鎖腳本(SriptSig):
8b4830450221009908144ca6539e09512b9295c8a27050d478fbb96f8addbc3d075544dc41328702201aa528be2b907d316d2da068dd9eb1e23243d97e444d59290d2fddf25269ee0e0141042e930f39ba62c6534ee98ed20ca98959d34aa9e057cda01cfd422c6bab3667b76426529382c23f42b9b08d7832d4fee1d6b437a8526e59667ce9c4e9dcebcabb
翻譯后:
| PUSHDATA(72)[30450221009908144ca6539e09512b9295c8a27050d478fbb96f8addbc3d075544dc41328702201aa528be2b907d316d2da068dd9eb1e23243d97e444d59290d2fddf25269ee0e01] PUSHDATA(65)[042e930f39ba62c6534ee98ed20ca98959d34aa9e057cda01cfd422c6bab3667b76426529382c23f42b9b08d7832d4fee1d6b437a8526e59667ce9c4e9dcebcabb] |
?
該解鎖腳本包含了發(fā)送者的簽名(綠色部分)和公鑰(紅色部分)。
?
該輸入引用的上一筆輸出的鎖定腳本:
-
上一個交易ID:a1075db55d416d3ca199f55b6084e2115b9345e16c5cf302fc80e9d5fbf5d48d
-
輸出索引:0
可以找到輸入所引用的上一筆交易輸出是如下:
其鎖定腳本為:1976a91446af3fb481837fadbb421727f9959c2d32a3682988ac
翻譯后:
| OP_DUP OP_HASH160?46af3fb481837fadbb421727f9959c2d32a36829?OP_EQUALVERIFY OP_CHECKSIG |
我們將解鎖腳本和鎖定腳本組合在一起進(jìn)行校驗:
| PUSHDATA(72)[30450221009908144ca6539e09512b9295c8a27050d478fbb96f8addbc3d075544dc41328702201aa528be2b907d316d2da068dd9eb1e23243d97e444d59290d2fddf25269ee0e01] PUSHDATA(65)[042e930f39ba62c6534ee98ed20ca98959d34aa9e057cda01cfd422c6bab3667b76426529382c23f42b9b08d7832d4fee1d6b437a8526e59667ce9c4e9dcebcabb] OP_DUP OP_HASH160?46af3fb481837fadbb421727f9959c2d32a36829?OP_EQUALVERIFY OP_CHECKSIG |
然后逐一執(zhí)行指令:
| 棧 | 指令 | 說明 |
| ? | PUSH DATA 3045…0e01 | 將3045…0e01(簽名)入棧 |
| 3045…0e01 | PUSH DATA 042e…cabb | 將042e…cabb(公鑰)入棧 |
| 042e…cabb 3045…0e01 | OP_DUP 042e…cabb | 復(fù)制棧頂數(shù)據(jù) |
| 042e…cabb 042e…cabb 3045…0e01 | OP_HASH160 | 對棧頂數(shù)據(jù)先采用SH256哈希算法,隨后對其運用RIPEMD160算法,得到: 46af3fb481837fadbb421727f9959c2d32a36829 |
| 46af…6829 042e…cabb 3045…0e01 | PUSH DATA 46af…6829 | 將46af…6829入棧 |
| 46af…6829 46af…6829 042e…cabb 3045…0e01 | OP_EQUALVERIFY | 校驗棧頂兩個數(shù)據(jù)是否相等 |
| 042e…cabb 3045…0e01 | OP_CHECKSIG | 驗證簽名 |
| TRUE | RESULT | 返回為TRUE,說明交易有效 |
最終交易腳本返回TRUE,證明了交易的有效性。
?
備注:如果想要詳細(xì)了解比特幣的腳本語言,可以查看:https://en.bitcoin.it/wiki/Script
??????????如果想在線校驗交易,可以查看:https://webttc.com
總結(jié)
- 上一篇: 以太坊“拿下”世界银行(WB)!7300
- 下一篇: UTXO 与账户余额模型