NEM SymbolのトークンをブラウザJavaScriptだけで作成する方法

chromeブラウザのデベロッパーツールだけでNEM Symbolのトークンを作成してみましょう。

（デスクトップウォレットを使用したトークンの作成方法はこちらがわかりやすいです）
[Symbol(NEM)なら誰でも簡単にGUIでトークンが発行できる](https://medium.com/opening-line/symbol-nem-%E3%81%AA%E3%82%89%E8%AA%B0%E3%81%A7%E3%82%82%E7%B0%A1%E5%8D%98%E3%81%ABgui%E3%81%A7%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%8C%E7%99%BA%E8%A1%8C%E3%81%A7%E3%81%8D%E3%82%8B-254324bf05)


まず、F12キーでchromeブラウザの開発者コンソールを開きます。
コマンドプロンプトに以下のコードを入力してエンターキーを押してください。

```js
(script = document.createElement('script')).src = 'https://xembook.github.io/nem2-browserify/symbol-sdk-pack-0.21.0.js';
document.getElementsByTagName('head')[0].appendChild(script);
```
これは強制的にsymbol-sdkを今開いているHTMLページに埋め込むスクリプトです。~~埋め込む場所はGoogleのホームでもどこでも大丈夫です。~~
現在Googleのトップページはセキュリティが厳しくScriptを埋め込めないことを確認しています。適当にノードにアクセスしてその場所でコンソールを開いてください。例：http://api-01.us-west-2.0.10.0.x.symboldev.network:3000/chain/info

#### 初期設定

```js
nem = require("/node_modules/symbol-sdk");
NODE = 'https://sym-test.opening-line.jp:3001';
GENERATION_HASH = '6C1B92391CCB41C96478471C2634C111D9E989DECD66130C0430B5B8D20117CD';

txHttp = new nem.TransactionHttp(NODE);

alice = nem.Account.generateNewAccount(nem.NetworkType.TEST_NET);
console.log("privateKey:" + alice.privateKey)

"http://faucet-0.10.0.x-01.symboldev.network/?recipient=" + alice.address.plain() +"&amount=200"
```

symbol-sdkのライブラリを読み込んで`nem`で使えるようにします。
アクセスするノードはオープニングラインさんのHTTPS対応ノードを借ります。
今回はSymbolのテストネット上にaliceというアカウントを生成し、そのアカウントからトークンを作成します。
上記スクリプトを実行すると最後にaliceの秘密鍵と蛇口サイトへのリンクが表示されるので、今後作成したトークンを使いたい人は秘密鍵のメモをしてから蛇口サイトへいって200XYMほど入金します。



#### トークン名の定義

```js
NAMESPACE = "xembook";
```
今回はxembookで作成してみます。

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

```js
//ネームスペース作成
namespaceTx = nem.NamespaceRegistrationTransaction.createRootNamespace(
	nem.Deadline.create(),
	NAMESPACE,
	nem.UInt64.fromUint(180000),
	nem.NetworkType.TEST_NET
);

//モザイク作成
//ランダムのnonce値を元にモザイクを作成します。
nonce = nem.MosaicNonce.createRandom();
mosaicDefTx = nem.MosaicDefinitionTransaction.create(
	nem.Deadline.create(),
	nonce,
	nem.MosaicId.createFromNonce(nonce, alice.publicAccount),
	nem.MosaicFlags.create(true, true, true),
	0,
	nem.UInt64.fromUint(0),
	nem.NetworkType.TEST_NET
);

//モザイク変更
mosaicChangeTx = nem.MosaicSupplyChangeTransaction.create(
	nem.Deadline.create(),
	mosaicDefTx.mosaicId,
	nem.MosaicSupplyChangeAction.Increase,
	nem.UInt64.fromUint(1000000),
	nem.NetworkType.TEST_NET
);

//モザイクとネームスペースのリンク
mosaicAliasTx = nem.AliasTransaction.createForMosaic(
	nem.Deadline.create(),
	nem.AliasAction.Link,
	namespaceTx.namespaceId,
	mosaicDefTx.mosaicId,
	nem.NetworkType.TEST_NET
);
```

各メソッドについてリファレンスのリンクを載せておきます。
[NamespaceRegistrationTransaction.createRootNamespace](https://nemtech.github.io/symbol-sdk-typescript-javascript/0.17.5/classes/_model_transaction_namespaceregistrationtransaction_.namespaceregistrationtransaction.html#createrootnamespace)
[MosaicDefinitionTransaction.create](https://nemtech.github.io/symbol-sdk-typescript-javascript/0.17.5/classes/_model_transaction_mosaicdefinitiontransaction_.mosaicdefinitiontransaction.html#create)
[MosaicSupplyChangeTransaction.create](https://nemtech.github.io/symbol-sdk-typescript-javascript/0.17.5/classes/_model_transaction_mosaicsupplychangetransaction_.mosaicsupplychangetransaction.html#create)
[AliasTransaction.createForMosaic](https://nemtech.github.io/symbol-sdk-typescript-javascript/0.17.5/classes/_model_transaction_aliastransaction_.aliastransaction.html#createformosaic)


#### トランザクションの集約

```js
aggregateTx = nem.AggregateTransaction.createComplete(
	nem.Deadline.create(),
	[
		namespaceTx.toAggregate(alice.publicAccount),
		mosaicDefTx.toAggregate(alice.publicAccount),
		mosaicChangeTx.toAggregate(alice.publicAccount),
		mosaicAliasTx.toAggregate(alice.publicAccount),
	],
	nem.NetworkType.TEST_NET,
	[],
	nem.UInt64.fromUint(1000000)
);

```
NEM Symbolでは整合性の取れたトランザクションであれば集約させて1ブロックに詰め込むことができます。整合性が取れていない場合はネットワークへの通知後にステータスがErrorになります。

#### 署名とネットワークへのアナウンス

```js
signedTx = alice.sign(aggregateTx,GENERATION_HASH);

txHttp
.announce(signedTx)
.subscribe(_ => console.log(_), err => console.error(err));

"https://sym-test.opening-line.jp:3001/transactionStatus/" + signedTx.hash
```

出力されたリンクをクリックすると、ステータスが確認できます。

エクスプローラーで確認してみましょう
http://explorer-0.10.0.x-01.symboldev.network/mosaics