One-Time VES (別名 アダプター署名)
明日の暗号通貨読書会で輪読する論文「One-Time Verifiably Encrypted Signatures A.K.A. Adaptor Signatures」の予習を兼ねてざっと眼を通したので、そのメモ書きです。
ビットコインは送金に特化したブロックチェーンではありますが(※1)、ビットコインのスクリプト言語を使うと簡単なプログラミングができます。例えば、「ある条件Xを満たすとアリスへ送金できる」であったり、「ある時間(ブロック高)になるまでは送金ができない」というような条件が表現できて、これがいわゆるスマートコントラクトと呼ばれるものです。ビットコインのスクリプト言語はイーサリアムなどと比べるとループ条件や再帰呼び出しがなく、「ブロックチェーン上で表現できること」が限られています(※2)。しかし、限られた表現しかできないビットコインのスクリプト言語でも、レイヤー2のライトニングネットワークやブロックチェーン間のアトミックスワップなどを実現することができ、その代表例がHTLC (Hashed Timelock Contract)とよばれるコントラクトです。参考までにLNで使われているスクリプトを以下に載せておきます(引用元)。
# To remote node with revocation key
OP_DUP OP_HASH160 <RIPEMD160(SHA256(revocationpubkey))> OP_EQUAL
OP_IF
OP_CHECKSIG
OP_ELSE
<remote_htlcpubkey> OP_SWAP OP_SIZE 32 OP_EQUAL
OP_NOTIF
# To local node via HTLC-timeout transaction (timelocked).
OP_DROP 2 OP_SWAP <local_htlcpubkey> 2 OP_CHECKMULTISIG
OP_ELSE
# To remote node with preimage.
OP_HASH160 <RIPEMD160(payment_hash)> OP_EQUALVERIFY
OP_CHECKSIG
OP_ENDIF
OP_ENDIF
さて、このスクリプトは一度実行されると、それがブロックチェーン上に書き込まれます。ということは、みんながスクリプトを書いて実行することで、どんどんブロックチェーンが肥大化していきますよね。またスクリプトが長ければ長いほど、それを実行するための手数料も多くなります。そこで登場したのがScriptless Scriptと呼ばれるスクリプトを使わずにスマートコントラクトを作って実行する方法です。
スクリプトを使わずにどんなコントラクトでも書けるわけではないですが、スクリプトがなくても、ある条件下のコントラクトであれば表現できます。そして、そのために使われる手法の1つが「アダプター署名」と呼ばれるものです。このアダプター署名をVES (Verifiably Encrypted Signatures) と呼ばれる署名へと定義を落とし込み、ある一定の評価をした論文が「One-Time Verifiably Encrypted Signatures A.K.A. Adaptor Signatures」であり、上記リンクの読書会ではこの論文について解説がされます(と思います)。
VESとは
暗号化された署名の生成および非対話的に検証をする手法。もともとBLS署名のために提案された論文ですが、このVESに一度限り(ワンタイム)という特性を加えることでアダプター署名と同じ特性になるのが、One-Time VESの論文の主張です。
One-Time VESとは
信用できる第三者なしで、二者間で公平に署名の交換をする手法。この「公平に署名の交換をする」ことが重要で、特にレイヤー2のライトニングネットワークやDLC、アトミックスワップでは必須な特性です。もともと公平にコインの交換をするためにHTLCを使っていましたが、One-Time VES(別名アダプター署名)を使うことで、HTLCのようなスクリプトなしでの交換ができるようになります。
とりあえず今日はここまでで、明日の読書会の終了後に、おさらいを兼ねて記事を書こうと思います。
※1 もともとブロックチェーンによってビットコインが生まれたわけではなく、個人間送金における二重支払い問題を解決させるために生まれたのがブロックチェーンであり、対象と方法が逆になってるとは思います
※2 ブロックチェーンに書き込むべきもの、そうでないものの議論は多々あります。その対象の一例として、スマートコントラクト自体やオラクル情報があげられます。ここのサイトにも面白い考察があります。