Script
腳本操作“OP_IFDUP”有什麼作用?
根據wiki page,
OP_IFDUP
“如果輸入為真或假”,將複製堆棧的頂部。在我看來,當解釋為布爾值時,一切都是真或假。根據原始碼:
case OP_IFDUP: [...] valtype vch = stacktop(-1); if (CastToBool(vch)) stack.push_back(vch);
這表明維基是不正確的。什麼是更好的措辭方式,以及操作的目的是什麼?
如果頂部堆棧項不是 0 且不是負 0,它會複製頂部堆棧項。我不確定這在哪裡有用。
另一種用途說沒有眾所周知的用途,但我認為 OP_IFDUP 非常漂亮。添加我的回复(多年後)以分享知識,以防其他人看到這篇文章。
考慮以下腳本:
OP_DUP OP_0 <2> OP_WITHIN OP_VERIFY OP_IFDUP OP_NOTIF ... sub program 0 OP_0 OP_ENDIF OP_1SUB OP_IFDUP OP_NOTIF ... sub program 1 OP_0 OP_ENDIF OP_1SUB OP_IFDUP OP_NOTIF ... sub program 2 OP_ENDIF OP_1
這個程序模擬一個開關!
switch(x) { case 0: // program 0 case 1: // program 1 case 2: // program 2 default: assert(0); }
但是也稍微強大一些,因為每個分支的最後一個 OP_0 可以指定是否還應該執行任何未來的分支(如果有一個組共有的邏輯子句,可以用於失敗行為!)。
與使用 OP_IF 和 OP_EQUAL 的更“直截了當”的解決方案相比,每個分支有更多操作碼,當 n = 3 時更多操作碼。此外,在程式碼中將數字推送到堆棧上的需要可以為更大的開關貢獻更多字節.
OP_DUP <0> OP_EQUAL OP_IF OP_DROP ... sub program 0 OP_0 OP_ENDIF OP_DUP <1> OP_EQUAL OP_IF OP_DROP ... sub program 1 OP_0 OP_ENDIF OP_DUP <2> OP_EQUAL OP_IF OP_DROP ... sub program 2 OP_ENDIF OP_1