NEM Libraryを使ってみる(3) ウォレットの管理

NEM Libraryにはウォレットを管理するクラスも用意されています。

Walletの生成

秘密鍵からアドレスを生成する場合はWalletクラスを継承したSimpleWalletクラスを利用します。

let password: Password = new Password("passwordstr");
let privateKey: string = "privatekeyxxxxxxxxxxxxxxxxxxxxxxxx";

let simpleWallet: SimpleWallet = SimpleWallet.createWithPrivateKey("nextem test", password, privateKey);

生成されたSimpleWalletは以下のようなオブジェクトになり、秘密鍵は暗号化されています。

{
    "name":"nextem test",
    "network":104,"
    address": {
        "value":"ND6VJMWYX7CZRPLYXX566DP2Z6O7ZKYG745EV2AX",
        "networkType":104
    },
    "creationDate":"2017-08-26T11:29:37.729",
    "schema":1,
    "encryptedPrivateKey": {
        "encryptedKey":"encryptedxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "iv":"ivxxxxxxxxxxxxxxxxxxxxxxxxx"
    }
}

ちなみに秘密鍵をランダム生成するには、SimpleWalletクラスのcreateメソッドを利用します。

let simpleWallet: SimpleWallet = SimpleWallet.create("random wallet", password);

Walletの利用

公開鍵や秘密鍵を利用するには、openメソッドでAccountクラスを作成して利用します。 秘密鍵はprivateになっているので、秘密鍵を直接操作するのではなく、戻ってくるAccountクラスの各メソッドを利用してトランザクションへの署名や、メッセージの暗号化、復号化を実施します。

let account: Account = simpleWallet.open(password);
account.signTransaction(transaction)

バックアップ

WalletのバックアップはwriteWLTFileメソッドを利用します。 stringが返ってくるので適当に保存します。

let mimetype = 'application/octet-stream';
let url = window.URL.createObjectURL(new Blob([simpleWallet.writeWLTFile()], { 'type': mimetype }));
let a = document.createElement('a');

a.target = '_blank';
a.download = simpleWallet.name + ".wlt";
a.href = url;
a.click();

バックアップからの復元

wltファイルからWalletを復元するには、wltファイルの文字列を抽出した上でreadFromWLTメソッドを利用します。

なお、NanoWalletから出力したwltファイルは形式が異なるようで読み込めませんでした。

let simpleWallet = SimpleWallet.readFromWLT("wltstrxxxxxxxxxxxxxxxxxxxxxxxxxxxx");

このあたり自前で実装するのも面倒なので、WEBサイトなどに導入する際には地味に便利なのではないでしょうか。


※筆者のモチベーション向上のため、以下NEMアドレスへxemなりシットトークンなりの寄付を受け付けています。

NDY4RH-UZ3CZO-Z53O5H-NEXTEM-7UF5X3-MMDGH4-IMAD