【完全保存版】Sygmaを使って、SubstrateからEVMにトークンを送付してみよう!
0 はじめに
今回は「Sygma」を用いて、Substrate系のRococo PhalaからEVM系のGoerliにトークンを送付します。
1 実際にやってみよう
こちらのやり方は、下の記事とほぼ同じです。
異なるのは、どのフォルダで実行するかの第4節の部分だけです。
cd substrate-to-evm-fungible-transfer
yarn run transfer
2 コードを読んでみよう
では、コードを読んでみましょう。
今回は、Substrateから始まるので、主にpolkadot.jsを使用して進んでいきます。
1 Keyringの初期化
まずは、鍵管理システムである、Keyringの初期化を行っています。
このキーリングがSR25519暗号システムをしようしていることがわかります。
SR25519は、Schnorrkelと呼ばれるRustのライブラリを使用して実装されたSchnorr認証のバリエーションです。
なお、「バリエーション」とは、この基本的なSchnorr認証アルゴリズムに改良や拡張を施したものを指します。
2 暗号化関数の初期化待ち
次に、暗号化関数の初期化待ちを行います。
この「cryptoWaitReady関数」を呼び出さないと、一部の暗号化関数が期待通りに動作しない可能性があります。
3 アカウントの生成
次に、「addFromUri」を使用して、ニーモニックからアカウントを生成しています。
なお、今回はテスト用のためこのようなコードになっていますが、ニーモニックフレーズは本来、他の人に絶対に見られないように、厳重に保管する必要がありますのでご注意ください。
4 WebSocketプロバイダの作成
続いて、WebSocketプロバイダを作成しています。
これにより、アプリケーションはノードの状態を問い合わせたり、トランザクションを送信したりできます。
なお、ここではPhala NetworkのSubstrateベースのテストネットワークに接続しています。
5 APIインスタンスの作成
次に、WebSocketプロバイダを用いて、新しいSubstrate APIインスタンスを作成しています。
ちなみに、この辺りの違いとしては、WsProviderとApiPromiseは互いに補完する関係にあります。
WsProviderは通信チャネルを提供し、ApiPromiseはそのチャネル上で操作を実行するための手段を提供します。
6 SubstrateAssetTransferオブジェクトの作成
次に、新しいSubstrateAssetTransferオブジェクトを作成し、初期化しています。
これを使って具体的なアセットの転送操作を行うことになります。
7 transferオブジェクトの作成
上で作成した、SubstrateAssetTransferのオブジェクトを使用して、transferのオブジェクトを作成しています。
8 ガス代の取得
次に、こちらでガス代を取得しています。
9 トランザクションの作成
上のtransferのオブジェクトとガス代を使用して、「buildTransferTransaction」を使用して、トランザクションを作成しています。
10 署名とトランザクションの送付
そして、下の「signAndSend」で署名とブロックチェーンの送付を同時に行っています。
「status」の状況に応じてif分岐を行うのは、Substrate系ではよくあるコードの書き方です。
「status.isInBlock」でブロックに入った時、「status.isFinalized」でファイナライズされた時の動きを記載しています。
3 処理の流れを確認しよう(Substrate側)
では、処理の流れを確認していきましょう。
1 polkadot.jsの設定
下の記事の第4章第1節・3節を行い、polkadot.jsを立ち上げます。
2 処理の実行
では、実際に処理を行ってみましょう。
第1章のように、実行してみましょう。
しばらくすると、今回は「0x7b…b6」というハッシュでファイナライズされました。
3 polkadot.jsでの確認
しばらくすると、polkadot.jsでこのようにイベントを取得できました。
こちらの「350,870」ブロックを見てみましょう。
なお、こちらのハッシュが「0x7bc..」となっており、上の節でファイナライズされたものであることが確認できます。
次に、こちらの「balances.Withdraw」を確認すると、「43vNP..」が実行していることがわかります。
こちらは下のように、今回の送付元アドレスになります。
続いて、「balances.Deposit」を確認すると、「436H4..」となっています。
ここはまだ確証が持てていませんが、こちらが送付を行ったアドレスであると考えています。
※ここは何かありましたら、修正しようと思っています。
つまり、状況としては、このようになります。
※この部分も何かあれば修正します。
4 処理の流れを確認しよう(EVM側)
では、EVM側も確認しましょう。
下のように、ブリッジコントラクト宛に送られていました。
そして、トークンの流れとしては、下のようになります。
「ERC20Handler」コントラクトから送付先として指定したウォレットに送られています。
つまり、全体としては、このようになりました。
今回は以上です。
サポートをしていただけたらすごく嬉しいです😄 いただけたサポートを励みに、これからもコツコツ頑張っていきます😊