NEM NanoWalletのUtilsをnpmモジュール化する
自分はNEMという暗号通貨が好きで、Javascriptからアドレスを生成したり、トランザクションを発行したりなど色々触って遊んでいました。
NEMはもともとAPIが提供されているので、たいしたスキルを必要とせずにAPIにアクセスすることで簡単に送金が出来たり、素人が何か開発しようとするには非常に敷居の低い暗号通貨です。
その流れでAngular2アプリの開発に興味を持つようになり、Node.jsを調べる内にバックエンドも含めてJavaScriptでなんでも出来てしまうということを知り、今はその辺の勉強も兼ねてNEMのモザイクの交換所でも作ろうかと思っています。
そこで、初めの一歩として、NEMのアドレスを生成したり、トランザクションを発行したり、署名を検証したりする機能を、NanoWalletから移植していきます。
NanoWallet
まずはNanoWalletの構成について整理します。
NanoWalletはNEMのAPIにアクセスすることで、自らサーバを立てることなくNEMのほとんどの機能を使えてしまう優れたアプリケーションです。
AngularJSで作成されていて、実際にトランザクションを発行したり、APIに問い合わせたりする機能の実装は、以下のservices
配下にあります。
今回はその一歩手前で、各種サービスから利用されている以下utils
配下にある機能を、今後自前で開発するサービスなどから簡単に呼び出せるようにしていきます。
今まで.angular-cli.json
のscripts
でそれぞれ読み込んで使っていたのですが、手順をバックエンド側と共通化したいのでnpmモジュール化してみます。
最終的なディレクトリ構成は以下のようになります。
nem-utils │ index.js │ LICENSE │ package.json │ README.md │ └─lib Address.js bip32.js convert.js CryptoHelpers.js helpers.js KeyPair.js nacl-fast.js Network.js nodes.js nty.js Serialization.js sinks.js TransactionTypes.js
リポジトリの作成
git init
で初期化し、git remote add origin
で事前に作成しておいたリモートリポジトリのアドレスを登録。
git pull
で自動生成されたLICENSEとREADME.mdを拾ってきます。
$ mkdir nem-utils $ cd nem-utils $ git init $ git remote add origin https://github.com/tadajamdev/nem-utils.git $ git pull origin master
LICENSEとREADME.mdの中身は適当に作成します。
モジュール作成
ユーティリティ側は極力もとのコードを触らずに、また呼び出し方も同じように呼べるようにという考え方で進めます。
初めに、モジュールの設定をpackage.json
に登録します。
package.json
{ "name": "nem-utils", "version": "0.0.1", "description": "NEM's NanoWallet Utils", "main": "./index.js", "author": { "name": "tadajam", "email": "tadajam.dev@gmail.com" }, "homepage": "https://github.com/tadajamdev/nem-utils", "license": "MIT", "keywords": [ "nem" ], "dependencies": { "crypto-js": "^3.1.9-1" } }
CryptoJSはNanoWalletのソースから拾うのではなく、普通にnpm
でインストールします。
npm install --save crypto-js
lib
配下に各jsファイルを格納して、index.js
ですべてのファイルを読み込みます。
exprts
やらmodule.exports
やらイマイチ理解していないのですが、以下のようにすれば一応動きます。
index.js
exports.Address = require('./lib/Address'); exports.bip32 = require('./lib/bip32'); exports.convert = require('./lib/convert'); exports.CryptoHelpers = require('./lib/CryptoHelpers'); exports.helpers = require('./lib/helpers'); exports.KeyPair = require('./lib/KeyPair'); exports.nacl = require('./lib/nacl-fast'); exports.Network = require('./lib/Network'); exports.nodes = require('./lib/nodes'); exports.nty = require('./lib/nty'); exports.Serialization = require('./lib/Serialization'); exports.sinks = require('./lib/sinks'); exports.TransactionTypes = require('./lib/TransactionTypes');
また、このままだとエラーが出たので、各ユーティリティファイル側を少し修正します。
各ファイルのimport
のところで怒られるので、require
で読み込みます。
また、併せてCryptoJSが必要なファイルでは、同じようにCryptoJSも読み込みます。
/** @module utils/Address */ // import convert from './convert'; // import Network from './Network'; let CryptoJS = require("crypto-js"); let Network = require("./Network"); let convert = require("./convert");
GitHubに公開
git add
でインデックスに追加、git commit
でインデックスに追加されたファイルをコミットし、git push origin master
でリモートリポジトリに反映させます。
$ git add . $ git commit -m "[add]init" $ git push origin master
公開されました。 github.com
npmモジュール公開
npmの公式ページから開発者として登録をします。 www.npmjs.com
以下項目を入力し、登録しました。
- Name
- Public Email
- Username
- Password
npm adduser
でログインし、npm publish
で公開します。
$ npm adduser Username: tadajam Password: Email: (this IS public) tadajam.dev@gmail.com Logged in as tadajam on https://registry.npmjs.org/. $ npm publish
公開されました。 www.npmjs.com
モジュールの利用
Angularのコンポーネントから使用してみます。
まずはインストールします。
$ npm install --save nem-utils
インポートして使用します。
app.component.ts
import { Address, KeyPair, Network } from "nem-utils"; console.log(Address.toAddress(KeyPair.create("").publicKey.toString(), Network.char2Id("N")));
秘密鍵を空文字列で生成した場合のアドレス、NBONKWCOWBZYZB2I5JD3LSDBQVBYHB757WJ2KDEB
が出力されました。
バックエンド側でも同じようにインポートすれば、同じように使えます。
※筆者のモチベーション向上のため、以下NEMアドレスへxemなりシットトークンなりの寄付を受け付けています。
NDY4RH-UZ3CZO-Z53O5H-NEXTEM-7UF5X3-MMDGH4-IMAD