Covenants for Bitcoin Script
“In the context of Bitcoin, the most useful definition of covenant is that it’s when the scriptPubKey of a UTXO restricts the scriptPubKey in the output(s) of a tx spending that UTXO.” —Anthony Towns これがまず前提というか、理解しておきたいポイント
it is believed that it is impossible to introduce covenants in Bitcoin as Script does not contain operations that allow reading of the transaction data. The only way to interact with the transaction data is by use of CHECKSIG that verifies a digital signature for a message built from the transaction data.
いまの Bitcoin Script は tx(自分自身) の情報を得ることはできない
つまり、locking Script は自分が spend される条件として、spend する tx がどのようなものであるかは指定できない
spend する条件は決められるが、どのように spend するかは指定できない
covenants はこれを実現する
covenant is that it’s when the scriptPubKey of a UTXO restricts the scriptPubKey in the output(s) of a tx spending that UTXO(再度引用)
How を制限できる
たとえば
どのアドレスにいくら
特定のアドレスにしか引き出せない vault を作成できる
鍵がバレても、自分がコントロールする他のアドレスにしか送れない
鍵を忘れても、timelock すぎたら誰でも spent できる、ただし、自分がコントロールするアドレスにしか送れない
How が制限できない理由
How は UTXO を spend する tx 自身が表現していること
しかし unlocking script に自分自身を含める方法がないらしい
唯一読み取るのは checksig 系
これは sighash に基づいて、 tx のデータから hash を算出する
もちろん script の中に、tx のデータを単にいれることは可能
ただし、それが、本当に tx のデータであることを証明できない
つまり How が満たされていることは unlocking script の中で署名することができない
script に message として tx データを含め、それが本当に tx データであることを証明できればよい
checksigverify に使った署名とpubkey を使って message を検証できればよい
message A に対する署名を使って message B を検証できたということは、message A = message B である
stack の中身を使って署名検証をする op code があればよい
CHECKSIGFROMSTACKVERIFY
これにより、message が tx データであることが証明される
その上で、この massage = tx がどのような構造になっているかを script で制限する
4.1 Recovering Signed Data
stack に message が残る
この message は署名されたデータと同じことが証明されている?だから?
Covenants の危険性