Script

有什麼方法可以製作一個直到某個區塊#才能使用的 UTXO?

  • October 10, 2018

在比特幣中,每筆交易都有一個nLockTime整數來指定交易可以添加到區塊鏈的最早允許的塊號/時間。此外,每個交易輸入都有一個nSequence整數,理論上可用於更新交易並知道哪個是最新的(儘管此功能目前已禁用)。

但是有沒有辦法廣播一個最終的交易並且可以立即添加到區塊鏈中,但也可以使它的輸出在某個塊數/時間之前不能使用?看起來這將是一個有用的功能。例如,如果我想在我的孫子/孫女 18 歲時提供我的遺產,我認為在比特幣中沒有任何方法可以做到這一點,除非有人持有資金並將其交給他們時間。或者,如果我想給某人零用錢,我可以一次發送資金 3 個月左右,然後他們每週都會出現在兒子/女兒的錢包裡。

**所以,仔細檢查一下,沒有辦法在比特幣中做這樣的事情,是嗎?**允許這樣的交易是否存在任何安全風險?如果真的沒有辦法做到這一點,那麼也許可以將其添加到硬分叉願望清單中。

如果現在沒有辦法用比特幣做到這一點,是不是因為這樣的系統存在嚴重缺陷,可以將 UTXO 添加到區塊鏈中,但還不能使用

我可以想到兩種方式來實現這樣的事情。

  • OP_BLOCKINDEX用和操作碼補充比特幣腳本語言OP_BLOCKTIME,它只是將相應的值壓入堆棧。但是,這些值必須來自花費 UTXO 的區塊,而不是來自包含創建 UTXO 的交易的區塊。這意味著任何帶有這些 OP 程式碼的交易輸出都不能在 0 確認的情況下使用,因為這些 OP 在這種情況下沒有任何意義。(這種方法可能會使情況變得過於復雜)
  • 或者,與nSequence欄位類似,我們可以在每個輸出中添加額外的幾個字節,以表示何時可以使用輸出(塊數/時間)。如果未提供,則可以假定為 0。

不,目前沒有任何方法可以在不使用第三方預言機的情況下執行您所描述的操作。

是的,您也許可以相對較快地做到這一點。已經提出了一個軟分叉來引入OP_CHECKLOCKTIMEVERIFY操作碼(CLTV),我可以說它得到了核心開發團隊的大力支持(但請注意,軟分叉需要礦工支持才能實現)。

正如尼克所說,之前的嘗試被拒絕了,因為他們提議將目前塊的高度或時間推入堆棧,如下所示:

<pubkey>       checksigverify  block           <data>    equalverify
<your pubkey>  compare to sig  current height  1000000   Only spend in block 1,000,000

再次詳細說明尼克所說的,上面的範例交易將在第 1,000,000 塊中有效——但如果有鏈重組,它可能不會包含在新的第 1,000,000 塊中,因此任何依賴於它的交易都將無效。

CLTV 操作碼避免了這兩種方式。首先,它使用來自支出交易的nLockTime值,而不是塊高度或塊頭時間值。由於只有 nLockTime 等於或大於目前塊高度/時間的事務才能包含在塊中,因此這實現了允許在特定時間之前無法使用的 UTXO 的主要目標。

CLTV 做的另一件事是直接檢查值,而不是將數據推送到堆棧。這允許它只實現大於或等於檢查,因此交易總是在指定的高度/時間之後是可花費的。

我的猜測是,引入 CLTV 的軟分叉過程將從 Bitcoin Core 0.11 開始,可能在 2015 年 7 月左右的某個時間。(但是,實際上,核心開發人員不太可能在 CLTV 上花費太多時間,直到 1 月左右發布 0.10,所以不要’不要指望它。)

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