實戰位元幣指令碼程式設計(2)困局

2021-10-09 10:53:05 字數 1733 閱讀 7549

在前一篇可以想到3種分割完整指令碼的辦法。

但現實因為要考慮安全因素,位元幣不允許在解鎖指令碼中放入op_add這樣的操作符

也就是下面的形式不允許。

第一段解鎖指令碼(不允許)

op_2

op_3

op_add

第二段鎖定指令碼

op_5

op_equal

op_2和op_3將2和3推入棧中,而op_add對棧進行操作。在位元幣節點裡有設定script_verify_sigpushonly,只允許資料入棧的操作。

// file: validation.cpp line:3464

flags |= script_verify_sigpushonly;

否則會出現下面的錯誤

16: mandatory-script-verify-flag-failed (only non-push operators allowed in signatures)
如果允許解鎖指令碼帶有操作符,那麼下面的解鎖**可以解鎖任意指令碼

op_true

op_return

pushonly屬於一刀切的禁止方式,應該有更好的實現方式。

那麼是否有繞開的方式呢?曾經有一種機制叫做兌換指令碼(redeemscript), 用於將指令碼完全放在解鎖指令碼中,這個機制的名字叫做支付到指令碼(p2sh)

例子如下

const redeem = 'op_add op_5 op_equal'

const redeemscript = script.fromasm(redeem)

const redeemscripthex = redeemscript.tohex()

const redeemscriptbuffer = redeemscript.tobuffer()

const redeemscripthash = hash.sha256ripemd160(redeemscriptbuffer)

const unlock = `op_2 op_3 $`

const lockingscript = `op_hash160 $ op_equal`

製作一段兌換指令碼,比如op_add op_5 op_equal,對這段指令碼的hex進行hash160計算(sha256(ripedmd160()), 將得到的hash填入鎖定指令碼。將hex放入解鎖指令碼。

位元幣節點執行的時候,會先連線解鎖指令碼和鎖定指令碼,計算hex的hash160,看看hex是否等於事先的約定**。如果是,則解釋hex部分組合成兌換指令碼,執行

op_2 op_3 op_add op_5 op_equal
這種兌換指令碼(redeemscript)的方案屬於黑盒,無法從公開在區塊鏈上的鎖定指令碼看出程式的語義。

此方案已經在2023年2月被位元幣禁止。

如果還想廣播這樣的指令碼,位元幣節點會返回

16: bad-txns-vout-p2sh
車到山前,路呢?

柳暗花明,村呢?

享受位元幣帶來的安全自由, 關注使用notesv

位元幣指令碼語言

指令碼是一種簡單的指令碼語言,也是位元幣交易處理的核心。如果你曾經寫過彙編 你會發現這篇文章很容易理解,而且可能是有趣的 否則它可能是特別具挑戰性的。所以請保持專注!指令碼是電腦程式,作為程式設計師,你當然知道程式是什麼。程式接受輸入,執行一段時間,然後返回輸出。程式語言是我們編寫計算機能理解的程式...

位元幣開發知識2(什麼是位元幣挖礦)

位元幣開發知識,位元幣和數字貨幣依賴p2p網路存在,位元幣和數字貨幣只能從特定演算法中產生。如果你想要獲得位元幣和數字貨幣,除了通過交易外,還能夠通過計算憑空變出位元幣 這個計算過程被稱之為 挖礦 以後你聽到有人說,我是幹挖礦的,就別以為人家只是天天蹲煤坑了,那人很有可能是擁有一堆超高配置電腦 自己...

位元幣原始碼研讀二(交易指令碼)

今天接著寫五個全域性靜態常量,用於定義交易執行序列的規則.1 static const uint32 t sequence final oxffffffff 如果交易中的所有輸入都將nsequence賦值為該全域性變數值,nlocktime將無效 無需考慮交易的鎖定時間,最近的交易達到區塊後,交易立...