問題的提出:比特幣系統(tǒng)中并沒有賬戶的概念,那么用戶是怎么知道自己有多少錢并能花掉自己的bitcoin的黄娘,即進(jìn)行bitcoin的交易呢伶贰?
問題的理解:在比特幣系統(tǒng)的交易(也叫轉(zhuǎn)賬記錄)中為了進(jìn)行交易權(quán)限校驗(yàn)迅脐,即驗(yàn)證某人是否有權(quán)利動(dòng)用發(fā)送給他的比特幣愁溜,使用了腳本系統(tǒng)來進(jìn)行權(quán)限驗(yàn)證疾嗅。常用的權(quán)限驗(yàn)證方式例如利用公鑰和簽名進(jìn)行,又或者例如多人投票機(jī)制等冕象。
該腳本系統(tǒng)是一種簡(jiǎn)單的代承、基于堆棧的、從左到右處理的渐扮、非圖靈完整的腳本系統(tǒng)次泽,它比起以太坊、EOS等下一代區(qū)塊鏈技術(shù)中使用的智能合約是要簡(jiǎn)單太多了席爽,所以功能也比較有限。其本質(zhì)是包含多個(gè)指令的列表啊片,只要這些指令在逐個(gè)的運(yùn)行過程中沒有失敗只锻,一直到該指令列表中的指令都正常執(zhí)行,那么表明交易有效紫谷,即該用戶可以動(dòng)用這個(gè)交易中發(fā)給他的比特幣齐饮。只要在指令列表的指令執(zhí)行過程中,有一個(gè)失敗或異常笤昨,則表明交易無效祖驱,該用戶無權(quán)動(dòng)用這個(gè)交易中發(fā)給他的比特幣,因?yàn)樗赡苁欠欠ㄊ褂谜摺?/p>
腳本系統(tǒng)中常用的指令包括:
1.堆棧處理指令:OP_DUP(進(jìn)行復(fù)制操作)瞒窒、OP_DROP(刪除棧頂元素)捺僻、OP_SWAP(棧頂?shù)膬蓚€(gè)元素進(jìn)行交換)
2.腳本流程控制指令:OP_RETURN(標(biāo)記交易無效)\OP_VERIFY(如果棧頂元素為false,標(biāo)識(shí)交易無效崇裁。如果為true匕坯,則交易有效)
3.加密簽名指令:OP_HASH256(進(jìn)行hash散列計(jì)算)、OP_CHECKSIGVERIFY(進(jìn)行簽名驗(yàn)證)拔稳、葛峻、等;
4.邏輯操作指令:OP_EQUAL(判斷是否相等)巴比、OP_EQUALVERIFY(判斷是否相等后進(jìn)行腳本流程控制判斷术奖,如果棧頂元素為false就標(biāo)識(shí)交易無效)
5.算術(shù)操作指令:OP_ADD(加)\OP_SUB(減)\OP_MAX(取最大值)\OP_MIN(取最小值)等礁遵。
問題的解釋:
下面我們以一個(gè)例子來形象的說明一下比特幣的腳本系統(tǒng)的執(zhí)行過程。
假設(shè)有下面一系列的交易執(zhí)行過程采记,Alice交易了一些bitcoin給Bob佣耐,Bob又交易了一些bitcoin給Carol,Carol又交易了一些bitcoin給Dave挺庞。那么在交易b中晰赞,系統(tǒng)是如何驗(yàn)證Bob是有權(quán)將Alice轉(zhuǎn)給他的bitcoin又轉(zhuǎn)給Carol呢?
一個(gè)交易的數(shù)據(jù)結(jié)構(gòu)包括三部分选侨,HASH掖鱼、輸入交易和輸出交易。如下圖所示:
我們知道在每個(gè)交易中援制,其輸入交易是包含了前一個(gè)交易的txid以及scriptSig戏挡,這個(gè)scriptSig就是驗(yàn)證用戶是否有權(quán)花掉前一個(gè)交易中轉(zhuǎn)給自己的比特幣,
例如
在Bob->Carol的交易b中晨仑,Bob為了轉(zhuǎn)賬給Carol褐墅,必須在交易b的輸入交易里提供足夠的信息才能證明Bob是可以動(dòng)用交易a中Alice轉(zhuǎn)給Bod的bitoin,交易b的輸入交易信息是和交易a的輸出交易信息進(jìn)行配對(duì)的洪己,兩者的執(zhí)行成功才能證明Bob是合法的擁有者并且可以花掉交易a中轉(zhuǎn)給他的bitcoin妥凳。
Bob為了轉(zhuǎn)賬給Carol,在交易b中提供輸入交易的輸入腳本scriptSig信息如下:
3046022100ba1427639c9f67f2ca1088d0140318a98cb1e84f604dc90ae00ed7a5f9c61cab02210094233d018f2f014a5864c9e0795f13735780cafd51b950f503534a6af246aca301
03a63ab88e75116b313c6de384496328df2656156b8ac48c75505cd20a4890f5ab
這么一長(zhǎng)串其實(shí)就是一個(gè)簽名和一個(gè)公鑰答捕。
與之對(duì)應(yīng)的逝钥,是在交易a中的輸出交易的輸出腳本scriptPubKey信息了,其內(nèi)容如下:
OP_DUP OP_HASH160be10f0a78f5ac63e8746f7f2e62a5663eed05788 OP_EQUALVERIFY OP_CHECKSIG
這么一長(zhǎng)串其實(shí)就是一個(gè)指令的腳本列表拱镐,比特幣系統(tǒng)將在腳本系統(tǒng)堆棧中逐個(gè)執(zhí)行這些指令以驗(yàn)證權(quán)限艘款。
下面看看是如何執(zhí)行這組腳本來進(jìn)行驗(yàn)證權(quán)限的。
第一步沃琅、執(zhí)行交易b的輸入腳本哗咆,因?yàn)槭莾蓚€(gè)元素,一個(gè)簽名和一個(gè)公鑰益眉,所以將這兩個(gè)元素加入堆棧晌柬;
第二步、根據(jù)輸入腳本引用的txid找到交易a的輸出腳本郭脂,得到輸出腳本的那個(gè)指令列表空繁,逐個(gè)執(zhí)行;
第三步朱庆、第一個(gè)指令是OP_DUP盛泡,表示復(fù)制操作,也就是對(duì)當(dāng)前堆棧中的棧頂元素進(jìn)行復(fù)制娱颊,那就復(fù)制一份吧
第四步傲诵、第二個(gè)指令是OP_HASH160凯砍,表示計(jì)算hash值,也就是對(duì)當(dāng)前堆棧中的棧頂元素計(jì)算其hash值拴竹,那就將計(jì)算出來的hash值入棧
第五步悟衩、第三個(gè)指令是一組數(shù)字,所以將這個(gè)元素加入堆棧栓拜;
第六步座泳、第四個(gè)指令是OP_EQUALVERIFY,表示檢查是否相等幕与,也就是從堆棧中取出最上面的兩個(gè)元素挑势,判斷是否相等,如果相等就正常進(jìn)行啦鸣,如果不相等潮饱,則中斷執(zhí)行,返回失敗诫给。
第七步香拉、第五個(gè)指令是OP_CHECKSIG,表示檢查簽名校驗(yàn)中狂,也就是從堆棧中取出最上面的兩個(gè)元素凫碌,判斷其簽名是否正確,如果相等就正常進(jìn)行胃榕,如果不相等盛险,則中斷執(zhí)行,返回失敗勤晚。
這樣,交易b的輸入腳本和交易a的輸出腳本所包含的一串指令列表執(zhí)行下來泉褐,就可以驗(yàn)證Bob是否有權(quán)利動(dòng)用交易a中轉(zhuǎn)給他的bitcoin赐写,即轉(zhuǎn)賬給Carol了。