比特幣腳本及交易分析 - 智能合約雛形
在比特幣區塊鏈中,交易不是這麽簡單,交易實際是通過腳本來完成,以承載更多的功能個,這也是為什麽比特幣被稱為是一種“可編程的貨幣”。
本文就來分析一下交易是如何實現可編程的。
未花費的交易輸出(UTXO)
先引入一個概念:未花費的交易輸出——UTXO(Unspent Transaction Output)
其實比特幣的交易都是基於UTXO上的,即交易的輸入是之前交易未花費的輸出,這筆交易的輸出可以被當做下一筆新交易的輸入。
挖礦獎勵屬於一個特殊的交易(稱為coinbase交易),可以沒有輸入。
UTXO是交易的基本單元,不能再分割。在比特幣沒有余額概念,只有分散到區塊鏈裏的UTXO
隨著錢從一個地址被移動到另一個地址的同時形成了一條所有權鏈,像這樣:
比特幣腳本
比特幣交易是首先要提供一個用於解鎖UTXO(用私鑰去匹配鎖定腳本)的腳本(常稱為解鎖腳本:Signature script),這也叫交易輸入,
交易的輸出則是指向一個腳本(稱為鎖定腳本:PubKey script),這個腳本表達了:誰的簽名(簽名是常見形式,並不一定必須是簽名)能匹配這個輸出地址,錢就支付給誰。
每一個比特幣節點會通過同時執行這解鎖和鎖定腳本(不是當前的鎖定腳本,是指上一個交易的鎖定腳本)來驗證一筆交易,腳本組合結果為真,則為有效交易。
當解鎖版腳本與鎖定版腳本的設定條件相匹配時,執行組合有效腳本時才會顯示結果為真
如最為常見類型的比特幣交易腳本(支付到公鑰哈希:P2PKH(Pay-to-Public-Key-Hash))組合是這樣:
常見交易腳本驗證過程
比特幣交易腳本語言是一種基於逆波蘭表示法的基於棧的執行語言(不知道逆波蘭和棧的同學去翻大學數據結構課本,你也可跳過這個部分)。
比特幣腳本語言包含基本算數計算、基本邏輯(比如if…then)、報錯以及返回結果和一些加密指令,不支持循環。想了解更多語言細節可參考:比特幣腳本
腳本語言通過從左至右地處理每個項目的方式執行腳本。
下面用兩個圖說明下常見類型的比特幣交易腳本驗證執行過程:
上圖為解鎖腳本運行過程(主要是入棧)
上圖為鎖定腳本運行過程(主要是出棧),最後的結果為真,說明交易有效。
交易分析
實際上比特幣的交易被設計為可以納入多個輸入和輸出。
交易結構
我們來看看完整的交易結構,
交易的鎖定時間定義了能被加到區塊鏈裏的最早的交易時間。在大多數交易裏,它被設置成0,用來表示立即執行。
如果鎖定時間不是0並且小於5億,就被視為區塊高度,意指在這個指定的區塊高度之前,該交易不會被包含在區塊鏈裏。
如果鎖定時間大於5億,則它被當作是一個Unix紀元時間戳(從1970年1月1日以來的秒數),並且在這個指定時間之前,該交易不會被包含在區塊鏈裏。
交易的數據結構沒有交易費的字段,交易費通過所有輸入的總和,以及所有輸出的總和之間的差來表示,即:
交易費 = 求和(所有輸入) - 求和(所有輸出)
交易輸入結構
剛剛我們提過輸入需要提供一個解鎖腳本,現在來看看一個交易的輸入結構:
我們結合整個交易的結構裏看輸入結構就是這樣子:
交易輸出結構
剛剛我們提過輸出是指向一個解鎖腳本,具體交易的輸出結構為:
我們結合整個交易的結構裏看輸出結構就是這樣子:
交易哈希計算
在比特幣區塊結構Merkle 樹及簡單支付驗證分析 講到區塊結構,區塊結構包含多個交易的哈希。
那麽交易哈希是怎麽計算的呢?
- 交易結構各字段序列化為字節數組
- 把字節數組拼接為支付串
- 對支付串計算兩次SHA256 得到交易hash
了解詳情可進一步參考如何計算交易Hash?及如何創建Hash?
現在是不是對完整的交易到區塊有了更清晰的認識。
智能合約雛形 - 應用場景說明
由於交易是通過腳本來實現,腳本語言可以表達出無數的條件變種。
比特幣的腳本目前常用的主要分為兩種,一種是常見的P2PKH(支付給公鑰哈希),另一種是P2SH(Pay-to-Script-Hash支付腳本哈希)。
P2SH支付中,鎖定腳本被密碼學哈希所取代,當一筆交易試圖支付UTXO時,要解鎖支付腳本,它必須含有與哈希相匹配的腳本。
這裏不展開技術細節,下面說明一些應用場景,以便大家有更直觀的認識。
-
多重簽名應用
合夥經營中,如只有一半以上的的股東同意簽名就可以進行支付,可為公司治理提供管控便利,同時也能有效防範盜竊、挪用和遺失。用於擔保和爭端調解,一個買家想和他不認識或不信任的某人交易,在一般情況交易正常進行時,買家不想任何第三方參與。那交易雙方可以發起支付,但如果交易出現問題時,那第三方就可以根據裁定,使用自己的簽名和裁定認可的一方共同簽名來兌現這筆交易。
- 保證合同
保證合同是建造公眾商品時的集資辦法,公眾商品是指一旦建成,任何人都可以免費享受到好處。標準的例子是燈塔,所有人都認同應該建造一個,但是對於個人航海者來說燈塔太貴了,燈塔同時也會方便其他航海者。
一個解決方案是向所有人集資,只有當籌集的資金超過所需的建造成本時,每個人才真正付錢,如果集資款不足,則誰都不用付錢。 - 依靠預言
假如老人想讓他孫子繼承遺產,繼承時間是在他死後或者在孫子年滿18歲時(也是一個帶鎖定時間交易),無論哪個條件先滿足,他的孫子都可以得到遺產。
因為比特幣節點可依靠預言對死亡條件進行判斷,預言是指具有密鑰對的服務器,當用戶自定義的表達式被證明是真的,它能按照要求對交易簽名。
相信隨著區塊鏈的普及,會對未來的交易模式和商業結構帶來巨大的影響。不過由於比特幣的腳本語言不是圖靈完備的,交易模式依舊有限,以太坊就是為解決這一問題而出現,後面我們會有大量介紹以太坊的文章。
參考文獻 & 補充閱讀
- 精通比特幣
- 廖雪峰的深入理解比特幣交易的腳本
- 比特幣合同
深入淺出區塊鏈 - 系統學習區塊鏈,打造最好的區塊鏈技術博客。
比特幣腳本及交易分析 - 智能合約雛形