国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于腳本解釋器的區(qū)塊鏈交易合約原理與實(shí)踐

2020-09-26 09:32郭倩王中豪王晟典林映春
網(wǎng)絡(luò)空間安全 2020年9期
關(guān)鍵詞:比特幣智能合約運(yùn)行機(jī)制

郭倩 王中豪 王晟典 林映春

摘 ? 要:基于腳本解釋器的區(qū)塊鏈交易合約架構(gòu)是目前最簡(jiǎn)潔且高效的智能合約設(shè)計(jì)之一,它具有去中心化、總量固定、可自由兌換、匿名性等特點(diǎn),也有利于密碼技術(shù)在區(qū)塊鏈中的靈活應(yīng)用與實(shí)現(xiàn)。文章在整體介紹比特幣腳本系統(tǒng)交易結(jié)構(gòu)的基礎(chǔ)上,闡述了面向未花費(fèi)交易(UTXO)的輸入交易、輸出交易的結(jié)構(gòu),并詳細(xì)地給出了比特幣腳本指令系統(tǒng)及其執(zhí)行過(guò)程和驗(yàn)證機(jī)制,從而實(shí)現(xiàn)了區(qū)塊鏈交易合約中基于腳本解釋器的公鑰支付方案。

關(guān)鍵詞:智能合約;比特幣;運(yùn)行機(jī)制

中圖分類號(hào): TP312 ? ? ? ? ?文獻(xiàn)標(biāo)識(shí)碼:A

Abstract: The blockchain transaction contract architecture based on the script interpreter is one of the most concise and efficient smart contract designs at present. It has the characteristics of decentralization, fixed total amount, free exchange, and anonymity. It is also conducive to the flexible application and implementation of cryptography in the blockchain. Based on the overall introduction of the transaction structure of the Bitcoin script system, this paper explains the structure of input transactions and output transactions for unspent transactions (UTXO). In addition, this paper details the Bitcoin script instruction system and its execution process and verification mechanism, so as to implement the public key payment scheme based on the script interpreter in the blockchain transaction contract.

Key words: smart contracts; bitcoin; operating mechanism

1 引言

智能合約(Smart Contracts)在廣義上講是指任何符合多方之間約定的計(jì)算機(jī)協(xié)議,現(xiàn)多指運(yùn)行在區(qū)塊鏈上的一個(gè)程序或者腳本,具有自動(dòng)執(zhí)行、不可篡改、可回溯等特性。Nick Szabo在1994年提出“智能合約”的概念[1],并將其定義為一個(gè)使用計(jì)算機(jī)處理執(zhí)行合約條款的交易協(xié)議。其目的在于以最小化惡意或意外的異常情況,以及最大限度減少對(duì)第三方中介需求的前提下,簡(jiǎn)化合約的執(zhí)行和減少合約的執(zhí)行成本來(lái)完成一些常見合約條件。但由于當(dāng)時(shí)缺乏一個(gè)可信的第三方平臺(tái),加上合約在社會(huì)生活中的重要性,智能合約未能真正成為主流合約指定方式。

2008年,學(xué)者Satoshi Nakamoto發(fā)表了題為《Bitcoin: A Peer-to-Peer Electronic Cash System》的研究報(bào)告[2],并在此基礎(chǔ)上設(shè)計(jì)并實(shí)現(xiàn)了比特幣這種新型數(shù)字貨幣。比特幣在對(duì)等網(wǎng)絡(luò)的基礎(chǔ)上使用了大量密碼學(xué)技術(shù)[3],并使用工作量證明作為一致性共識(shí)算法解決了數(shù)字貨幣面臨的“雙花”問(wèn)題。其核心區(qū)塊鏈提供了一個(gè)以鏈?zhǔn)綌?shù)據(jù)結(jié)構(gòu)和全網(wǎng)共識(shí)為主要特征的分布式數(shù)據(jù)存儲(chǔ)平臺(tái)[4],由此又獲得了去信任和不可篡改等重要特征,從而改變了傳統(tǒng)網(wǎng)絡(luò)交易的固定模式,受到了全社會(huì)各界人士的廣泛關(guān)注。

更為重要的是,比特幣系統(tǒng)采用了一種基于腳本解釋器的區(qū)塊鏈交易合約架構(gòu)。該腳本解釋器采用了一種含有一百多條指令的新計(jì)算機(jī)指令系統(tǒng),并采用“棧結(jié)構(gòu)”構(gòu)造了腳本指令的運(yùn)行環(huán)境。盡管不支持循環(huán)和遞歸機(jī)制,但是其腳本易于編寫和閱讀,并支持密碼協(xié)議設(shè)計(jì),因此它是目前最簡(jiǎn)潔且高效的智能合約設(shè)計(jì)之一。它具有去中心化、總量固定、可自由兌換、匿名性等特點(diǎn),也有利于密碼技術(shù)在區(qū)塊鏈中的靈活應(yīng)用與實(shí)現(xiàn)。

雖然基于腳本解釋器的區(qū)塊鏈交易構(gòu)架是非圖靈完備的,但它的交易表示結(jié)構(gòu)、指令系統(tǒng)為區(qū)塊鏈智能合約的出現(xiàn)奠定了基礎(chǔ)[5],并已具有智能合約的雛形,因此理解比特幣中的交易系統(tǒng)對(duì)于理解并發(fā)展智能合約具有重要的借鑒價(jià)值。本文在整體介紹比特幣腳本系統(tǒng)交易結(jié)構(gòu)的基礎(chǔ)上,闡述了面向未花費(fèi)交易(UTXO)的輸入交易、輸出交易的結(jié)構(gòu),并詳細(xì)地給出了比特幣腳本指令系統(tǒng)及其執(zhí)行過(guò)程和驗(yàn)證機(jī)制,從而實(shí)現(xiàn)了區(qū)塊鏈交易合約中基于腳本解釋器的公鑰支付方案。

2 比特幣的交易結(jié)構(gòu)

比特幣中交易(Transaction)結(jié)構(gòu)適用于存儲(chǔ)每一筆交易的數(shù)據(jù)結(jié)構(gòu)[6],交易在比特幣系統(tǒng)中以tx進(jìn)行簡(jiǎn)寫。由于比特幣是一種數(shù)字貨幣系統(tǒng),它的交易也只用來(lái)記錄交易中的貨幣交換,因此它的交易結(jié)構(gòu)比較簡(jiǎn)單。具體而言,它的交易內(nèi)容主要包含交易輸入方(購(gòu)買者)資金的來(lái)源和交易輸出方(銷售者)資金的去處與金額分配。注意,交易輸入的總貨幣量與輸出的總貨幣量是相等的。此外,比特幣系統(tǒng)為每個(gè)交易添加簡(jiǎn)單的控制字段。

表1展示了比特幣中交易格式的一般結(jié)構(gòu),并對(duì)交易結(jié)構(gòu)中的每個(gè)字段的類型和長(zhǎng)度(B表示字節(jié))和功能加以描述。一個(gè)交易通常包含四方面的信息。

(1)版本號(hào)(Version No):交易結(jié)構(gòu)內(nèi)部編號(hào),用以明確一筆交易參照的規(guī)則;

(2)交易輸入(tx_in):本次交易中資金的來(lái)源,可以含多項(xiàng),其中,第一個(gè)字段為輸入項(xiàng)個(gè)數(shù),其后跟隨輸入項(xiàng)列表;

(3)交易輸出(tx_out):本次交易后資金的去處,可以含多項(xiàng),其結(jié)構(gòu)與交易輸入相同;

(4)補(bǔ)助信息(Aux):保證交易的補(bǔ)助信息,包括:交易驗(yàn)證、時(shí)間鎖等。

在四種信息中,輸入交易和輸出交易是兩個(gè)列表結(jié)構(gòu),可以包含一或多個(gè)交易項(xiàng)。對(duì)輸入交易而言,它包含多個(gè)輸入交易組成的列表,每個(gè)交易含有一個(gè)交易地址,用于指向以前的交易輸出,所有以前交易的貨幣量總和構(gòu)成了本次交易的輸入貨幣總量。對(duì)于輸出交易而言,它也包含輸出交易組成的列表,每個(gè)交易包含使用該貨幣的打開方式并給出了新的貨幣分配量,同樣地,所有輸出交易的貨幣量總和應(yīng)與輸出貨幣量相同。

圖1展示了交易之間的相互關(guān)系。圖中包括了4個(gè)交易,交易1輸出貨幣量為100單位的貨幣,交易2則輸出50個(gè)單位貨幣。交易3含有兩個(gè)交易輸入,分別指向前述交易1和交易2,這意味著交易3輸入貨幣量為150個(gè)單位。交易3則有2個(gè)輸出,并將150貨幣單位中的70單位給輸出1和80單位給輸出2。交易4則以交易3中的交易輸出2的80貨幣單位為輸入,交易輸出則分別將30和50貨幣單位分配給兩個(gè)交易輸出。由此可知,利用交易輸入和輸出列表可有效而靈活的實(shí)現(xiàn)各種貨幣分配策略。

注意,比特幣系統(tǒng)中交易并不直接包含購(gòu)買者和銷售者的信息,而是采用密碼學(xué)中基于公鑰密碼的身份認(rèn)證方式進(jìn)行貨幣所有權(quán)的宣稱與驗(yàn)證。所采用的具體原理和方法將在后續(xù)第5節(jié)加以介紹。

此外,比特幣交易中也包含一些補(bǔ)助信息。例如,版本號(hào)用于向系統(tǒng)告知交易結(jié)構(gòu)的版本,系統(tǒng)可對(duì)不同版本采取針對(duì)性地處理。時(shí)間鎖(Lock Time)定義了交易放入?yún)^(qū)塊中的時(shí)刻(由Unix時(shí)間指定),也可表示延遲交易被批準(zhǔn)的時(shí)間(可看作是一種塊高度表示)。具體而言,時(shí)間鎖中的時(shí)間是該交易被加到區(qū)塊的最早時(shí)間,在大多數(shù)的情況下它的值都是0,表示需要立即被加入?yún)^(qū)塊中。如果鎖定時(shí)間大于0而小于5億(5*108),它的值就表示區(qū)塊高度;如果大于5億就表示一個(gè)Unix時(shí)間戳。

2.1 交易輸入的結(jié)構(gòu)

比特幣中交易輸入列表中每個(gè)交易輸入的結(jié)構(gòu)由五個(gè)字段構(gòu)成,分別是哈希索引、輸出索引、以及簽名腳本的長(zhǎng)度、腳本本體和序號(hào)。表2給出了每一個(gè)字段的詳細(xì)類型與長(zhǎng)度以及描述。

哈希索引包含了購(gòu)買者在上次交易的256-比特的交易標(biāo)識(shí)(txID),利用該標(biāo)識(shí)能夠迅速定位到貨幣資金的來(lái)源交易。由于該標(biāo)識(shí)是之前交易經(jīng)過(guò)兩次嵌套SHA-256哈希運(yùn)算后的輸出,因此被叫作Hash索引。

輸出索引進(jìn)一步給出了前述交易標(biāo)識(shí)所指交易中的第幾個(gè)輸出,這里要求該輸出是未被鎖定(花費(fèi))的,其中,輸出索引是從0開始編號(hào)的。

輸入結(jié)構(gòu)中最后部分是簽名腳本,該腳本是用來(lái)證明本次交易中的購(gòu)買者是前述交易輸出貨幣資金的擁有者。由于腳本長(zhǎng)度可變,因此首先由長(zhǎng)度字段告知腳本長(zhǎng)度,然后緊跟著簽名腳本序列本身,最后是簽名腳本序號(hào),它對(duì)于不同交易具有不同的意義,因此是交易結(jié)構(gòu)所特指的。通常,當(dāng)序號(hào)為0xFFFFFFFF時(shí),該字段被忽略;否則,該字段被用于設(shè)置交易輸出的鎖定時(shí)間。

2.2 輸出交易的結(jié)構(gòu)

比特幣中交易輸出列表中每個(gè)交易輸出的結(jié)構(gòu)由三個(gè)字段構(gòu)成,分別是分配的貨幣量、公鑰腳本的長(zhǎng)度和腳本本體。表3給出了每一個(gè)字段的詳細(xì)類型與長(zhǎng)度以及描述。

輸出項(xiàng)中第一項(xiàng)是貨幣量,它以satoshis為單位進(jìn)行表示,其中,1BTC=108 satoshis,即1satoshis為1個(gè)比特幣的1億分之一。輸出交易中其它兩個(gè)字段分別用于存儲(chǔ)公鑰腳本長(zhǎng)度和公鑰腳本本身,其中,公鑰腳本是指用交易輸出方(銷售者)所擁有公鑰生成的檢驗(yàn)下次交易輸入中簽名的驗(yàn)證腳本。

圖2顯示了一個(gè)比特幣交易中的輸入和輸出部分,并省略了兩部分中腳本的長(zhǎng)度等信息??梢钥闯霰忍貛沤灰捉Y(jié)構(gòu)具有簡(jiǎn)潔和精煉的特點(diǎn)。

除了上述介紹的比特幣交易結(jié)構(gòu),比特幣系統(tǒng)還存在其它交易結(jié)構(gòu)用于實(shí)現(xiàn)其它一些功能。例如,創(chuàng)幣交易(也被稱為coinbase交易)是一種可以由礦工創(chuàng)建的獨(dú)特類型的比特幣交易,礦工使用它來(lái)收取他們工作的區(qū)塊獎(jiǎng)勵(lì)。

3 比特幣腳本與指令系統(tǒng)

存儲(chǔ)在交易中的公鑰腳本(scriptPubkey)和簽名腳本(scriptSig)字段中的挑戰(zhàn)和響應(yīng)腳本使用專門為比特幣開發(fā)的腳本語(yǔ)言進(jìn)行編碼。該語(yǔ)言簡(jiǎn)稱為腳本(Script),是一種基于棧的語(yǔ)言,即它使用棧結(jié)構(gòu)實(shí)現(xiàn)腳本輸入?yún)?shù)的存儲(chǔ)和運(yùn)算。

比特幣腳本被構(gòu)建在一種特有的指令系統(tǒng)之上。在計(jì)算機(jī)系統(tǒng)中,指令系統(tǒng)通常是計(jì)算機(jī)硬件的語(yǔ)言系統(tǒng),也叫機(jī)器語(yǔ)言,指機(jī)器所具有的全部指令的集合,它是軟件和硬件的主要界面,反映了計(jì)算機(jī)所擁有的基本功能。因此,擁有指令系統(tǒng)的比特幣腳本也趨于成為一種獨(dú)立的計(jì)算機(jī)系統(tǒng)[7]。

不同計(jì)算機(jī)的指令系統(tǒng)包含的指令種類和數(shù)目也不同。一般均包含算術(shù)運(yùn)算型、邏輯運(yùn)算型、數(shù)據(jù)傳送型、判定和控制型、移位操作型、位(位串)操作型、輸入和輸出型等指令[8,9]。比特幣中腳本系統(tǒng)的指令采用后綴表達(dá)式,即將運(yùn)算符寫在操作數(shù)之后,因此指令格式可表示為:

操作數(shù)1 操作數(shù)2 ……操作數(shù)n 操作指令

操作指令由“OP_”開頭后面接英文操作名構(gòu)成,例如:OP_ADD、OP_AND。操作指令將被編碼為一個(gè)字節(jié),例如,字節(jié)0x93用于表示加法運(yùn)算符OP_ADD,該字節(jié)值稱為運(yùn)算符的操作碼。在操作指令之前的是操作數(shù)列表,根據(jù)指令不同它可包含零個(gè)或多個(gè)操作數(shù),例如:OP_NOP是無(wú)操作數(shù)的空指令、 OP_ADD是雙操作數(shù)加法指令等。操作數(shù)尋址方式只支持立即尋址方式。

在比特幣腳本系統(tǒng)中常用的指令包括:

(1)堆棧處理指令:

OP_DUP(數(shù)據(jù)復(fù)制操作)、OP_DROP(刪除棧頂元素)、OP_SWAP(棧頂?shù)膬蓚€(gè)元素進(jìn)行交換)等;

(2)流程控制指令:

OP_RETURN(標(biāo)記交易無(wú)效)、

OP_VERIFY(如果棧頂元素為false,標(biāo)識(shí)交易無(wú)效。如果為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í)交易無(wú)效)等。

(5)算術(shù)操作指令:

OP_ADD(加)、OP_SUB(減)、

OP_MAX(取最大值)、OP_MIN(取最小值)等。

比特幣指令系統(tǒng)內(nèi)容已較為豐富,可以支持大多數(shù)業(yè)務(wù)的編程需要,也為智能合約的實(shí)現(xiàn)創(chuàng)造了基礎(chǔ)。

4 比特幣腳本執(zhí)行過(guò)程

比特幣腳本的執(zhí)行系統(tǒng)是一種簡(jiǎn)單的、基于棧結(jié)構(gòu)的、從左到右處理的腳本執(zhí)行系統(tǒng)[10,11]。下面將從腳本構(gòu)造和腳本執(zhí)行過(guò)程兩個(gè)方面加以介紹。

比特幣腳本是由若干指令組成的指令序列。例如,判定等式2+3=5的腳本可表示為:

<2> <3> OP_ADD <5> OP_EQUAL

其中,<>中的值為操作數(shù),并且腳本采用了逆波蘭式(Reverse Polish notation,RPN)的表達(dá)形式。

該腳本將在棧(Stack)結(jié)構(gòu)中被腳本解釋器執(zhí)行,其中,棧是一種具有“先入后出”性質(zhì)的數(shù)據(jù)結(jié)構(gòu)表示。腳本解釋器要執(zhí)行一個(gè)包含n個(gè)參數(shù)的腳本指令,首先將參數(shù)推送到堆棧上,然后根據(jù)讀取的操作碼,解釋器通過(guò)直接從堆棧讀取這n個(gè)值來(lái)執(zhí)行計(jì)算,并將返回值存儲(chǔ)在堆棧上。因此,這種棧運(yùn)行方式不需要變量來(lái)存儲(chǔ)參數(shù)或返回值。

表4中,本文給出了前述腳本的運(yùn)行過(guò)程。首先,腳本解釋器將操作數(shù)<2>和<3>壓入到棧中;其次,腳本解釋器在接收到OP_ADD指令后將兩個(gè)棧頂操作數(shù)相加,得到結(jié)果<5>被置于棧頂;然后,操作數(shù)<5>壓入到棧中;最后,腳本解釋器在接收到OP_EQUAL指令后將兩個(gè)棧頂元素進(jìn)行比較,并將結(jié)果“真”值置于棧頂,運(yùn)算結(jié)束。因此,5步運(yùn)算后腳本解釋器即可輸出最終結(jié)果。

與通用語(yǔ)言相比,腳本運(yùn)行方式具有功能有限的缺點(diǎn),例如,它不支持循環(huán)。但它也有實(shí)現(xiàn)方便、便于編程、靈活性強(qiáng)等優(yōu)點(diǎn),而且不存在腳本執(zhí)行不停機(jī)等異常現(xiàn)象,因此易于被比特幣等輕量級(jí)區(qū)塊鏈系統(tǒng)所采用??傊?,比特幣腳本特點(diǎn)可歸納為三點(diǎn):腳本內(nèi)存訪問(wèn)采用棧結(jié)構(gòu)、腳本不含有循環(huán)、腳本執(zhí)行總能終止。

5 密碼腳本執(zhí)行與驗(yàn)證

腳本系統(tǒng)在比特幣區(qū)塊鏈中的直接應(yīng)用就是密碼功能的實(shí)現(xiàn)。由于區(qū)塊鏈中大量使用了密碼技術(shù),而且密碼技術(shù)在不同的合約中使用方法多樣,因而需要一種靈活的方法來(lái)支持密碼技術(shù)在不同合約的使用。由于用戶能夠在交易中通過(guò)靈活而短小的腳本指令對(duì)密碼操作指令進(jìn)行編程,因此腳本系統(tǒng)較好地解決了上述問(wèn)題。

比特幣區(qū)塊鏈中密碼技術(shù)的使用是多樣的,例如,需要幾個(gè)簽名來(lái)解鎖這些比特幣、除有效簽名外還需要提供密碼來(lái)解鎖特定貨幣。目前,比特幣區(qū)塊鏈常見的密碼腳本有四種類型:

(1)類型1:公鑰支付

pay-to-public-key (P2PK):

scriptPubKey: OPCHECKSIG

scriptSig:

(2)類型2:付款到公用密鑰哈希

pay-to-public-key-hash (P2PKH):

scriptPubKey: OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG

scriptSig:

(3)類型3:按腳本哈希支付

pay-to-script-hash (P2SH):

scriptPubKey: OP_HASH160 OP_EQUAL

scriptSig:

株洲市| 孟州市| 泰安市| 招远市| 来安县| 区。| 方城县| 内丘县| 东源县| 故城县| 英山县| 葵青区| 大同县| 钟祥市| 简阳市| 饶河县| 吉安市| 蓝山县| 大英县| 峨眉山市| 碌曲县| 贺兰县| 广汉市| 双鸭山市| 同江市| 房山区| 林周县| 湖南省| 沧州市| 八宿县| 苏尼特右旗| 宁武县| 枝江市| 盖州市| 浦北县| 灵武市| 慈溪市| 舒城县| 天津市| 临夏市| 汉阴县|