NEMのマルチシグを使ったトラストレスな取引

そもそもの仕様を理解していなかったようで、コメントで頂いた指摘を受け修正しました。 (2of2のマルチシグ ⇒ 2of3のマルチシグ)

やっぱりしっかり検証してないとダメですね。(まだしてない


今回は、前々から色々考えて実験したりしていたことと、夜中に突然目覚めて関連することで思いついたことがあったので併せて残しておきます。

真夜中に目覚めて初めに考えたことがマルチシグの活用だなんて、我ながら消耗していますね。

ちなみに、結論から言っておくとあんまり価値のない話なんですが、考えていると結構面白かったので。

まず、Catapultのホワイトペーパーに以下のようなことが実現出来ると書いてありました。

ブロックチェーン上でアセットを取引するための、組み込み型の預託(エスクロー)サービス。トランザクション型コントラクト。

これがあればDEXも簡単に実装出来そうですし、待ち遠しい限りです。

取引所があるだけで、今までただ投げ合っていた純粋に無価値なトークンが、ほぼ無価値なトークンに格上げされます。 まぁほぼ無価値なことに変わりはありませんが、ゼロかゼロでないかは大きな差ですね。

ただ、実際にCatapultがNEMにまでフィードバックされるのはいつでしょう?夏なのか、秋なのか、冬なのか、または。。 まぁいつになるのか分かりませんので、それまでのつなぎのサービスがあっても良いと思います。

ということで、Mosaic交換の肝になる資金のエスクローについて、現状の標準機能でどこまで実装できるのかについて考えてみました。

資金のエスクロー

NEMの標準機能であるマルチシグアドレスを使って実現します。

以下をそれぞれ交換するとします。

  • アドレスA nem:xem
  • アドレスB nextem:nex

資金の移動用に以下アドレスを利用します。

  • アドレスC
  • アドレスD
  • アドレスE ダミーアドレス

リファンド用トランザクションの作成

以下のトランザクションをtimestampを1時間後など未来の時間にして作成します。

  • 「アドレスCからアドレスAへnem:xemを送金」をラップしたマルチシグトランザクションにアドレスBの秘密鍵を使って署名。
  • 「アドレスCからアドレスBへnextem:nexを送金」をラップしたマルチシグトランザクションにアドレスAの秘密鍵を使って署名。

それぞれの署名済みトランザクションをブロードキャストせずにアドレスAとアドレスBで交換します。 交換が終わったら、それぞれ署名に問題ないか事前に検証しておきます。

エスクロー用アドレスの作成

アドレスCを2of2マルチシグアドレス(連署人がアドレスAとアドレスB)に変換します。

以下の指摘の通り、連署人を勝手に外せる2of2ではダメみたいです。

id:mizunashi_rin 2017-06-26 13:41:50 NEMのMultisignature aggregate modification transactionの仕様で、N-of-Nのmultisig構成を組んでいる場合は、N-1の署名(つまりIsserのみ)で連署名者を削除できます。 この様な仕様を盛り込んだ形で、再度事例を具現化した記事を読みたいです♪ feeに関しては、1ヶ月後には1/20になっていると思われます。

誰も秘密鍵を知らないことが既知のダミーアドレスEを連署人に加えた2of3にすることで、連署人の追加削除を禁止します。

アドレスCを2of3マルチシグアドレス(連署人がアドレスAとアドレスBとダミーアドレスE)に変換します。

アドレスCへそれぞれ交換したいMosaicと必要なfeeを入金します。

2of3なのでもう資金はどちらかが勝手に動かすことは出来ません。

また、片方が入金しなかったような場合も、交換した署名済みのトランザクションがあるので、1時間後には自分の資金をリファンドすることが出来ます。

交換処理用アドレスの作成

BTCのようにひとつのトランザクションで同時に複数のアドレス宛に送金出来れば簡単なのですが、NEMではそれぞれへの送金を一つのトランザクションにまとめることが出来ないので、もうワンクッション必要になります。

複数アドレス宛には送れませんが、複数Mosaicを一つのアドレスに送ることは可能なので、それを利用します。

以下のトランザクションを作成します。

  • 「アドレスDからアドレスAへnextem:nexを送金」をラップしたマルチシグトランザクションにアドレスBの秘密鍵を使って署名。
  • 「アドレスDからアドレスBへnem:xemを送金」をラップしたマルチシグトランザクションにアドレスAの秘密鍵を使って署名。

それぞれの署名済みトランザクションをブロードキャストせずにアドレスAとアドレスBで交換します。 交換が終わったら、それぞれ署名に問題ないか事前に検証しておきます。

アドレスDを2of3マルチシグアドレス(連署人がアドレスAとアドレスBとダミーアドレスE)に変換します。

アドレスDへアドレスCからそれぞれのMosaicを同時に送金します。

ブロードキャストせずに交換した署名済みのトランザクションを使って、交換を完了させます。

トラストレス!

問題点と結論

NEMの標準機能だけを使ってDEXを作ろうと思うと、上記署名の交換などをmessageでやり取りすることになると思うので、正直現実的ではないレベルでfeeが必要になります。

messageをシグナリングサーバー代わりにして、WebRTCとかで接続すればP2Pでやり取り出来るのかもしれませんが、なんだか複雑になりそうです。

また、マルチシグアドレスを使うので、これまたfeeが高くなります。2of2マルチシグアドレスを二つ作成するだけで56xemかかり、なんとこれ今千円以上なんですね。。

やはりこれも現実的ではないです。

ということで結論ですが、下手にDecentralizedとか言わずに、素直にWEBサービスを立ち上げればいいんじゃないか、とw

今なんとなく想定しているのは、資金のロックすらせず、取引が成立したら送金トランザクションの署名を集めて、揃ったら残高だけ確認して問題なければブロードキャストするというような、ゆるーいサービスです。

需要あるかな?


※筆者のモチベーション向上のため、以下NEMアドレスへxemなりシットトークンなりの寄付を受け付けています。

NDY4RH-UZ3CZO-Z53O5H-NEXTEM-7UF5X3-MMDGH4-IMAD