OP_CHECKSIG是驗證ECDSA簽名的操作碼。如果驗證成功,則返回true,否則返回false。它從堆疊中獲取兩個輸入,一個公共金鑰和一個簽名。另外它將當前事務作為輸入。交易是要簽名的訊息。在ECDSA中,對訊息進行雜湊處理,然後將摘要用於簽名生成和驗證。在OP_CHECKSIG中,摘要演算法計算以下原像的double SHA256:
OP_PUSH_TX
通常OP_CHECKSIG中使用的簽名是鏈外生成的,並在解鎖指令碼中推送到堆疊中。為了獲得當前交易,我們改為在ON CHAIN上生成簽名。使用指令碼實現OP_PUSH_TX演算法,如下所示:
1.推送當前事務(更精確地說是摘要preimage)
2.推送一個虛擬私鑰
3.使用指令碼中的ECDSA簽名演算法,使用事務和步驟1和2中推送的私鑰生成簽名。
4.推入從步驟2中推入的私鑰派生的公鑰
5.OP_CHECKSIG
步驟1、2和4在解鎖指令碼中完成,步驟3和5在鎖定指令碼中完成。如果OP_CHECKSIG返回true,則可以確定在步驟1中推送的事務是當前事務,因為OP_CHECKSIG僅在簽名是針對當前事務時才成功,而不管簽名是如何生成的。
值得注意的是,通常在步驟2中的指令碼在此處公開了通常被保密的私鑰。這不是問題,因為它僅用於驗證交易是否最新,而不是證明比特幣的所有權。實際上,它甚至可以重複使用。
指令碼實施
sCrypt實現OP_PUSH_TX演算法並將其打包在稱為Tx的標準智慧合約中。例如我們使用它來開發一個稱為CheckLockTimeVerify的合約,該合約可確保代幣被鎖定時間,並且在達到成熟時間之前不能花費,類似於OP_CLTV。僅需兩行程式碼(第5行和第7行),就可以獲取當前事務。
OP_PUSH_TX允許檢查智慧合約內部的整個交易,包括所有輸入和輸出。我們可以在智慧合約中對它們進行任意約束。這將為比特幣上的各種智慧合約開闢無限的可能性,我們將演示。
本文是有關比特幣智慧合約可以做什麼以及如何實現它們的系列文章的第一篇。