深入位元幣原理(五) 高階交易與指令碼

2021-09-26 21:15:11 字數 3803 閱讀 9195

【摘要】 多重簽名交易允許同一筆交易輸出需要多個私鑰才能解鎖,即鎖定指令碼設定條件,有n個公鑰(注意不是公鑰hash)被記錄在指令碼中,其中至少有m個必須提供簽名才能解鎖,也被成為m-n方案。

一、多重簽名交易

多重簽名交易允許同一筆交易輸出需要多個私鑰才能解鎖,即鎖定指令碼設定條件,有n個公鑰(注意不是公鑰hash)被記錄在指令碼中,其中至少有m個必須提供簽名才能解鎖,也被成為m-n方案。n是金鑰的總數,m是驗證所需的簽名數量

鎖定指令碼一般的形式為:

m ... n checkmultisig

鎖定指令碼示例:2-3多重簽名條件

2 3 checkmultisig

解鎖指令碼示例:

0 第一位需要補0是因為位元幣**的乙個bug,呼叫時會從堆疊上多取出乙個數字,取出後它被立刻丟去,並不用於之後的運算。這個數具體是什麼值無關緊要,可堆疊上不能缺失它,不然無法正常執行checkmultisig。修復該**會引起位元幣分叉,所以現在通過補0的方式來規避

最終實際的解鎖指令碼驗證如下:

0 2 3 checkmultisig

二、p2sh(pay-to-script-hash)

多重簽名會有如下問題:

1.交易臃腫,n個公鑰都要包含在交易的輸出中(鎖定指令碼中),增加了交易的大小同時增加了交易費用,另外還增加了礦工維護utxo的負擔。

2.付款使用者必須根據你提供的所有公鑰資訊對交易中的鎖定指令碼進行定製,給支付帶來極大的不便利。

此處展開一下分析多重簽名為什麼要進行定製,而p2pkh不需要呢?

1.p2pkh的鎖定指令碼包含的內容是公鑰雜湊,公鑰雜湊可以通過位元幣位址解碼得到,所以只要知道位元幣位址就可以正常生成鎖定指令碼進行支付。

2.多重簽名鎖定指令碼需要包含n個公鑰,不可能從單一的位址得到所有的公鑰,所以鎖定指令碼必須定製。

p2sh的出現即是為了解決多重簽名存在的這些問題,p2sh增加贖回指令碼(redeem script)概念,p2sh指令碼內容示例:

贖回指令碼: 2 pubkey1 pubkey2 pubkey3 pubkey4 pubkey5 5 checkmultisig

鎖定指令碼: hash160 <20-byte hash of redeem script> equal

解鎖指令碼: sig1 sig2

從指令碼內容可以看到,鎖定指令碼從原來的多重簽名鎖定指令碼變成了原指令碼的雜湊,而贖回指令碼內容即為原來的多重簽名鎖定指令碼內容,解鎖指令碼中增加了贖回指令碼的內容。

所以執行的情況變成如下:

1.先對比解鎖指令碼中的贖回指令碼內容雜湊與鎖定指令碼中是否一致

sig1 sig2 hash160 <20-byte hash of redeem script> equal

2.如果上面的對比結果一致,則變成執行如下內容(回到了多重指令碼驗證的情況)

p2sh的好處:

1.鎖定指令碼簡化,減小了交易的空間占用

2.p2sh位址使付款人無需關心複雜的操作,只需向位址支付即可

3.p2sh使多重簽名指令碼的負擔轉移到收款人身上,而不是付款人

(1)多重簽名導致的交易大小擴大仍然存在,只是由鎖定指令碼轉移到了解鎖指令碼上。

(2)只有當需要解鎖p2sh位址上的位元幣進行付款時才會發生,延遲了占用較多空間交易發生的時間。

(2)交易大小導致的交易速度減慢,交易費增加等負擔轉移到收款人承擔。

三、資料記錄輸出(return)

位元幣去中心化分布式資料庫的特性,使許多開發者開始利用交易指令碼作出除支付以外的嘗試,如數字公證服務、**證明、智慧型合約等。

基於上面的需求,return命令出現,該命令可以用於範圍特定的資料,並記錄到位元幣區塊鏈當中作為永久儲存,它有如下特點:

1.使用return命令的輸出無法被用於支付,所以不應該包含位元幣在return輸出中,嘗試包含return的輸出作為輸入的交易會被認為無效。

2.return的資料量大小限制為80bytes,通常包含hash值(如sha256結果)與服務內容的字首(如proof of existence的字首為8-byte docproof)。

3.使用return的輸出不會被儲存在礦工的utxo集中,避免了記憶體占用,但是會寫入到區塊鏈中。

return指令碼示例

scriptpubkey:return

scriptsig:

從指令碼可以看到通常輸入指令碼為null

四、時間鎖(timelock)

時間鎖主要用於延遲支付,即指定某筆交易或utxo在某乙個區塊高度或時間戳才進行支付或可以被使用。

1.交易時間鎖(nlocktime)

位元幣的交易中存在"locktime"引數,用於表示該筆交易在何時被廣播到位元幣網路中

0 < locktime < 500million:代表區塊高度(block height)

locktime >= 500million:代表時間戳(從1970-1-1開始的unix時間戳)

交易時間鎖的特點:

交易時間鎖要求該筆交易在指定時間後才向全網廣播,所以在時間到達前該交易並不計入區塊鏈中。導致如果在時間到達前付款人發起另一筆交易,雙重支付並產生同一筆輸入,則實際上前一筆交易會失效,這使收款人沒有任何保障。

但是由於這個特性,給了付款人考慮時間,如果付款人對於交易後悔,可以防止該交易生效。

2.檢查鎖定時間驗證(check lock time verify(以下簡稱cltv))

cltv是一種基於utxo的時間鎖,通過在p2sh贖回指令碼(redeem script)中新增checklocktimeverify命令對時間進行校驗。將時間鎖寫入指令碼中就保證了utxo被鎖定,在鎖定時間到達前沒有人可以使用該utxo。

cltv贖回指令碼示例:

checklocktimeverify drop dup hash160 equalverify checksig

當要解鎖前,需要先校驗,如果校驗成功,刪除,正常執行解鎖指令碼。

如下情況將導致校驗失敗:

1.堆疊是空的

2.小於0

3.頂層堆疊項()和nlocktime欄位的鎖定時間型別(區塊高度或者時間戳)不相同

4.頂層堆疊項大於交易的nlocktime欄位

5.輸入的nsequence欄位為0xffffffff

從失敗情況可以發現,在cltv交易中,nlocktime欄位仍然要設定,並且要大於cltv時間,時間型別需要保持一致。

到這裡我們已經將位元幣上主要的高階交易型別學習完了,隨著時間的推移,位元幣指令碼的能力會被進一步挖掘,位元幣將通過指令碼進一步向區塊鏈」平台「發展。

有興趣可以去 檢視一下區塊中的資訊,如果看見類似下面這種無法解碼的output,說明不是標準的交易,很可能就是用於貨幣以外的其他用途了。

位元幣原理1

雜湊函式 原始資訊 摘要資訊同樣的原始資訊用同乙個雜湊函式總是能得到相同的摘要資訊,原始資訊的微小變化都會雜湊出面目全非的摘要資訊,從摘要資訊無法逆向推算出原始資訊。hash 序號,時間戳,交易資訊 雜湊值,雜湊函式的怎麼實現的?區塊 序號,時間戳,雜湊值 交易資訊10分鐘出塊雜湊值 hash ha...

位元幣原理詳解

一 什麼是位元幣 位元幣是一種電子貨幣,是一種基於密碼學的貨幣,在2008年11月1日由中本聰發表位元幣 文中提出了一種去中心化的電子記賬系統,我們平時的電子現金是銀行來記賬,因為銀行的背後是國家信用。去中心化電子記賬系統是參與者共同記賬。位元幣可以防止主權危機 信用風險。其好處不多做贅述,這一層面...

位元幣原理一(四個問題)

一 賬本如何驗證 哪乙個賬本是有效的 假如有這樣乙個賬本 賬號收入 支出餘額 王二100 100張三 10030 李四120 90110 趙五300 600這樣的乙個賬本,分別存在於王 二 張三 李 四 趙五的電腦中。在這時可能有人會增加自己的餘額,比如張三偷偷把自己的餘額從30改為300,這樣網路...