在前一篇可以想到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將無效 無需考慮交易的鎖定時間,最近的交易達到區塊後,交易立...