その通り!!特別にカタパルトに対応されたnem2-sdkライブラリを使ったコードも見せてあげよう!
残念ですが、生まれ変わると思った方がよさそうです。。。
— XEMBook (@xembook)
そうするとnem-libraryやNEM-SDK等の既存のNEMを操作するライブラリが使えなくなる可能性が高いです。
そこで今回Catapultが実装後にも利用できるライブラリ(nem2-sdk) でコードを書いてみました!
今回も前回同様Vue.js、TypeScriptを用いて実装しています。
Contents
nem2-sdkとは
以前も調査したのにすぐ忘れるのでメモ。
CatapultはNEMの機能を向上させる大型アップデートを指す。
主な機能追加。
・処理速度の向上
・アグリゲートトランザクション
・マルチレベル・マルチシグnem2-sdk、nem2-cliはCataputの機能を利用するためのツール・ライブラリのこと
— まつしん@Railsプログラマ (@matsushin11)
NEMの次期バージョンであるNEM2(Catapult)の機能をJavaScriptで利用するためのライブラリになります。
NEM Libraryを作っている人がNEM2-SDKを作っています。
— Daoka (@DaokaTrade)
NEMをJavascriptで操作するライブラリとしては「nem-library」や「nem-sdk」「nem-api」などいくつかありますが、名前的には「nem2-sdk」は「nem-sdk」の次期バージョンのようですが実際は「nem-library」の後継のような感じです。
実際今回コードを書くと、扱い方が似ていることが良くわかりました。
Catapultについて
NEMの次期バージョンになります。nem2とも呼ばれたりします。
主な機能追加としては「処理速度の向上」「アグリゲートトランザクション」「マルチレベル・マルチシグ」ですが、他にも色々あります。
詳しく知りたい方はこちらの記事を読むととても勉強になるでしょう。
- NEM(ネム)に実装されるカタパルトの詳細【2018年リリース】
- NEMのカタパルトはいつ?カタパルトの特徴と実装予定時期まとめ
- ざっくり分かるNEM2(Catapult)〜アグリゲートトランザクションを知る〜
- ざっくり分かるNEM2(Catapult)〜マルチレベルシグネチャ〜
nem2-sdk利用の実装ポイント
サンプルコードの機能としてはウォレット作成、アカウント情報の取得、XEMの送金の3つになります。
今回実装したコードはこちら。
それぞれサンプルコードの該当の箇所の一部を抜粋して見ました。全てVuexのStoreファイルのメソッドにしているためcommitメソッドが書かれていたりします。
NEMの次期バージョンのNEM2は前述にある通りまだリリースされていません。
なので、サンプルアプリではNEM2を操作するAPIで有志でテスト用に用意されたノードにアクセスしています。
また今回はplanet★箒星さんのノードにアクセスして使わせて頂いています。
ウォレット作成
ウォレット作成のコードです。
1 2 3 4 5 6 7 8 9 10 11 |
async createWallet({ commit }: { commit: any }) { const password = new Password('password'); const wallet = SimpleWallet.create(WALLET_KEY, password, NetworkType.MIJIN_TEST); const encryptedPrivateKey: any = wallet.encryptedPrivateKey; const walletInfo = { address: wallet.address.plain(), privateKey: encryptedPrivateKey.decrypt(password), }; localForage.setItem(WALLET_KEY, walletInfo); commit('setWallet', walletInfo); }, |
ここではウォレットを作成した後にウォレット情報(アドレス・秘密鍵)を localForageを用いてローカル(ブラウザのIndexedDB)に保管しています。
なのでウォレットの作成の実質のコードは「SimpleWallet.create」メソッドのみになります。
XEMの残高取得
XEMの残高取得のコードです。
1 2 3 4 5 6 7 8 9 10 11 12 |
async getBalance({ commit }: { commit: any }, address: string) { const accountHttp = new AccountHttp(API_URL); const mosaicHttp = new MosaicHttp(API_URL); const namespaceHttp = new NamespaceHttp(API_URL); const mosaicService = new MosaicService(accountHttp, mosaicHttp, namespaceHttp); mosaicService.mosaicsAmountViewFromAddress(Address.createFromRawAddress(address)).pipe( mergeMap((_) => _), filter((mo) => mo.fullName() === 'nem:xem'), ).subscribe((data) => { commit('setBalance', data.amount.lower / 10 ** 6); }); }, |
ポイントは「mosaicsAmountViewFromAddress」メソッドを使っている箇所でしょうか。
このメソッドを使うと全てのモザイクを取得できるのですが「filter」を行うことでXEMのみデータを取得するように絞っています。
XEMを送金する
送金のコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
sendXem({ commit }: { commit: any }, payload: any) { const transferTransaction = TransferTransaction.create( Deadline.create(), Address.createFromRawAddress(payload.toAddress), [XEM.createRelative(parseInt(payload.toAmount, 10))], PlainMessage.create(payload.toMessage), NetworkType.MIJIN_TEST, ); const account = Account.createFromPrivateKey(payload.privateKey, NetworkType.MIJIN_TEST); const signedTransaction = account.sign(transferTransaction); const transactionHttp = new TransactionHttp(API_URL); transactionHttp.announce(signedTransaction).subscribe( () => { setTimeout(() => { const statusUrl = `${API_URL}/transaction/${signedTransaction.hash}/status`; axios.get(statusUrl).then( (res) => { if (res.data.group === 'unconfirmed') { commit('setMessage', res.data.status); } else { commit('setError', res.data.status); } }, (err) => { commit('setError', err.toString()); }, ); }, 1000); }, (err) => { commit('setError', err.toString()); }, ); }, |
nem-libraryと比較すると少し処理が増えています。送金トランザクションを作成、署名してから送金の実行をしています。
その後トランザクションの結果がどうなったか再度APIを呼ぶことで確認しています。サンプルコードでは、送金後すぐトランザクションの結果が取得できなかったため1秒後に取得するようにしてみました。
サンプルコードを動作させてみる
開発環境
- Mac OS High Sierra v10.13.6
- node v10.11.0
- yarn v1.9.4
- vue v2.5.16
- typescript v3.0.1
- nem2-sdk v0.10.1
github.ioで動作確認
github.ioにて動かせるようにしているので、まずはこちらにアクセス。
アドレスが表示されればOK。初回アクセス時にウォレットを作成し、新しくアドレス、秘密鍵が発行してローカルにウォレット情報を保管しています。2回目のアクセスなら保管された情報を取得してアドレスを表示。
URLの右端をクリックして、「安全でないスクリプトを読み込む」をクリック。
※セキュリティ的に安全ではないことをするので、今回は特別にします。
テスト用のXEMを入手するためNEM2 faucetにアクセス。
「Address」、「Message(任意)」、「Amount」を入力して送金を実行!
しばらく時間が経った後、ウォレット側をリロードして残高が確認できればOK!
送金フォームに「送信先アドレス」、「送金量」、「メッセージ(任意)」を入力。
送金結果に成功と表示されればOK!
しばらくしてリロードすると残高が減っているのが確認できるはずです。
動作としては以上になります。
まとめ
今回初めてnem2-sdkライブラリを使って実装してみました。nem-libraryで実装するのと多少差異はありますがやはりあまり変わらないように感じました。
次はアグリゲートトランザクションのようなCatapultならではの実装にも挑戦してみたい。
nem-libraryの利用方法はだいたい分かった!でももうすぐNEMってカタパルトと呼ばれる大型アップデートが実装されるのでは・・。