BSV智慧型合約(三) 神奇的OP CHECKSIG

2021-10-07 02:36:18 字數 1975 閱讀 8869

op_checksig用於驗證ecdsa簽名。ecdsa簽名的驗證需要如下三個引數:

公鑰:簽名私鑰對應的公鑰。

被簽名資料:被簽名的資料的hash值。

簽名。

如果簽名是由公鑰對應的私鑰針對資料進行簽署的,那麼簽名驗證成功,否則失敗。而op_checksig驗證的ecdsa簽名,只需要公鑰和簽名兩個引數。為什麼沒有「被簽名資料」引數呢?因為在op_checksig中,「被簽名資料」引數是一組固定資料的hash值,也就是說op_check只檢測對特定資料的簽名。這組固定資料來自新(花費)老(被花費)兩組tx,是這樣構成的:

nversion of the transaction (4-byte little endian)

hashprevouts (32-byte hash)

hashsequence (32-byte hash)

outpoint (32-byte hash + 4-byte little endian)

scriptcode of the input (serialized as scripts inside ctxouts)value of the output spent by this input (8-byte little endian)

nsequence of the input (4-byte little endian)

hashoutputs (32-byte hash)nlocktime of the transaction (4-byte little endian)

sighash type of the signature (4-byte little endian)

接下是最巧妙的部分,計數器合約用位元幣指令碼做了如下兩步操作:

選擇乙個對公私鑰privatekey和publickey,用私鑰對傳入sighashpreimage進行簽名,得到簽名資料,用公式表達為:signature = sig(privatekey, hash(傳入sighhashpreimage))用上述公鑰對上述計算出的簽名進行op_checksig簽名校驗,用公式表達為:checkresult = op_checksig(publickey, hash(真實sighashpreimage), signature)。(再次強調,op_checksig操作碼規定,被簽名的資料一定是hash(真實sighashpreimage),否則op_checksig的行為就不符合協議,相當於實現op_checksig的**錯了。)

如果第2步的簽名通過,也就是說checkresulttrue,那麼傳入sighashpreimage真實sighashpreimage相同。計數器合約正是這樣巧妙地運用op_checksig操作碼來驗證了傳入sighashpreimage的真實性。

從上面的計算過程我們可以知道,這裡公私鑰對的選擇並不重要,部署合約時隨機生成一對就可以。因為公私鑰對要寫到合約指令碼裡公開,所以千萬不要選擇可以花費幣的私鑰。

這種檢測傳入sighashpreimage真實性的方案有個專有名字,叫op_push_tx。雖然以op開頭,但這並不是bsv協議中的基本操作碼。可以把它理解為用基本操作碼編寫的乙個函式。scrypt語言中用如下兩行**來實現op_push_tx:

tx tx = new tx();

require(tx.validate(sighashpreimage));

bsv層1 token示例

bsv原子交換示例

農民對沖天氣風險的保險合約

用指令碼直接計算ecdsa簽名,用op_checksig驗證傳入資料的真實性。這是十年來在位元幣上開的最大腦洞之一,腦洞的另一端也許是乙個更有趣的世界。

參考資料

智慧型合約的理念

何謂 抵押品 抵押品 的目的是什麼?它怎樣梳理了我們的已有的關係?我認為,尤其是合約的規範化,為我們的關係實現了理想化抵押品的藍圖。多種型別的合同條款,如抵押品,債券,產權界定等等,都可以嵌入在我們執行條款的硬體和軟體中,通過這樣的方式使那些不遵守協議者的違約成本很高,如果需要的話,令人望而卻步的 ...

智慧型合約的公升級

做軟體開發的都知道,沒有完美的 在當前設計的時候由於考慮不完備或者後續需要增加一些新功能,需要對軟體進行迭代公升級。在以太坊的智慧型合約中也存在這種情況,由於功能的完善可能會 公升級 智慧型合約。大家都知道,部署到鏈上的合約 是不可修改的,怎麼實現合約 的 公升級 呢?比如小強就讀某小學二年級,納入...

智慧型合約的安全

智慧型合約的安全問題一直是編寫智慧型合約的關鍵點。多數的智慧型合約都是開源的,原始碼公布更容易被黑客找到攻擊的漏洞。這裡將一些常見的,易犯的錯誤。首先我們先看看下面這段 contract text function transferto address add,uint num public pay...