Skip to content

Latest commit

 

History

History
176 lines (102 loc) · 23.2 KB

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

File metadata and controls

176 lines (102 loc) · 23.2 KB

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

必要な事前準備

以下リンクの前回のハンズオン内容を実行してアカウントの作成、テスト用トークンの取得、各種環境構築等が完了している必要があります。

今回の内容

ハンズオンで使用するアカウントを追加作成

  • multisig ... 後で2 of 3のマルチシグアカウントに変換予定(以下cosigner1, 2, 3の3アカウントの内2個の署名がそろったらこのアカウントのトランザクションを実行できるように今回のハンズオンで後ほど設定予定)
  • cosigner1 ... 後でマルチシグアカウントの連署アカウントに設定予定
  • cosigner2 ... 後でマルチシグアカウントの連署アカウントに設定予定
  • cosigner3 ... 後でマルチシグアカウントの連署アカウントに設定予定

前回作成フォーセットのアドレスと追加作成したアカウントの秘密鍵とアドレスを.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で新たにセットする必要があるもの
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ブロックチェーンではアグリゲートトランザクションという複数のトランザクションを一括で送信することができるトランザクションの種類があります。

このアグリゲートトランザクションには以下のようなトランザクションの種類とパターンがあります。

  • アグリゲートコンプリートトランザクション ... ブロックチェーンネットワークにアナウンスする前に必要な連署が全て揃っている場合に使用するトランザクションの種類
    • 連署不要なパターン
    • 連署が必要なパターン
  • アグリゲートボンデッドトランザクション ... ブロックチェーンネットワークにアナウンスする時点では必要な全ての連署が揃っておらず、別途後から連署が必要なアカウントが連署をブロックチェーンネットワークにアナウンスし、必要な連署が全て揃ったら自動的にトランザクションが実行されるようにするトランザクションの種類

このアグリゲートトランザクションの機能とSymbolブロックチェーンの多様なトランザクションを組み合わせて応用することで、以下のような、実社会でのユースケースをブロックチェーン上で実現可能です。

  • クーポンや給付金の配布ような大規模な複数のトークン送信を一括実行できる
  • 信頼できる第三者を必要とせず、取引当事者間だけで完結する(トークン交換等の)取引を一括実行できる
  • 複数の署名が揃わなければトランザクションが実行不可能なマルチシグアカウントでのトランザクションの実行による組織口座や共有アカウントでの堅牢なセキュリティや引継ぎ等の柔軟なアカウント管理の実現
  • トランザクションの手数料立替アカウントを一連のトランザクションの中に含めて手数料立替アカウントによってトランザクションをアナウンスすることで、ブロックチェーンの手数料として必要な基軸トークンを入手することなくトランザクションを実行できる
  • トークンを発行し、トークンにネームスペース(≒名前)を付与し、トークンにメタデータ(≒各種パラメーターとして、トークンの名前, 説明, トークンのデータが紐づくURL、トークンのデータそれ自体、他にもkey: value形式で付与できる情報ならなんでも)を付与し、トークンを複数の配布先アカウントに配布するといった一連の流れを一括実行できる
  • マルチシグアカウントを作成し、各アカウントにネームスペース(≒名前)を付与し、アカウントにメタデータ(≒各種パラメーターとして、ユーザーのニックネーム、ユーザーの自己紹介文、ユーザーの属性値を必要に応じて暗号化した値等、他にもkey: value形式で付与できる情報ならなんでも)を付与し、マルチシグによる堅牢なセキュリティや引継時等を想定したアカウント譲渡等の柔軟性を持つDID基盤として活用することができる

アグリゲートトランザクションで一括実行されるトランザクションの中身になりうるSymbolの多様なトランザクションはsymbol-sdk v2が提供する型情報を参照することで、どのトランザクションも実装方法を詳細に覚えておらずとも比較的シンプルに直感的に扱えるため、今回のハンズオンでは、それらのトランザクションをアグリゲートトランザクションとしてどのように扱うことができるかを、シンプルなトークンの転送トランザクションを使ってハンズオン形式で試してみましょう!

2-1. アグリゲートコンプリートトランザクション(連署不要なパターン)

まず、単一のアカウントから複数のトランザクション(異なる宛先にトークンを送信するトランザクションが複数含まれるような形で複数のトランザクション)を送信します。

この場合、単一のアカウントからのトークン送信なので、送信元の単一のアカウントの署名のみでトランザクションを送信・実行でき、他のアカウントによる連署は不要です。

2-1_send-aggregate-complete-transaction_transfer_without-cosignatures.tsというファイル名でリンク先のようなコードを書いて、npx ts-node 2-1_send-aggregate-complete-transaction_transfer_without-cosignatures.tsというコマンドを実行してみましょう。

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

一括で実行するトランザクションを配列として指定したアグリゲートトランザクションを定義して、連署が不要な場合はシンプルにそれに対して署名して、ネットワークにアナウンスすることで、アグリゲートコンプリートトランザクションを送信・実行できました。

2-2. アグリゲートコンプリートトランザクション(連署必要なパターン)

次に、複数のアカウントからトークンを送信するトランザクションを送信してみましょう。

この場合、複数のアカウントからのトークン送信なので、それら複数のアカウントの全ての署名が含まれていなければトランザクションを実行できません。トランザクションをネットワークにアナウンスするアカウントの署名と、それ以外のアカウントの連署が必要となります。

ここではネットワークにトランザクションをアナウンスする前に必要な全ての署名と連署を集めた上で、アグリゲートコンプリートトランザクションとして送信する方法を説明します。

2-2_send-aggregate-complete-transaction_transfer_with-cosignatures.tsというファイル名でリンク先のようなコードを書いて、npx ts-node 2-2_send-aggregate-complete-transaction_transfer_with-cosignatures.tsというコマンドを実行してみましょう。

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

一括で実行するトランザクションを配列として指定したアグリゲートトランザクションを定義して、トランザクションをネットワークにアナウンスするアカウントで署名するとともに連署者のアカウントも指定して必要な連署もトランザクションのデータに含めた状態で、トランザクションをネットワークにアナウンスすることで、連署が必要なとアグリゲートトランザクションを事前に連署をブロックチェーンの外で事前に集めてアグリゲートコンプリートトランザクションを送信・実行できました。

2-3. アグリゲートボンデッドトランザクション(連署をブロックチェーンネットワークを通じて連署者のウォレットから連署をネットワークに送信するパターン)

次に、2-2のトランザクションと同様のトランザクションを、必要な連署が揃っていない状態でアナウンスし、その後、ブロックチェーンネットワークを通じて必要な署名を集め、必要な署名が揃ったらそのトランザクションが自動実行されるような形でトランザクションを送信してみましょう。

2-3_send-aggregate-bonded-transaction_transfer.tsというファイル名でリンク先のようなコードを書いて、npx ts-node 2-3_send-aggregate-bonded-transaction_transfer.tsというコマンドを実行してみましょう。

以下のような処理が実行されます。

  1. 送信対象のアグリゲートボンデッドトランザクションのハッシュを指定して担保10XYMをロックして、連署が集まるまでトランザクションを保留状態にするための、ハッシュロックトランザクションが送信されます。
  2. ハッシュロックトランザクションが承認(=Confirmed)された後、アグリゲートボンデッドトランザクションをアナウンスすることができます。
  3. アグリゲートボンデッドトランザクションは、(手数料を負担するアカウントとなる)senderAccountによってネットワークにアナウンスされる前に署名されていますが、それ以外のアカウントによる連署はアナウンス時点では未だ追加されていない状態です。この状態をPartialやAggregateBondedAdded等と呼びます。Unconfirmedの一つ前の状態になることに注意してください。
  4. 連署が必要なアカウントでウォレットを開くと連署要求が届いているので連署を送信します。連署の際には、(正当な理由なく、アカウントの全残高を奪い取るようなアグリゲートボンデッドトランザクションを送りつけるような詐欺も過去にあったため、)連署対象のトランザクションが自分が意図しているものか、慎重に確認しましょう。そういった詐欺的なトランザクションへの対策のため、ウォレットのデフォルト設定ではアグリゲートボンデッドトランザクションへの連署要求は機能としてロックされた状態になっている場合があります。今回のハンズオンでは連署のためにこれら機能をアンロックして頂く必要がありますが、前述の状況を認識の上、連署対象のトランザクションの内容は慎重に確認することをくれぐれもご注意ください。連署が送信されるとCosignatureAddedというイベントが発火します。
  5. 全ての署名が揃うとトランザクションの状態がUnconfirmedになります。以降は通常のトランザクションと同様のトランザクションの状態遷移を経て、Confirmed -> Finalizedになります。

ウォレットで、連署が必要なcosigner1, cosigner2, cosigner3のアカウントを開き、それぞれのアカウントでトランザクションに連署することで、トランザクションの実行に必要な連署がネットワークを通じて集められ、必要な全ての連署が揃ったらトランザクションが自動的に実行されて処理完了となります。

トランザクションが承認されたら、ブロックエクスプローラーでトランザクションの詳細を確認しておきましょう。

このように、ブロックチェーンのネットワークを通じて、取引の当事者の承認を得ることを、連署を集めるという形で実行し、必要な承認が揃ったら対象の取引が実行されるといった仕組みを構築することが可能です。

ビジネスにおける稟議やワークフローと直接結びつくような支払いの実行や情報の記録を、ブロックチェーンネットワークを通じて実現することが可能であることがイメージして頂ければ幸いです。

2-4. アグリゲートボンデッドトランザクション(連署をブロックチェーンネットワークを通じて自分で実装したプログラムから送信するパターン)

2-3のパターンでは、連署をウォレットを通じて送信するパターンを紹介しましたが、ウォレットを通じて連署を送信するのではなく、自分で実装したプログラムから連署を送信することも可能です。

2-4_send-aggregate-bonded-transaction_transfer_and_cosign.tsというファイル名でリンク先のようなコードを書いて、npx ts-node 2-4_send-aggregate-bonded-transaction_transfer_and_cosign.tsというコマンドを実行してみると、2-3のパターンではウォレットから連署を送信した部分も含めて全てプログラムで自動的に実行されるような形が実現可能です。

この場合、自動的な連署を行っても良い場合、自動的な連署を行ってはならない場合(サービスの意図に反して残高を奪われるような連署要求を受けたような場合)を、既存のWeb開発やアプリ開発の枠組みの中で、対象のトランザクションの内容を元に適切に判断するようなチェック処理を実装しておくことが重要です。

2-5. マルチシグアカウントへの変換と連署アカウントの設定

Symbolブロックチェーンの大きな特徴の一つとして、「定められた複数のアカウントの連署が揃わなければトランザクションを実行できないマルチシグアカウント」や「マルチシグアカウントの連署アカウントの追加や削除」といった、ある種のAccount Abstraction的な機能が、ブロックチェーン上にネイティブに実装済で、アグリゲートトランザクションを通じて使用可能であることが挙げられます。

例として、multisigという名前で作成したアカウントをマルチシグアカウントに変換し、cosigner1, cosigner2, cosigner3の3アカウントを連署アカウントとして追加し、トランザクションの実行・連署アカウントの削除(≒追い出し)どちらも3アカウント中2アカウントの署名が揃わなければ実行できないようにするという設定を行います。

言い換えると、multisigというアカウントを(cosigner1, cosigner2, cosigner3の3アカウントを連署アカウントとする)2 of 3のマルチシグアカウントに変換します。

この変換によって、以降はmultisigアカウントの秘密鍵を用いた署名によってmultisigアカウントのトランザクションを実行することはできなくなることに注意してください。

その代わりに例えばcosigner1アカウントによって署名、cosigner2アカウントによって連署されたトランザクション(=連署アカウント3個中2個の署名を含む)を実行することでmultisigアカウントのトランザクションを実行することができるようになります。

マルチシグアカウントへの変換と連署アカウントの設定のトランザクションを送信するには、ウォレットを通じて行うことも、プログラムから行うことも可能です。

このトランザクションの実行にはマルチシグアカウントの署名と、連署アカウントとして追加されるアカウントの連署が必要になります。

ここではアグリゲートコンプリートトランザクションでプログラムから実行する方法を説明します。

2-5_send-aggregate-complete-transaction_multisig-account-modification.tsというファイル名でリンク先のようなコードを書いて、npx ts-node 2-5_send-aggregate-complete-transaction_multisig-account-modification.tsコマンドを実行してみましょう。

トランザクションが承認されたらブロックエクスプローラーやウォレットを確認してみましょう。ブロックエクスプローラーでのトランザクションの詳細や、ウォレットの中の表示や可能な操作が変更されていることが確認できるはずです。

2-6. マルチシグアカウントからのトランザクションの実行(アグリゲートコンプリートトランザクション)

2-5でマルチシグアカウントのセットアップができました。

では実際にマルチシグアカウントからトランザクションを送信してみましょう。

連署人アカウントであるcosigner1で署名し、cosigner2で連署するような構成でアグリゲートコンプリートトランザクションを送信してみましょう。

2-6_send-aggregate-complete-transaction_transfer_from-multisig-account.tsというファイル名でリンク先のようなコードを書いてnpx ts-node 2-6_send-aggregate-complete-transaction_transfer_from-multisig-account.tsというコマンドを実行してみましょう。

トランザクションが承認されたらブロックエクスプローラーやウォレットを確認してみましょう。cosigner1アカウントによる署名、cosigner2アカウントによる連署、送信元アドレスがmultisigアカウントであること等が確認できるはずです。

2-7. マルチシグアカウントからのトランザクションの実行(アグリゲートボンデッドトランザクションの送信とウォレットからの連署送信)

2-6と同様のトランザクションをアグリゲートボンデッドトランザクションで送信し、その後、ウォレットから連署を送信するという形でやってみましょう。

2-7_send-aggregate-bonded-transaction_transfer_from-multisig-account.tsというファイル名でリンク先のようなコードを書いてnpx ts-node 2-7_send-aggregate-bonded-transaction_transfer_from-multisig-account.tsというコマンドを実行してみましょう。

その後、cosigner1アカウントのウォレットを開いてみると、cosigner1ではネットワークにアナウンス前に既に署名しているのでその旨が表示されており、cosigner2アカウントのウォレットを開いてみると、cosigner2アカウントによる連署が要求されていることが示されているでしょう。cosigner2アカウントで連署を送信すると、トランザクションがUnconfirmedになり、その後ブロックに取り込まれるとConfirmedになるという流れになります。

2-8. マルチシグアカウントからのトランザクションの実行(アグリゲートボンデッドトランザクションの送信とプログラムからの連署送信)

2-7と同様のトランザクションを、連署の送信まで含めて全てプログラムから実行する形でやってみましょう。

2-8_send-aggregate-bonded-transaction_transfer_from-multisig-account_and_cosign.tsというファイル名でリンク先のようなコードを書いてnpx ts-node 2-8_send-aggregate-bonded-transaction_transfer_from-multisig-account_and_cosign.tsというコマンドを実行してみましょう。

ウォレットを見ていると、自動的にトランザクションの送信や連署の送信が実行されている様子が見て取れると思います。

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

2回目となるこのハンズオンでは、マルチシグアカウント用に複数のアカウントを追加作成し、symbol-sdk@2を使って、アグリゲートトランザクションの送信や連署の送信をウォレットやプログラムから実行する方法を一緒に体験しました。

説明を簡易的にするために、アグリゲートトランザクションの中身は、単純なトークンの転送トランザクションや、マルチシグアカウントへの変換及び連署アカウントの設定トランザクションといった、ごくシンプルなものになっていますが、アグリゲートトランザクションの中身をSymbolブロックチェーンの多様な機能のトランザクションを組み合わせることと、連署を要求する相手のアカウントを柔軟に設定することで、「誰々がこうしたらこうする」といった実社会の様々なビジネスロジックをSymbolブロックチェーンを用いて柔軟に表現できることを体感して頂けていたら嬉しいです。

3回目となる次回ハンズオンでは、Symbolブロックチェーンの中だけにとどまらず、他のブロックチェーンとの連携を実現する際に有用な機能である、Hashed Time Lock Contract(HTLC)を実現するシークレットロックトランザクションとシークレットプルーフトランザクションを用いた、異なるブロックチェーン間のトラストレスなトークンのやり取りを実現する方法を一緒に体験していきたいと思います。

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