ビットコイン開発者が集まるbitcoin-devメーリングリストで昨日おもしろい提案があったので紹介しようと思います。

Bitcoin Vaults (2016)

元々2016年に提案されたアイデアであるBitcoin Vaultsは、すぐに送金する必要がないコインを、送金するのに時間がかかる専用のアドレス(Vault)で管理するセキュリティ面でのアイデアです。

Vaultから引き出す送金処理が完了するのにはVault作成時に設定した一定の時間がかかり、その間であれば作成者が作成時に決められるRecovery Keyを使って送金を無効にし、違う宛先に送金することができます。この場合でも処理の完了には規定の時間がかかるので、万が一Recovery Keyも盗られていても、無限にお互いに送金を無効にし合うことになり、盗難は避けられます。

また、Recovery Keyを使ってバーンすることもでるので、泥棒の期待値は低い、と説明されていました。なお、Recovery Keyを知られていて、かつ「泥棒のインセンティブが資金を得ることではなく、資金を失わせることである場合」や「その状況を利用して恐喝を行う場合」などに関しては効果がなさそうです。

恐喝の例は、繰り返しお互いに相手に一部のコインを送金するトランザクションを発行し、相手に無効にされることなく一定時間が経過すれば交渉成立(送金完了)、というふうな状況です。(交渉成立まで無限に続くかバーンされるので)2016年の提案は"Covenants"を利用するものであったため、新しいオペコードを導入する必要があったため見送られました。

ですが、Recovery Keyをコールドで保管していれば割と有効な対策だと思います。※Covenants…送金先を限定したり分割を防ぐなど、「将来のUTXO」に対して様々な制限を可能にする提案で、数年間議論されている。

Bitcoin Vaults (2019)

今回の提案の画期的なところは、上記の機能をフォークなし、Covenantsなしで実現できるという点にあります。

Covenantsで将来のUTXOの使用に制限をかけるのではなく、事前に署名したトランザクションをいくつか用意することでVaultsの機能を実現できるというものです。鍵となるトランザクション(Vaultからの送金、送金中止と新しいVaultへの入金)の作成時に秘密鍵を消去することでユーザーに選択肢を与えないことでCovenantsのような制限がかかっている状態になります。

ただしCovenantsのような無限の再帰性はないので、膠着状態になったときに最終的にどうするか最初に決める必要があります。トランザクションの流れの場合い分けはこのような感じです:


Vault入金→出金(待たされる)→出金完了
Vault入金→出金(待たされる)→リカバリー(出金阻止・Vault入金)
Vault入金→出金(待たされる)→リカバリー(出金阻止・Vault入金)→出金→…
Vault入金→…→用意された最終のトランザクション実行

事前にトランザクションをたくさん作成するのですが、それをすべて保管しないといけないという点は多少めんどくさい点です。

また、柔軟性はほとんどありません。例えば作成した後にVaultに追加で入金された場合、追加入金分を取り出す術はありません。さらに、無限の再帰性がないため、膠着状態が「期限(=入出金トランザクション数×待ち時間)」を設定する必要があります。(提案者は100年以上にでもできるやんというスタンス)

おわりに

まだメーリスに粗案として提案されて1日程度なので開発者たちのレビュー待ちの段階ですが、Covenantsが導入されていない現時点では「現実的な」提案だと思います。ビットコインのStore of Valueとしての性質が注目されている中で、保管における安全性を増す方法は大歓迎だと思います。