Symbolブロックチェーンのテストネットで送金を体験する（2023年3月時点）

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

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

https://qiita.com/nem_takanobu/items/f3c02caa17ad385b6155

Javaの方はこちら

https://qiita.com/nem_takanobu/items/545a1b7fa98683a4c0da


# 必要なもの
インターネット接続環境
Google Chromeブラウザ

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

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

- [symbol / symbol-sdk-typescript-javascript](https://github.com/symbol/symbol-sdk-typescript-javascript)
    - [xembook / nem2-browserify](https://github.com/xembook/nem2-browserify) / symbol-sdk-2.0.4.js

コアチームより提供されるエクスプローラーとフォーセット（蛇口）を使用します。

- FAUCET
    - https://testnet.symbol.tools/
- エクスプローラー
    - https://symbol.fyi

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

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

### 開発者コンソールの起動

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

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


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29187/63995163-2367-f9d0-3009-1bb8ab960c88.png)



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

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


```js
NODE = window.origin;
GENERATION_HASH = '49D6E1CE276A85B70EAFE52349AACCA389302E7A9754BCF1221E79494FC665A4';
EPOCH_ADJUSTMENT = 1667250467;

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

```

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


![スクリーンショット 2020-09-28 23.43.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29187/44df9d95-cc45-17ed-bd69-93b9562b11b5.png)

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



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

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

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



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

### アカウントの新規作成

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

### 送信準備

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

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

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

```

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

![スクリーンショット 2020-09-28 23.46.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29187/79d231fd-34d4-d151-13fc-60b29709ef91.png)



### 入金確認

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

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

![スクリーンショット 2020-09-29 0.02.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29187/cbf8f851-6940-74c3-e598-afbadacc912f.png)

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

# トランザクション送信

フォーセットアカウントのアドレス(TARDV4-2KTAIZ-EF64EQ-T4NXT7-K55DHW-BEFIXV-JQY)に1XYMを送金するトランザクションを作成して、テストネットにアナウンスしてみましょう。

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

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


### トランザクション作成



```js
tx = nem.TransferTransaction.create(
    nem.Deadline.create(EPOCH_ADJUSTMENT),
    nem.Address.createFromRawAddress("TARDV42KTAIZEF64EQT4NXT7K55DHWBEFIXVJQY"), 
    [new nem.Mosaic (new nem.MosaicId('72C0212E67A08BCE'),nem.UInt64.fromUint(1000000))],
    nem.PlainMessage.create('Hello Symbol'),
    nem.NetworkType.TEST_NET,
    nem.UInt64.fromUint(100000)
);
```

使用するfunctionは[TransferTransaction.create](https://symbol.github.io/symbol-sdk-typescript-javascript/1.0.3/classes/TransferTransaction.html#create)です。

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

![スクリーンショット 2020-09-29 0.08.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29187/8ccc38b3-619d-6649-76ee-1aa28d58bdc7.png)

### 署名

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

```js
signedTx = alice.sign(tx, GENERATION_HASH);
```
このように署名されたデータが確認できます。

![スクリーンショット 2020-09-29 0.10.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29187/4a83ed88-4743-d886-ae56-1ca23dced06a.png)


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

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

```js
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29187/862cdc78-fc1a-f574-3632-c68f3acb079c.png)

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

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

# 送信確認

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

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

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

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

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

![スクリーンショット 2020-09-29 0.13.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29187/c8612d77-a876-3c96-c7a7-e2f6724e79e0.png)

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


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

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

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

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

![スクリーンショット 2020-09-29 0.16.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29187/44bd5fa0-0244-eacf-3d74-a087822ec8cb.png)

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

https://qiita.com/nem_takanobu/items/82fd6dd8faaa98b5d964

https://qiita.com/nem_takanobu/items/661f49b769193f634e0b