郭倩 王中豪 王晟典 林映春



摘 ? 要:基于腳本解釋器的區塊鏈交易合約架構是目前最簡潔且高效的智能合約設計之一,它具有去中心化、總量固定、可自由兌換、匿名性等特點,也有利于密碼技術在區塊鏈中的靈活應用與實現。文章在整體介紹比特幣腳本系統交易結構的基礎上,闡述了面向未花費交易(UTXO)的輸入交易、輸出交易的結構,并詳細地給出了比特幣腳本指令系統及其執行過程和驗證機制,從而實現了區塊鏈交易合約中基于腳本解釋器的公鑰支付方案。
關鍵詞:智能合約;比特幣;運行機制
中圖分類號: TP312 ? ? ? ? ?文獻標識碼: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)在廣義上講是指任何符合多方之間約定的計算機協議,現多指運行在區塊鏈上的一個程序或者腳本,具有自動執行、不可篡改、可回溯等特性。Nick Szabo在1994年提出“智能合約”的概念[1],并將其定義為一個使用計算機處理執行合約條款的交易協議。其目的在于以最小化惡意或意外的異常情況,以及最大限度減少對第三方中介需求的前提下,簡化合約的執行和減少合約的執行成本來完成一些常見合約條件。但由于當時缺乏一個可信的第三方平臺,加上合約在社會生活中的重要性,智能合約未能真正成為主流合約指定方式。
2008年,學者Satoshi Nakamoto發表了題為《Bitcoin: A Peer-to-Peer Electronic Cash System》的研究報告[2],并在此基礎上設計并實現了比特幣這種新型數字貨幣。比特幣在對等網絡的基礎上使用了大量密碼學技術[3],并使用工作量證明作為一致性共識算法解決了數字貨幣面臨的“雙花”問題。其核心區塊鏈提供了一個以鏈式數據結構和全網共識為主要特征的分布式數據存儲平臺[4],由此又獲得了去信任和不可篡改等重要特征,從而改變了傳統網絡交易的固定模式,受到了全社會各界人士的廣泛關注。
更為重要的是,比特幣系統采用了一種基于腳本解釋器的區塊鏈交易合約架構。該腳本解釋器采用了一種含有一百多條指令的新計算機指令系統,并采用“棧結構”構造了腳本指令的運行環境。盡管不支持循環和遞歸機制,但是其腳本易于編寫和閱讀,并支持密碼協議設計,因此它是目前最簡潔且高效的智能合約設計之一。它具有去中心化、總量固定、可自由兌換、匿名性等特點,也有利于密碼技術在區塊鏈中的靈活應用與實現。
雖然基于腳本解釋器的區塊鏈交易構架是非圖靈完備的,但它的交易表示結構、指令系統為區塊鏈智能合約的出現奠定了基礎[5],并已具有智能合約的雛形,因此理解比特幣中的交易系統對于理解并發展智能合約具有重要的借鑒價值。本文在整體介紹比特幣腳本系統交易結構的基礎上,闡述了面向未花費交易(UTXO)的輸入交易、輸出交易的結構,并詳細地給出了比特幣腳本指令系統及其執行過程和驗證機制,從而實現了區塊鏈交易合約中基于腳本解釋器的公鑰支付方案。
2 比特幣的交易結構
比特幣中交易(Transaction)結構適用于存儲每一筆交易的數據結構[6],交易在比特幣系統中以tx進行簡寫。由于比特幣是一種數字貨幣系統,它的交易也只用來記錄交易中的貨幣交換,因此它的交易結構比較簡單。具體而言,它的交易內容主要包含交易輸入方(購買者)資金的來源和交易輸出方(銷售者)資金的去處與金額分配。注意,交易輸入的總貨幣量與輸出的總貨幣量是相等的。此外,比特幣系統為每個交易添加簡單的控制字段。
表1展示了比特幣中交易格式的一般結構,并對交易結構中的每個字段的類型和長度(B表示字節)和功能加以描述。一個交易通常包含四方面的信息。
(1)版本號(Version No):交易結構內部編號,用以明確一筆交易參照的規則;
(2)交易輸入(tx_in):本次交易中資金的來源,可以含多項,其中,第一個字段為輸入項個數,其后跟隨輸入項列表;
(3)交易輸出(tx_out):本次交易后資金的去處,可以含多項,其結構與交易輸入相同;
(4)補助信息(Aux):保證交易的補助信息,包括:交易驗證、時間鎖等。
在四種信息中,輸入交易和輸出交易是兩個列表結構,可以包含一或多個交易項。對輸入交易而言,它包含多個輸入交易組成的列表,每個交易含有一個交易地址,用于指向以前的交易輸出,所有以前交易的貨幣量總和構成了本次交易的輸入貨幣總量。對于輸出交易而言,它也包含輸出交易組成的列表,每個交易包含使用該貨幣的打開方式并給出了新的貨幣分配量,同樣地,所有輸出交易的貨幣量總和應與輸出貨幣量相同。
圖1展示了交易之間的相互關系。圖中包括了4個交易,交易1輸出貨幣量為100單位的貨幣,交易2則輸出50個單位貨幣。交易3含有兩個交易輸入,分別指向前述交易1和交易2,這意味著交易3輸入貨幣量為150個單位。交易3則有2個輸出,并將150貨幣單位中的70單位給輸出1和80單位給輸出2。交易4則以交易3中的交易輸出2的80貨幣單位為輸入,交易輸出則分別將30和50貨幣單位分配給兩個交易輸出。由此可知,利用交易輸入和輸出列表可有效而靈活的實現各種貨幣分配策略。
注意,比特幣系統中交易并不直接包含購買者和銷售者的信息,而是采用密碼學中基于公鑰密碼的身份認證方式進行貨幣所有權的宣稱與驗證。所采用的具體原理和方法將在后續第5節加以介紹。
此外,比特幣交易中也包含一些補助信息。例如,版本號用于向系統告知交易結構的版本,系統可對不同版本采取針對性地處理。時間鎖(Lock Time)定義了交易放入區塊中的時刻(由Unix時間指定),也可表示延遲交易被批準的時間(可看作是一種塊高度表示)。具體而言,時間鎖中的時間是該交易被加到區塊的最早時間,在大多數的情況下它的值都是0,表示需要立即被加入區塊中。如果鎖定時間大于0而小于5億(5*108),它的值就表示區塊高度;如果大于5億就表示一個Unix時間戳。
2.1 交易輸入的結構
比特幣中交易輸入列表中每個交易輸入的結構由五個字段構成,分別是哈希索引、輸出索引、以及簽名腳本的長度、腳本本體和序號。表2給出了每一個字段的詳細類型與長度以及描述。
哈希索引包含了購買者在上次交易的256-比特的交易標識(txID),利用該標識能夠迅速定位到貨幣資金的來源交易。由于該標識是之前交易經過兩次嵌套SHA-256哈希運算后的輸出,因此被叫作Hash索引。
輸出索引進一步給出了前述交易標識所指交易中的第幾個輸出,這里要求該輸出是未被鎖定(花費)的,其中,輸出索引是從0開始編號的。
輸入結構中最后部分是簽名腳本,該腳本是用來證明本次交易中的購買者是前述交易輸出貨幣資金的擁有者。由于腳本長度可變,因此首先由長度字段告知腳本長度,然后緊跟著簽名腳本序列本身,最后是簽名腳本序號,它對于不同交易具有不同的意義,因此是交易結構所特指的。通常,當序號為0xFFFFFFFF時,該字段被忽略;否則,該字段被用于設置交易輸出的鎖定時間。
2.2 輸出交易的結構
比特幣中交易輸出列表中每個交易輸出的結構由三個字段構成,分別是分配的貨幣量、公鑰腳本的長度和腳本本體。表3給出了每一個字段的詳細類型與長度以及描述。
輸出項中第一項是貨幣量,它以satoshis為單位進行表示,其中,1BTC=108 satoshis,即1satoshis為1個比特幣的1億分之一。輸出交易中其它兩個字段分別用于存儲公鑰腳本長度和公鑰腳本本身,其中,公鑰腳本是指用交易輸出方(銷售者)所擁有公鑰生成的檢驗下次交易輸入中簽名的驗證腳本。
圖2顯示了一個比特幣交易中的輸入和輸出部分,并省略了兩部分中腳本的長度等信息。可以看出比特幣交易結構具有簡潔和精煉的特點。
除了上述介紹的比特幣交易結構,比特幣系統還存在其它交易結構用于實現其它一些功能。例如,創幣交易(也被稱為coinbase交易)是一種可以由礦工創建的獨特類型的比特幣交易,礦工使用它來收取他們工作的區塊獎勵。
3 比特幣腳本與指令系統
存儲在交易中的公鑰腳本(scriptPubkey)和簽名腳本(scriptSig)字段中的挑戰和響應腳本使用專門為比特幣開發的腳本語言進行編碼。該語言簡稱為腳本(Script),是一種基于棧的語言,即它使用棧結構實現腳本輸入參數的存儲和運算。
比特幣腳本被構建在一種特有的指令系統之上。在計算機系統中,指令系統通常是計算機硬件的語言系統,也叫機器語言,指機器所具有的全部指令的集合,它是軟件和硬件的主要界面,反映了計算機所擁有的基本功能。因此,擁有指令系統的比特幣腳本也趨于成為一種獨立的計算機系統[7]。
不同計算機的指令系統包含的指令種類和數目也不同。一般均包含算術運算型、邏輯運算型、數據傳送型、判定和控制型、移位操作型、位(位串)操作型、輸入和輸出型等指令[8,9]。比特幣中腳本系統的指令采用后綴表達式,即將運算符寫在操作數之后,因此指令格式可表示為:
操作數1 操作數2 ……操作數n 操作指令
操作指令由“OP_”開頭后面接英文操作名構成,例如:OP_ADD、OP_AND。操作指令將被編碼為一個字節,例如,字節0x93用于表示加法運算符OP_ADD,該字節值稱為運算符的操作碼。在操作指令之前的是操作數列表,根據指令不同它可包含零個或多個操作數,例如:OP_NOP是無操作數的空指令、 OP_ADD是雙操作數加法指令等。操作數尋址方式只支持立即尋址方式。
在比特幣腳本系統中常用的指令包括:
(1)堆棧處理指令:
OP_DUP(數據復制操作)、OP_DROP(刪除棧頂元素)、OP_SWAP(棧頂的兩個元素進行交換)等;
(2)流程控制指令:
OP_RETURN(標記交易無效)、
OP_VERIFY(如果棧頂元素為false,標識交易無效。如果為true,則交易有效)等;
(3)加密簽名指令:
OP_HASH256(進行hash散列計算)、
OP_CHECKSIGVERIFY(進行簽名驗證)等;
(4)邏輯操作指令:
OP_EQUAL(判斷是否相等)、
OP_EQUALVERIFY(判斷是否相等后進行腳本流程控制判斷,如果棧頂元素為false就標識交易無效)等。
(5)算術操作指令:
OP_ADD(加)、OP_SUB(減)、
OP_MAX(取最大值)、OP_MIN(取最小值)等。
比特幣指令系統內容已較為豐富,可以支持大多數業務的編程需要,也為智能合約的實現創造了基礎。
4 比特幣腳本執行過程
比特幣腳本的執行系統是一種簡單的、基于棧結構的、從左到右處理的腳本執行系統[10,11]。下面將從腳本構造和腳本執行過程兩個方面加以介紹。
比特幣腳本是由若干指令組成的指令序列。例如,判定等式2+3=5的腳本可表示為:
<2> <3> OP_ADD <5> OP_EQUAL
其中,<>中的值為操作數,并且腳本采用了逆波蘭式(Reverse Polish notation,RPN)的表達形式。
該腳本將在棧(Stack)結構中被腳本解釋器執行,其中,棧是一種具有“先入后出”性質的數據結構表示。腳本解釋器要執行一個包含n個參數的腳本指令,首先將參數推送到堆棧上,然后根據讀取的操作碼,解釋器通過直接從堆棧讀取這n個值來執行計算,并將返回值存儲在堆棧上。因此,這種棧運行方式不需要變量來存儲參數或返回值。
表4中,本文給出了前述腳本的運行過程。首先,腳本解釋器將操作數<2>和<3>壓入到棧中;其次,腳本解釋器在接收到OP_ADD指令后將兩個棧頂操作數相加,得到結果<5>被置于棧頂;然后,操作數<5>壓入到棧中;最后,腳本解釋器在接收到OP_EQUAL指令后將兩個棧頂元素進行比較,并將結果“真”值
與通用語言相比,腳本運行方式具有功能有限的缺點,例如,它不支持循環。但它也有實現方便、便于編程、靈活性強等優點,而且不存在腳本執行不停機等異常現象,因此易于被比特幣等輕量級區塊鏈系統所采用。總之,比特幣腳本特點可歸納為三點:腳本內存訪問采用棧結構、腳本不含有循環、腳本執行總能終止。
5 密碼腳本執行與驗證
腳本系統在比特幣區塊鏈中的直接應用就是密碼功能的實現。由于區塊鏈中大量使用了密碼技術,而且密碼技術在不同的合約中使用方法多樣,因而需要一種靈活的方法來支持密碼技術在不同合約的使用。由于用戶能夠在交易中通過靈活而短小的腳本指令對密碼操作指令進行編程,因此腳本系統較好地解決了上述問題。
比特幣區塊鏈中密碼技術的使用是多樣的,例如,需要幾個簽名來解鎖這些比特幣、除有效簽名外還需要提供密碼來解鎖特定貨幣。目前,比特幣區塊鏈常見的密碼腳本有四種類型:
(1)類型1:公鑰支付
pay-to-public-key (P2PK):
scriptPubKey:
scriptSig:
(2)類型2:付款到公用密鑰哈希
pay-to-public-key-hash (P2PKH):
scriptPubKey: OP_DUP OP_HASH160
scriptSig:
(3)類型3:按腳本哈希支付
pay-to-script-hash (P2SH):
scriptPubKey: OP_HASH160
scriptSig:
(4)類型4:多簽名支付
multiple signature:
scriptPubKey: M,
scriptSig: OP_0
其中,N是存檔公鑰總數,M是要求激活交易的最少公鑰數。
在上述密碼腳本中,每個腳本由公鑰腳本(scriptPubKey)和簽名腳本(scriptSig)兩部分構成。按照比特幣系統中使用的鎖定概念,公鑰腳本將被用于對交易合約的輸出部分進行“加鎖”,與此相對的是,簽名腳本被用在交易合約的輸入部分對前述輸出部分進行“解鎖”。這里,“加鎖”和“解鎖”是一種對密碼學中數字簽名與簽名者公鑰相匹配的直觀表達。這也暗示著簽名者具有交易中存儲公鑰相對應的私鑰,因此他是該比特幣的合法花費者,其原因在于該私鑰能夠生成有效的解鎖簽名。此外,在公鑰腳本中只給出了公鑰的哈希值
下面以類型2中的P2PKH腳本為例說明密碼腳本的執行過程。P2PKH腳本被稱為“付款到公用密鑰哈希(P2PKH)”,它通常在大多數比特幣用戶最熟悉的場景下使用:使用私鑰提供簽名,以便花費所指定“地址”的比特幣,其中,該地址也被稱為付款到公用密鑰哈希(P2PKH)地址。當使用與該P2PKH地址相關聯的私鑰來生成簽名時,只要滿足腳本編寫的條件,硬幣將被解鎖;而在不匹配的情況下,硬幣將保持鎖定狀態。
表5描述了P2PKH密碼腳本運行過程。首先,給定scriptPubKey和scriptSig,腳本解釋器將按照scriptSig在前script-PubKey在后的順序生成執行腳本,并清空運行所需要的棧(第0步);其次,操作數
6 結束語
本文詳細闡述了比特幣系統的交易結構、腳本指令系統以及執行與驗證過程,并在各部分的介紹中分析其安全性,是對目前比特幣系統的研究應用成果的總結和歸納。盡管基于腳本解釋器的區塊鏈交易合約不適合處理復雜業務,但其簡潔、易于驗證的特點,為其它智能合約平臺的構建提供了經驗和實踐基礎。本文希望能展現比特幣腳本系統的實現機制和運行方式,以供相關領域的學者參考借鑒。
參考文獻
[1] Szabo N. Smart contracts in essays on smart contracts, commercial controls and security (1994)[J]. URL: http://www. fon. hum. uva. nl/rob/Courses/InformationInSpeech/CDROM/Literature/LOTwinterschool2006/szabo. best. vwh. net/smart. contracts. html.
[2] Nakamoto S. A peer-to-peer electronic cash system[J]. Bitcoin.–URL: https://bitcoin. org/bitcoin. pdf, 2008.
[3] Lansky J. Possible state approaches to cryptocurrencies[J]. Journal of Systems Integration, 2018, 9(1): 19-31.
[4] Eyal I, Sirer E G. Majority is not enough: Bitcoin mining is vulnerable[J]. Communications of the ACM, 2018, 61(7): 95-102.
[5] Cuccuru P. Beyond bitcoin: an early overview on smart contracts[J]. International Journal of Law and Information Technology, 2017, 25(3): 179-195.
[6] 于江. 新型貨幣 “比特幣”: 產生, 原理與發展[J]. 吉林金融研究, 2013, 5(01): 17-23.
[7] Narayanan A, Bonneau J, Felten E, et al. Bitcoin and cryptocurrency technologies: a comprehensive introduction[M]. Princeton University Press, 2016.
[8] Zhu Y, Guo R, Gan G, et al. Interactive incontestable signature for transactions confirmation in bitcoin blockchain[C]//2016 IEEE 40th Annual Computer Software and Applications Conference (COMPSAC). IEEE, 2016, 1: 443-448.
[9] Frantz C K, Nowostawski M. From institutions to code: Towards automated generation of smart contracts[C]//2016 IEEE 1st International Workshops on Foundations and Applications of Self* Systems (FAS* W). IEEE, 2016: 210-215.
[10] 崔久強 , 呂堯 , 王虎. 基于區塊鏈的數字身份發展現狀[J]. 網絡空間安全, 2020, 11(6): 6-.
[11] 吳洪, 方引青, 張瑩. 瘋狂的數字化貨幣—比特幣的性質與啟示[J]. 北京郵電大學學報: 社會科學版, 2013 (3): 46-50.