使用 Miniscript 為什麼不能用 not() 之類的東西來反轉條件?
這個問題是由 Luke Childs (@lukechilds) 在Twitter 上提出的。
在 Miniscript 中是否可以用類似的東西來反轉條件
not()
?你能從本質上創造一個younger()
out ofnot(older())
嗎?例如
or(and(pk(Alice),not(older(12960))),and(pk(Bob),older(12960)))
UTXO 所有權在 90 天后從 Alice 轉移給 Bob。
我看到那行不通,因為 CHECKSEQUENCEVERIFY 不返回布爾值。但是為什麼能夠在某個時間點之後使條件無效或完全改變條件不好呢?
例如 X 只能發生在 N 之前,Y 只能發生在 N 之後
此答案由Twitter 上的 Pieter Wuille (@pwuille) 提供。
從概念上講,它沒有意義,因為腳本條件是單調的。什麼
and(pk(A),not(pk(B)))
意思?“B不簽字”是微不足道的滿足;B 永遠不會打擾簽名。同樣,
not(older(N))
不會的意思younger(N)
。(故意)在腳本中不存在表達比條件更年輕的方法(因為這意味著 tx 會使自身無效)。“not(older(N))” 只是“不證明時間已過 N”,也是微不足道的。例如,Miniscript
l:older(N)
轉換為IF 0 ELSE <N> CHECKSEQUENCEVERIFY
.CSV 和 CLTV 實際上並不觀察時間;他們觀察交易中的 nLocktime/nSequence 欄位。在 Script 中具有對它們進行任意(包括小於、否定、…)語句的能力不會有任何問題。
但是,這可能毫無意義。nSequence 和 nLocktime 欄位本身確實觀察時間,並且只能表示大於約束。比特幣交易有效性應該是單調的:一旦有效,沒有雙花,它們仍然有效。
另一種選擇將是一場後勤噩夢。所有記憶體池交易都需要在每個區塊中重新評估。推理未確認交易的有效性將是一件痛苦的事情(例如,如果您使用一筆交易支付了一筆即將到期的交易的輸出怎麼辦?)