Skip to content

Latest commit

 

History

History
171 lines (98 loc) · 18.7 KB

symbol-sdk-2-hands-on-3.md

File metadata and controls

171 lines (98 loc) · 18.7 KB

symbol-sdk@2 ハンズオン #3

必要な事前準備

以下リンクの第一回目のハンズオン内容を実行してウォレットのインストール、各種環境構築等が完了している必要があります。

今回の内容

Symbolデスクトップウォレットでハンズオンで使用するテストネットのアカウントを追加作成

  • Alice (on Symbol)
  • Bob (on Symbol)

CanadeブロックチェーンのWebウォレットでAliceとBobと同じ秘密鍵でのアカウント作成

  • Alice (on Canade)
  • Bob (on Canade)

Canadeブロックチェーン関連の情報は以下リンクをご参照ください。

https://github.com/siamreiwa/canade-cbdp-community-test/blob/main/README.MD

AliceとBobのアカウントの秘密鍵とアドレスを.envファイルに追記

以下のPUT_YOUR_PRIVATE_KEY, PUT_YOUR_ADDRESSの箇所は、ご自身のものに置き換えてください。

# symbol-sdk@2 ハンズオン #1でセット済のものをそのまま使えばOK
SYMBOL_TESTNET_PRIVATE_KEY="PUT_YOUR_PRIVATE_KEY"

# symbol-sdk@2 ハンズオン #2でセット済のものをそのまま使えばOK
SYMBOL_TESTNET_ADDRESS="PUT_YOUR_ADDRESS"
SYMBOL_TESTNET_FAUCET_ADDRESS="PUT_YOUR_ADDRESS"
SYMBOL_TESTNET_MULTISIG_PRIVATE_KEY="PUT_YOUR_PRIVATE_KEY"
SYMBOL_TESTNET_MULTISIG_ADDRESS="PUT_YOUR_ADDRESS"
SYMBOL_TESTNET_COSIGNER1_PRIVATE_KEY="PUT_YOUR_PRIVATE_KEY"
SYMBOL_TESTNET_COSIGNER1_ADDRESS="PUT_YOUR_ADDRESS"
SYMBOL_TESTNET_COSIGNER2_PRIVATE_KEY="PUT_YOUR_PRIVATE_KEY"
SYMBOL_TESTNET_COSIGNER2_ADDRESS="PUT_YOUR_ADDRESS"
SYMBOL_TESTNET_COSIGNER3_PRIVATE_KEY="PUT_YOUR_PRIVATE_KEY"
SYMBOL_TESTNET_COSIGNER3_ADDRESS="PUT_YOUR_ADDRESS"

# symbol-sdk@2 ハンズオン #3で新たにセットする必要があるもの
SYMBOL_TESTNET_ALICE_PRIVATE_KEY="PUT_YOUR_PRIVATE_KEY"
SYMBOL_TESTNET_ALICE_ADDRESS="PUT_YOUR_ADDRESS"
SYMBOL_TESTNET_BOB_PRIVATE_KEY="PUT_YOUR_PRIVATE_KEY"
SYMBOL_TESTNET_BOB_ADDRESS="PUT_YOUR_ADDRESS"

HTLC(=Hashed Time Lock Contract)で異なるブロックチェーン間のアトミックスワップを実行可能なシークレットロックトランザクション、シークレットプルーフトランザクションのハンズオン

Symbolブロックチェーンでは、同一ブロックチェーン内でのトラストレスなトークン交換はアグリゲートボンデッドトランザクションで実行可能です。

しかし、別々のブロックチェーンネットワーク間で、トークンをトラストレスに交換する場合、アグリゲートトランザクションは使えません。

そのような場合、HTLC(=Hashed Time Lock Contract)という仕組みを用いることで、異なるブロックチェーン間でもトラストレスなトークン交換が可能であることが知られており、Symbolブロックチェーンでは、同様の機能としてシークレットロックトランザクションシークレットプルーフトランザクションというトランザクションがブロックチェーンにネイティブでビルトインされており、それらのトランザクションを用いることで、異なるブロックチェーン間のトークンのトラストレスな交換のようなアトミックスワップを実現可能です。

今回は、以下のように、Symbolブロックチェーンのテストネットと、(Symbol互換の)Canadeブロックチェーンのテストネットとの間で、以下のようなブロックチェーンをまたいだトラストレスなトークン交換を試してみましょう。

  1. Symbolブロックチェーン上で、Alice -> Bob 100[XYM]のトークン送信
  2. Canadeブロックチェーン上で、Bob -> Alice 100[CDBP]のトークン送信

ハッシュ関連で必要なパッケージをインストール

ハッシュ化で必要なパッケージを以下のようにインストールしておきます。

~/symbol-sdk-hands-on$ npm install js-sha3

3-1. Symbolブロックチェーン上でAliceがBobへ秘密の値のハッシュとトランザクションの有効期限を指定してシークレットロックトランザクションを送信

まず、Symbolブロックチェーン上でAliceがBobへ、秘密の値のハッシュとトランザクションの有効期限を指定してシークレットロックトランザクションを送信します。シークレットトランザクションは、アナウンスされただけだと実際の資金移動は発生せず、保留状態(≒予約状態)となり、後ほど、設定した有効期限よりも前に、ハッシュ値に対応した元の秘密の値がネットワークにアナウンスされた場合のみ、実際に実行されます。

3-1_send-secret-lock-transaction_from-alice_on-symbol.tsというファイル名でリンク先のようなコードを書いて、npx ts-node 3-1_send-secret-lock-transaction_from-alice_on-symbol.tsというコマンドを実行してみましょう。

トランザクションが無事送信できたら、ブロックエクスプローラーでトランザクションの詳細を確認してみるとともにウォレットで対象アカウントの残高を確認してみましょう。

トランザクションから、(secretと表記されている)ハッシュ値と有効期限が確認できると思います。このハッシュ値を次のプロセスで使用します。

3-2. Canadeブロックチェーン上でBobがAliceへ3-1と同じハッシュを指定してシークレットトランザクションを送信

次に、Canadeブロックチェーン上でBobがAliceへ、3-1と同じハッシュを指定してシークレットトランザクションを送信します。ここで重要な点は、3-1と同じハッシュを指定してシークレットロックトランザクションを送信するという点です。

このように両者が同じハッシュを指定してシークレットロックトランザクションを送信しあっておくことで、以降のプロセスで、AliceがBobから受け取る必要がある3-2のトランザクションを、保留状態から実際に実行して受け取るために、Aliceが正しい秘密の値をネットワークにアナウンスすることによって、Bobもネットワークを通じてアナウンスされた正しい秘密の値を知ることができ、BobもBobがAliceから受け取る必要がある3-1のトランザクションを正しい秘密の値をアナウンスして保留状態から実行して受け取ることができます。(AliceがBobからトークンを受け取りたければ正しい秘密の値をネットワークにアナウンスする必要があり、その行為を正しく行う限り、Bobもネットワークを通じて正しい秘密の値を知ることができ、BobもAliceからトークンを受け取るために正しい秘密の値をネットワークにアナウンスすることができるということです。)

もしAliceが正しい秘密の値をネットワークにアナウンスしなかった場合は、AliceはBobからトークンを受け取ることができず、Bobも正しい秘密の値をネットワークを通じて知ることができないので、BobもAliceからトークンを受け取ることができず、結果的にトークン交換が実行されません。

このような形で、Alice <-> Bobの間で、信用可能な第三者の仲介無しに、直接、ブロックチェーンをまたいたトークン交換が両方とも実行されるか、両方とも実行されないか、どちらかの状況を必ず作れるという仕組みが実現できるわけです。

取引の全体像はこのような形ですが、まずここでは、3-2のBob -> Aliceのシークレットトランザクションを以下の通り送信します。

3-2_send-secret-lock-transaction_from-bob_on-canade.tsというファイル名でリンク先のようなコードを書いて、

3-1のトランザクションを実行した際に表示されたハッシュをコピーして、3-2のファイル内のTodo: ハッシュとして直接文字列をハードコードしている箇所を3-1のトランザクションで指定されていたハッシュ(ブロックエクスプローラー等でネットワークを通じて確認可能 ... secretと表記されている)と同じものに置き換える必要があることに注意してください。と書かれた箇所をそのハッシュ値に置き換えて、

npx ts-node 3-2_send-secret-lock-transaction_from-bob_on-canade.tsというコマンドを実行してみましょう。

トランザクションが無事送信できたら、ブロックエクスプローラーでトランザクションの詳細を確認してみましょう。

3-3. Canadeブロックチェーン上でAliceがBobからのトークン送信を受け取るために秘密の値(とハッシュ値)をネットワークにアナウンスするシークレットプルーフトランザクションを送信

3-1, 3-2で双方のトランザクション送信が保留状態(≒予約状態)になったら、まず、それらトランザクション保留状態からアンロックして実行させるために必要な秘密の値を、秘密の値を知っているのはAliceなので、Aliceからネットワークにアナウンスするシークレットプルーフトランザクションを送信します。技術的にはAliceは3-1のAlice -> Bob、3-2のBob -> Aliceのどちらのトランザクションについてもシークレットプルーフトランザクションを送信可能ですが、AliceとしてはBobからのトランザクションを受け取ることがインセンティブ的に重要であるため、3-2のBob -> AliceのCanadeブロックチェーン上でのシークレットプルーフトランザクションを送信してBobからのトークン送信分を回収するのがインセンティブ的に自然です。

3-3_send-secret-proof-transaction_from-alice_on-canade.tsというファイル名でリンク先のようなコードを書いて、

3-1のトランザクションを実行時にコンソールに表示されていた秘密の値(=secretProof)とハッシュ値を、3-3のファイル内の以下コメントの箇所の記述を参考に置き換えて、

// Todo: ハッシュとして直接文字列をハードコードしている箇所を3-1のトランザクションで指定されていたハッシュ(ブロックエクスプローラー等でネットワークを通じて確認可能 ... secretと表記されている)と同じものに置き換える必要があることに注意してください。
// Todo: 秘密の値(=secretProof)として直接文字列をハードコードしている箇所を3-1のトランザクションでランダムに指定してコンソールに表示されていた秘密の値(secretProof)と同じものに置き換える必要があることに注意してください。

npx ts-node 3-3_send-secret-proof-transaction_from-alice_on-canade.tsというコマンドを実行してみましょう。

Aliceとしてはこれで取引を完了することができます。

3-4. Symbolブロックチェーン上でBobがAliceからのトークン送信を受け取るために秘密の値(とハッシュ値)をネットワークにアナウンスするシークレットプルーフトランザクションを送信

3-3のシークレットプルーフトランザクションの送信を、BobがCanadeブロックチェーン上で監視しておくことで、BobがAliceから受け取る必要のある3-1のトランザクションをアンロックするための正しい秘密の値を知ることができます。

Bobがそれをネットワークを通じて知ったら、Bobの方でも、3-1のトランザクションをアンロックするために、正しい秘密の値とハッシュ値を指定したシークレットプルーフトランザクションをSymbolブロックチェーンに送信します。これによって、BobもAliceからのトークン送信を受け取ることができます。

3-4_send-secret-proof-transaction_from-bob_on-symbol.tsというファイル名でリンク先のようなコードを書いて、

3-3のトランザクションのブロックエクスプローラーでネットワークを通じて確認できる情報から、秘密の値(=secretProof, ブロックエクスプローラー上ではproofという表示)とハッシュ値(ブロックエクスプローラー上ではsecretという表示))を、3-4のファイル内の以下コメントの箇所の記述を参考に置き換えて、

// Todo: 3-3のトランザクションのブロックエクスプローラーでネットワークを通じて確認できる情報から、秘密の値(=secretProof, ブロックエクスプローラー上ではproofという表示)とハッシュ値(ブロックエクスプローラー上ではsecretという表示))を置き換えてください。

npx ts-node 3-4_send-secret-proof-transaction_from-bob_on-symbol.tsというコマンドを実行してみましょう。

BobとしてもこれでAliceからのトークン受け取りを完了し、これですべての取引が完了となります。

注意点

上記の解説では、詳細に触れませんでしたが、厳密には、これら一連の流れをトラストレスなトークン交換として、確実に成立させるためには、それぞれのトランザクションの内容が正しく指定されていることを、両者が各ステップで確認し、有効期限や、次のステップに進む前にトランザクションが含まれたブロックがファイナライズされ、覆ることがない状態になっていることも確認する必要があるため、一連の取引が完了するまでに長時間待つ必要があることや、追加の確認手順を行う必要があることにご注意ください。

symbol-sdk@2 ハンズオン #3 まとめ

3回目となるこのハンズオンでは、シークレットロックトランザクション、シークレットプルーフトランザクションを用いて、HTLC(Hashed Time Lock Contract)の仕組みで、SymbolブロックチェーンとCanadeブロックチェーンという異なるブロックチェーンを跨いでトークンのトラストレスな交換を実際に行ってみました。

より厳密には、ファイナライズを待つために今回のハンズオンの枠におさまらないレベルの待ち時間が必要であったり、トランザクションの有効期限はもっと厳密に考慮すべき部分があるものの、異なるブロックチェーン間で、2者間で、トラストレスなトークン交換が可能であることやHTLCの仕組みの勘所のようなものを感じとって頂けていたら幸いです。

今回のハンズオンでは、ハンズオンとして説明をできるだけ簡易的に行うために、Symbol互換チェーンのCanadeブロックチェーンのテストネットがちょうど都合良かったため、Symbolブロックチェーン <-> Canadeブロックチェーン間のトークン交換を扱いましたが、相手先ブロックチェーンはSymbolブロックチェーンに限らず、秘密の値とハッシュとして使用するハッシュアルゴリズムが対応可能で、相手先ブロックチェーン側でHTLCの仕組みが実現できるのであれば、原理的にはどのようなブロックチェーン相手でも応用可能です。

実際にSymbol <-> EVM系チェーン間のアトミックスワップをPoC的にまとめたhttps://github.com/ymuichiro/evm-symbol-swapのような取組をコミュニティの方が進めていたりする等も応用も検討されており、以下のような未来に繋げられる可能性のある、非常に面白い仕組みだと感じています。

  • Symbol上のトークンをEVM系チェーンにアトミックスワップを通じて移し、EVM系チェーンの豊富なDeFiエコシステムにアクセスできるように?
  • 逆にEVM系チェーンのトークンをアトミックスワップを通じてSymbol上に移し、Symbolブロックチェーン側で実社会とのデータ連携等の複雑なロジックやデータを楽に扱えるように?

その他にも、他のブロックチェーンとの連携以外でも、支払いの事前予約&適当なタイミングでの支払い実行といった仕組みを組み合わせることで、顧客の一時的な支払いのための資産を預かることなく、柔軟なタイミングのコントロールや権限のコントロールが可能な決済システムとして、クラウドファンディングのような仕組みでの応用も可能でしょう。

このような形でシークレットロックトランザクションやシークレットプルーフトランザクションの仕組みはうまく活用できると、社会課題の解決の様々な場面で役立てられると思います。

symbol-sdk@2 ハンズオン まとめ

Symbolブロックチェーンのハンズオンとして3回にわたって、(1)シンプルなトランザクション、(2)アグリゲートトランザクション・マルチシグ、(3)シークレットトランザクションについて説明させてもらいました。

どの仕組みも、しかるべきパラメーターを指定して、トランザクションを送信するという形で使用可能という点で、極めてワンパターンでシンプルながら、柔軟な表現力を持っていることを感じとって頂けたら幸いです。

ハッカソン関連イベントとしては、Symbolブロックチェーンのハンズオンはここでいったん切りとさせて頂きますが、来週からは、実際にブロックチェーンを用いたWebアプリを作る上での、Webアプリの開発に焦点をあてたハンズオンを3週連続で開催いたします。

よろしければ次回ハンズオンもぜひご参加ください。皆さまとともにSymbolブロックチェーンを用いたWeb開発の世界を一緒に探求していけることを楽しみにしています!