Develop with pleasure!

福岡でCloudとかBlockchainとか。

安全な0-confirmation決済のためのプレコンセンサス「Ansible」

Satoshi's vision conferenceでテラバイトブロックについて発表していたJoannes Vermorelが最近発表したペーパー↓

http://media.lokad.com/bitcoin/ansible-2018-05-05.pdf

BCHを決済手段として利用する場合に(BTCもしかり)ネックになるのが決済のスピードで、通常ペイメントのサービスを提供している会社はトランザクションがブロックに入るのを待つことなく0-confirmationで決済を受け入れていることが多い。もちろん高額なものの場合はその限りではないけど、もしそれで二重使用された場合は決済サービス側がそこを負担するんだろう。

カジュアルに決済に利用するためにも、ブロックにトランザクションが格納されるまで待つというのは避けたいということで、0-confirmationトランザクションの受け入れを安全にするための研究が最近活発になってきており、↑で提案されているAnsibleもその提案の1つ。

Bitcoinのセキュリティモデル

Bitcoinのコンセンサスでは、平均10分で作成されるブロックにトランザクションが入れられることで決済事実がブロックチェーンに記録される。当然チェーンの一時的な分岐が考えられるので、ブロックに入ったからといってそれは確定的な事実ではなく、後続のブロックが続くほど、その事実は確率的に確定される。

これはあくまでブロックに入ったトランザクションについてであって、ブロックに入る前のトランザクションについて制御するコンセンサスは存在しない。コンセンサスによって0-confirmationトランザクションは保護されないので、ブロックに入るまでの間のトランザクションの制御をするプレコンセンサスを導入しようという話を最近よく聞く。

Bitcoin-NGなんかはキーブロックとマイクロブロックに分けて、10分に一度生成されるブロックでマイクロブロックを生成できる公開鍵を選択し、その後10分間、その公開鍵を使ってトランザクションが含まれるマイクロブロックをより短い間隔で沢山つくることで、より短い決済間隔で決済をできるようにしようと提案していたり、その他の提案もこういったBitcoinのコンセンサスの変更を含むのが多いけど、Ansibleは既存のBitcoinのコンセンサスを維持しつつ0-confirmationトランザクションの安全性を確保しようという提案。

タイムスタンプオーソリティとしてのAnsible

トランザクションの二重使用というのは同じインプットを持つ2つのトランザクションを作り、決済用にその1つを使い、マイナーに別の1つをブロックに入れてもらうことで、決済に使用したトランザクションを無効化してしまおうというもの。トランザクションがブロックに入るまでの間を狙った攻撃になる。

二重使用はブロックに入るまで、どちらのトランザクションが先に出来たものか・有効なものなのか判定する術がないので起きる問題だ。つまりどちらのトランザクションが先に出来たのか識別することができれば解決する問題でもある。

Ansibleでは、それを識別するためにタイムスタンプオーソリティの導入を提案している。

中央集権型のタイムスタンプオーソリティ

プレコンセンサスのシグナルを構築するのに簡単な方法が中央集権型のタイムスタンプオーソリティの導入になる。中央のオーソリティはBitcoinネットワークを関しして、各トランザクション毎に一意の高精度なタイムスタンプを発行する。このタイムスタンプには

このオーソリティにアクセスできるマイナーはトランザクションを全てオーバーレイに送るか、対応するタイムスタンプを取得するかする。

こうやって集めたタイムスタンプ付きのトランザクションで、競合するトランザクション(二重使用のトランザクション)が見つかった場合、タイムスタンプの早いトランザクションを正しいトランザクションとして採用し、そのトランザクションをピアに伝播する。

マイナーがオーソリティにアクセスするコストが、マイニングの収益と比較して十分低ければ、マイナーがオーソリティを採用するのは合理的な選択肢になる。

とは言ってもみんな、こういう中央集権的な仕組みを導入するのは抵抗ありますよねということで↓

分散型のタイムスタンプオーソリティ(Ansible)

↑のような中央集権的なオーソリティの導入は単一障害点の導入にもつながるため、P2P型タイムスタンプオーソリティ「Ansible」を提案している。

Ansibleの実体は既存のCompact Blockのようにネットワーク・プロトコルでサポートされるメッセージの一部とされている。

Ansibleは1人のマスターと複数の参加者で構成され、マイナーがブロックにAnsibleメンバーの公開鍵を入れ、そのブロックが10ブロックと60秒経過すると、そのメンバーが有効になり、以下のルールで運用される。

  • Ansibleが有効なノードは、(失効していない)有効なメンバーによって署名された全てのメッセージを中継する。
  • いずれの時点においても、Ansibleのメンバーは、他のメンバーに対して失効の投票を行うことができる。他のメッセージとは異なり、失効のメッセージは常に伝播されるが、メンバー毎に100の異なるメッセージの制限がある。失効は10〜110ブロックまでのブロックで発見されるメンバーの数による多数決で決定される。
  • 失効していないメンバーの内、最も古参が自動的にAnsibleのマスターに選出される。
  • AnsibleのマスターはAnsibleの他の有効なメンバーの利益のため、タイムスタンプオーソリティとして行動する。マスターが真面目にユニークなタイムスタンプの提供に失敗した場合、メンバーは直ちに失効の投票を始める。
  • メンバーはマスターによって発行されたタイムスタンプをP2Pで伝播する。

マスターによって発行されたタイムスタンプは、Ansibleによって発行されたプレコンセンサスシグナルを表す。Ansibleの一員である正直なマイナーには、Ansibleのプレコンセンサスシグナルに照らして二重使用攻撃を解決することが期待されている。

まとめ&所感

↑なようにAnsibleはタイムスタンプオーソリティによるシグナルをプレコンセンサスとして導入することで、トランザクションの順序を決定しようというアプローチを採っている。他にもオーソリティの地理的な分散や、Bitcoinアドレスにジオロケーションを埋め込む提案などもされているので詳細はホワイトペーパーを要チェック。

まだ細かいプロトコルまでは定義されておらず、ペーパー自体もフィードバックを求めるためのものみたい。個人的には、

  • 実際にオーソリティがタイムスタンプを返さなかったり、失効の投票が行われている間のトランザクションの取扱はどうなるのか?
  • Bitcoinのコンセンサスは変更しないということなので、マイナーの一部でもこれに従わない場合、二重使用のリスクは依然として残るのでは?
  • またマイナーがこれに従うインセンティブは?

といった点が気になる。