12
Help us understand the problem. What are the problem?

posted at

updated at

Symbolブロックチェーンのテストネットで送金を体験する(2021年12月時点)

ブロックチェーン Symbolのテストネットを使用して、送信トランザクションを作成してみましょう。

Symbolはブロックチェーンに詳しくない他分野のスペシャリストでもローコード/ノーコードでセキュアかつデプロイレスなスマートコントラクトを記述できるブロックチェーンとして日本のエンジニアや研究者からも非常に注目される存在となり、いまでは元イーサリアムのプロトコルの改善提案者がコアチームに参入するなどプラットフォームとしてその可能性を期待されています。

この記事はJavaScriptを使用した体験記事になります。
Pythonをお使いの方は以下の記事をご参考ください。

Javaの方はこちら

必要なもの

インターネット接続環境
Google Chromeブラウザ

使用するツール・ライブラリ

nemtech レポジトリより公開されている symbol-sdk-typescript-javascript を browserify化して使用します。

NGLより提供されるエクスプローラーとフォーセット(蛇口)を使用します。

解説の流れ

  • 開発者コンソール起動とsymbol-sdkの準備
  • 送信用アカウントの作成と準備
  • トランザクション送信
  • 送信確認

開発者コンソール起動とsymbol-sdkの準備

開発者コンソールの起動

Google Chrome ブラウザを起動しF12キーを押して開発者コンソールを開きます。

google のトップページで起動させた場合以下のような画面になります。別の画面が見える場合はコンソールタブをクリックしてください。
現在Googleのトップページはセキュリティが厳しくScriptを埋め込めないことを確認しています。適当にノードにアクセスしてその場所でコンソールを開いてください。例:https://sym-test.opening-line.jp:3001/chain/info

image.png

設定値の定義とライブラリのインポート

コンソールに以下のスクリプトをコピーして貼り付けます。

NODE = window.origin;
GENERATION_HASH = '7FCCD304802016BEBBCD342A332F91FF1F3BB5E902988B352697BE245F48E836';
EPOCH_ADJUSTMENT = 1637848847;

(script = document.createElement('script')).src = 'https://xembook.github.io/nem2-browserify/symbol-sdk-1.0.3.js';
document.getElementsByTagName('head')[0].appendChild(script);

  • NODE
    • 現在開いているページのノードをエンドポイントとします。
  • GENERATION_HASH
    • テストネットの一番最初のブロック生成時に出力されたハッシュ値
  • script
    • browserify化したsymbol-sdkを読み込むスクリプトタグを表示中のページに埋め込みます

スクリーンショット 2020-09-28 23.43.45.png

スクリプトタグが無事に埋め込まれました。
このようにコンソールには最後に実行されたコマンドの結果が出力されるようになっています。

ライブラリのインスタンス生成

symbol-sdkで定義されたfunctionをnem.Xxxxで呼び出せるようにします。

nem = require("/node_modules/symbol-sdk");

送信用アカウントの作成と準備

アカウントの新規作成

alice = nem.Account.generateNewAccount(nem.NetworkType.TEST_NET);

送信準備

パブリックブロックチェーンでは送信のために手数料が必要となりますが、新規作成したばかりのアカウントは手数料分のXYMさえ所有していません。そのため、フォーセット(蛇口)サービスから少しばかりのXYMを入手します。

フォーセットにアクセスするためのURLを作成します。

"https://testnet.symbol.tools/?recipient=" + alice.address.plain() +"&amount=10"

出力されたURLをクリックしてフォーセット画面を表示してください。
デフォルトで送金先が先ほど生成したアカウント、総金額が10XYMでセットされているので、そのままCLAIM!をクリックすれば入金できます。

スクリーンショット 2020-09-28 23.46.52.png

入金確認

以下のスクリプトをコピペして、出力されたURLをクリックします。

"https://testnet.symbol.fyi/accounts/" + alice.address.plain()

スクリーンショット 2020-09-29 0.02.22.png

生成したアカウントに symbol.xymが10入金されていることが確認できます。
フォーセットからの送金後、30秒程度の承認時間が必要です。送金実績の無いアカウントはPublicKeyが0000.... となっています。

トランザクション送信

フォーセットアカウントのアドレス(TDMYLK-CTEVPS-RPTG4U-XW47IQ-PCYNLW-2OVWZM-LGY)に1XYMを送金するトランザクションを作成して、テストネットにアナウンスしてみましょう。

具体的な手順は以下の通りです。

  • トランザクション作成
    • NEM Symbolで定められたフォーマットに従って必要なデータをセットします。
  • 署名
    • トランザクションをシリアライズ化して、アカウントの秘密鍵で署名します。
  • ネットワークへアナウンス
    • 署名されたトランザクションをノードにプッシュしてブロックチェーン上で承認を得ます

トランザクション作成

tx = nem.TransferTransaction.create(
    nem.Deadline.create(EPOCH_ADJUSTMENT),
    nem.Address.createFromRawAddress("TDMYLKCTEVPSRPTG4UXW47IQPCYNLW2OVWZMLGY"), 
    [new nem.Mosaic (new nem.MosaicId('3A8416DB2D53B6C8'),nem.UInt64.fromUint(1000000))],
    nem.PlainMessage.create('Hello Symbol'),
    nem.NetworkType.TEST_NET,
    nem.UInt64.fromUint(100000)
);

使用するfunctionはTransferTransaction.createです。

以下のようにトランザクションが生成されました。

スクリーンショット 2020-09-29 0.08.23.png

署名

生成したトランザクションを署名します。

signedTx = alice.sign(tx, GENERATION_HASH);

このように署名されたデータが確認できます。

スクリーンショット 2020-09-29 0.10.19.png

署名したトランザクションをネットワークにアナウンス

さあ、署名したトランザクションをいよいよブロックチェーンに投入します。

new nem.TransactionHttp(NODE)
    .announce(signedTx)
    .subscribe((x) => console.log(x), (err) => console.error(err));

symbol-sdkはrxjsを利用しているので、アナウンス後にsubscribeで結果を受け取ることができます。

スクリーンショット 2020-09-29 0.12.25.png

"packet 9 was pushed to the network via /transactions" と表示されていれば、データは正しいフォーマットとしてノードに受理されました。

ここで少し注意があります。
ノードによるトランザクションの受理はデータが正しいフォーマットで記述されていたという事実でしかなく、それが整合性の取れたデータであるか、ブロックチェーンに承認されるかどうかの保証は全くありません。
パブリックブロックチェーンは今後膨大なトランザクションをさばく必要があるので、一つ一つのトランザクションにつて妥当性を検証し、承認状態を通知するまでコネクションを維持しているとネットワークリソースが枯渇してしまいます。そのため、NEM Symbolでは別途承認状態を確認する必要があります。

送信確認

送信したトランザクションを確認してみましょう。

  • 送信したトランザクションの承認状態の確認
  • 承認されたトランザクション情報の表示

トランザクション承認状態の確認

console.log(NODE + "/transactionStatus/" + signedTx.hash);

ネットワークに通知したトランザクションの承認状態を確認します。
承認が成功すれば以下の承認結果が確認できるようになります。

スクリーンショット 2020-09-29 0.13.31.png

groupが"unconfirmed"となっている場合はもう少し待ちましょう。
groupが"confirmed"となり、codeが"Success" と表示されていれば承認成功です。

トランザクション承認結果の確認

エクスプローラーでトランザクションの承認結果を確認します。

console.log("https://symbol.fyi/transactions/" + signedTx.hash);

URLが出力されるのでそれぞれリンクをクリックして作成したトランザクションの結果を確認します。

スクリーンショット 2020-09-29 0.16.00.png

送金が確認できました。
次は以下の記事にチャレンジしてみてください。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
12
Help us understand the problem. What are the problem?