Cryptocurrency Research Lab.

Cryptocurrency関連技術についての調査・研究

【Xpring SDK】①ウォレット作成

f:id:halifax:20190516003016j:plain ※補足 記事内のXpringはrippleXに改称されました。

Rippleリップル社の投資部門であるXpringスプリングが提供しているXpring SDKの使い方について調べました。

以前、本Blogで解説したRippleAPIでは、XRP Ledger上で送金等のトランザクションを行う際に、シークレットと呼ばれる文字列を用いて署名を行うインタフェースが提供されています。

シークレットは、HDウォレット(Hierarchical Deterministic Wallet; 階層的決定性ウォレット)のように『Mnemonicニーモニック』からと呼ばれる12~24個の英単語から秘密鍵を生成する仕組みと互換性がないため、HDウォレットで管理することができず、扱いづらいという課題がありました。

Xpring SDKでは、HDウォレットの仕組みに対応しており、『BIP39』という規約で決められているMnemonicからのウォレット生成や、様々な種類の暗号資産、複数のアドレスを管理するための『BIP44』という規約に基づいた複数のXRPアドレスの扱いが容易になっています。

(a) 新規作成

まずはXpring SDKを用いて新規にウォレットを作成してみましょう。ここでは、Xpring SDKJavaScriptライブラリーを使用することにします。

下例のように、Wallet.generateRandomWallet()関数を呼び出すことによって、ランダムなMnemonicが生成されます。

const { Wallet } = require('xpring-js');

const result = Wallet.generateRandomWallet();
console.log(result);
実行結果例
{
  wallet: Wallet {
    publicKey: '0266B9129836900CE27A17B08F0C11E86D0B979D6E659FC12693DA291111EFC2FF',
    privateKey: '0073B・・・・・'
  },
  mnemonic: 'cousin sentence ・・・・・',
  derivationPath: "m/44'/144'/0'/0/0"
}

生成されたWalletオブジェクトのXRPアドレスを取得するには、getAddress()関数を呼び出します。

上の例では、以下のようにアドレスを取得できます。

const wallet = result.wallet;
wallet.getAddress();
rGJpRuLhSXMf7E2NWst7BLZF98tyUd8HSG

(b) Mnemonicからの生成

Xpring SDKでは、Mnemonicからウォレットを復元してWalletオブジェクトを生成することができます。

『(a) 新規作成』で得られたMnemonicからウォレットが復元できるか試してみましょう。

const { Wallet } = require('xpring-js');

const mnemonic = 'cousin sentence nothing machine artist hand fit curve word vehicle quiz sail';
const wallet = Wallet.generateWalletFromMnemonic(mnemonic);
console.log(wallet);
実行結果例
$ node generateMnemonic.js 
Wallet {
  publicKey: '0266B9129836900CE27A17B08F0C11E86D0B979D6E659FC12693DA291111EFC2FF',
  privateKey: '0073BA1956996A45550AFDB8D6950FFDAE5FAA7B1722785EDA2038E67411C29A91'
}

同じ公開鍵と秘密鍵のWalletオブジェクトが得られました。

Xpring SDKのWallet.generateWalletFromMnemonic()関数の第2引数にderivePathを指定してWalletオブジェクトを生成することもできます。

const { Wallet } = require('xpring-js');

const mnemonic = 'cousin sentence nothing machine artist hand fit curve word vehicle quiz sail';
const wallet0 = Wallet.generateWalletFromMnemonic(mnemonic, "m/44'/144'/0'/0/0");
const wallet1 = Wallet.generateWalletFromMnemonic(mnemonic, "m/44'/144'/0'/0/1");
console.log(wallet0.getAddress());
console.log(wallet1.getAddress());

derivePathを指定することにより、HDウォレットと同様の仕組みで複数のXRPアドレスを扱うことができます。

rGJpRuLhSXMf7E2NWst7BLZF98tyUd8HSG
rKev7AtpjM3UfXYCj7tr2MJD3Rd5fV1AJB

(c) シークレットからのウォレット生成

RippleAPIで使用していたシークレットから、Xpringで使用するWalletオブジェクトを作成することができます。

例として、The Genesis AccountからWalletオブジェクトを取得してみましょう。

プログラム例
const { Wallet } = require('xpring-js');

const genesisSecret = 'snoPBrXtMeMyMHUVTgbuqAfg1SUTb';

const wallet = Wallet.generateWalletFromSeed(genesisSecret);
console.log(wallet.getAddress());
実行結果例
rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh