比特幣的時間鎖轉賬

比特幣的時間鎖轉賬

5 人贊了文章

閱讀本文前,建議先了解比特幣轉賬、輸入、輸出、P2SH腳本等基本概念。如不了解,可先閱讀我的另一篇文章《比特幣轉賬原理》。

一、Locktime

遺囑需求

我們設想一種需求:父親想立個遺囑,在去世後把自己的BCH留給兒子。我們進一步細分這個需求,可以得出如下兩個子需求:

  • 當父親過世時,兒子可以拿到幣
  • 當父親在世時,父親可以隨時更改遺囑

為了滿足上面的需求,我們可以使用locktime來設置轉賬。

在每個比特幣轉賬的數據里,都有一個locktime欄位。協議規定,只有當前時間大於或等於locktime時間時,這筆轉賬才可以被廣播和打包,否則節點將會丟棄這樣的轉賬。

父親可以生成這樣一筆轉賬:把自己的BCH全部轉到兒子的地址,但locktime設置為自己80歲那一年,然後把這筆轉賬數據發給兒子。兒子就可以在父親80歲以後,把這筆轉賬廣播到網路上,節點檢查locktime小於現在的時間,認為轉賬合法,就會廣播也會被打包。這就滿足了第一個自需求。你可能會問:80歲時父親還在世,或者提前去世了怎麼辦?別急,往後看,父親是可以隨時更改這筆轉賬的。

假設父親想更改遺囑,去世後把一半BCH捐給慈善組織。那麼他可以先做一筆locktime為0的轉賬,把幣轉入一個新地址。因為這筆轉賬locktime為0,所以轉賬有效並被打包進入礦池。這樣原來遺囑中給兒子的轉賬就變得無效了。然後父親再生成兩筆新的轉賬,一筆給慈善組織,另一筆給兒子,locktime都設置為自己80歲那一年。這樣就完成了更改遺囑的目的,滿足了第二個子需求。

因為父親可以隨時更改遺囑,所以為了解決80歲這個去世時間不準的問題,父親可以對遺囑進行定期更新。

關鍵知識

  1. locktime不滿足條件不會被廣播,不會被打包。
  2. 因為沒被打包和廣播(沒進內存池),locktime設置在未來時間的轉賬,可以被雙花而變得無效。
  3. locktime的時間是絕對時間。有兩種表達方式,一種是時間戳,另一種是塊高度。

二、Check Lock Time Verify (CLTV)

鎖倉驗資需求

有一個BCH100群,進群的資格是擁有100個BCH,群主會定期驗資。假設有些人為了能入群,每次驗資時都找別人借100個BCH,借完再還回去。我們希望可以避免這種情況,提出了如下需求:

  • 任何申請人必須把100BCH鎖倉一年才可入群
  • 一年後,如果想繼續留在群里,需要重複上述操作

比特幣腳本中有一個操作碼OP_CHECKLOCKTIMEVERIFY,這個操作碼可以讓一個輸出的幣鎖定到未來某個時間後才可以被花掉。

驗資時我們可以這樣做:入群申請者把100BCH轉到一個P2SH地址,用OP_CHECKLOCKTIMEVERIFY這個操作碼鎖定一年後才可被自己再次使用。待這筆轉賬被打包後,把轉賬ID、贖回腳本和特定消息的簽名發給群主進行驗證。

  • 轉賬ID用於確定這筆轉賬;
  • 贖回腳本用於確認這是一筆包含OP_CHECKLOCKTIMEVERIFY的鎖定腳本,並確認鎖定周期為一年;
  • 特定消息簽名用於證明申請者就是轉賬的發起者。

通過上面的操作,就可以保證申請者在群的一年時間內,是一直持有100BCH的。

關鍵知識

跟locktime不一樣的是:

  1. 包含OP_CHECKLOCKTIMEVERIFY的輸出是會被打包的,但要花這個輸出,需要等待鎖定期。
  2. 因為會被打包,所以不可被雙花,鎖定期便不可更改。

跟locktime一樣的是:

  1. 時間也是絕對時間。同樣有兩種表達方式,一種是時間戳,另一種是塊高度。

三、Sequence和Check Sequence Verify (CSV)

上面的locktime和CLTV都是檢查絕對時間,比如:2020年1月1日0點0分0秒之後幣可以被使用。而sequence和CSV則是檢查相對時間,比如:一年之後幣可用。

sequence是轉賬的輸入中的一個欄位,使用方法類似locktime。CSV是操作碼,使用方法類似CLTV。

參考資料:

  1. 《Mastering Bitcoin 2nd Edition》

    github.com/bitcoinbook/

  2. 《nSequence/nLocktime vs CHECKSEQUENCEVERIFY vs CHECKLOCKTIMEVERIFY》

    reddit.com/r/Bitcoin/co

原文作者:老劉

原文鏈接:比特幣的時間鎖轉賬


推薦閱讀:

轉賬有風險!再過半個月,一批人要哭瞎!
向戀人轉賬15萬,分手後如何要回?

TAG:轉賬 | 比特幣Bitcoin |