Script

and(older(10),pk(A)) 如果頂層具有延展性,它可以是頂層嗎?編輯:不可延展,是錯誤的

  • November 4, 2020
$ ./miniscript 

and(older(10),pk(A))
X    110.0000000000    37 and_v(v:pk(A),older(10)) and(older(10),pk(A))

and_v(v:pk(A),older(10))
     1 scriptlen=37 maxops=2 type=B safe=yes nonmal=yes dissat=no input=1n output=nonzero miniscript=and_v(v:pk(A),older(10))
<A> OP_CHECKSIGVERIFY 10 OP_CHECKSEQUENCEVERIFY

(最後一行顯示了編譯後的腳本,因為我添加printf("%s", Disassemble(ret->ToScript(COMPILER_CTX)).c_str());到基於命令行的工具輸出中)

AFAICT 沒有說這不能是頂級的(但我可能會遺漏一些東西)。它還說nonmal=yes,這是不可延展的。

在支出檢查中成功執行此腳本所需的見證是[<A_signature>, <any-nonzero>],當然CHECKSEQUENCEVERIFY條件必須通過。將CHECKSIGVERIFY消耗<A_signature>,然後<any-nonzero>將被檢查為堆棧上的唯一項,這表明成功(之後CastToBool()

<any-nonzero>可以就是這樣,任何東西,因此具有延展性。

我錯過了什麼?

OP_CHECKSEQUENCEVERIFY 是重新定義的 OP_NOP 程式碼,因此它不能操作堆棧 - 只能中止或繼續。在您的腳本中,這意味著它將保留10在堆棧上,並且<any-nonzero>在見證中沒有必要(添加一個將違反 CLEANSTACK 標準規則)。

引用自:https://bitcoin.stackexchange.com/questions/99833