NEM NanoWalletのUtilsをnpmモジュール化する

自分はNEMという暗号通貨が好きで、Javascriptからアドレスを生成したり、トランザクションを発行したりなど色々触って遊んでいました。

tadajam.katari.be

NEMはもともとAPIが提供されているので、たいしたスキルを必要とせずにAPIにアクセスすることで簡単に送金が出来たり、素人が何か開発しようとするには非常に敷居の低い暗号通貨です。

その流れでAngular2アプリの開発に興味を持つようになり、Node.jsを調べる内にバックエンドも含めてJavaScriptでなんでも出来てしまうということを知り、今はその辺の勉強も兼ねてNEMのモザイクの交換所でも作ろうかと思っています。

そこで、初めの一歩として、NEMのアドレスを生成したり、トランザクションを発行したり、署名を検証したりする機能を、NanoWalletから移植していきます。

NanoWallet

まずはNanoWalletの構成について整理します。

NanoWalletはNEMのAPIにアクセスすることで、自らサーバを立てることなくNEMのほとんどの機能を使えてしまう優れたアプリケーションです。 AngularJSで作成されていて、実際にトランザクションを発行したり、APIに問い合わせたりする機能の実装は、以下のservices配下にあります。

github.com

今回はその一歩手前で、各種サービスから利用されている以下utils配下にある機能を、今後自前で開発するサービスなどから簡単に呼び出せるようにしていきます。

github.com

今まで.angular-cli.jsonscriptsでそれぞれ読み込んで使っていたのですが、手順をバックエンド側と共通化したいので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

リポジトリの作成

せっかくなのでGitHubリポジトリを作成しておきます。

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