Cryptocurrency Research Lab.

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

【RippleAPI】③ Payment

前回はTest Netを使ってテスト用の10,000 XRPを受け取りました。 ledger.hatenablog.com

この入手したXRPを使った支払いをしてみましょう。 あくまでもテスト用のXRPで実際に費用がかかるわけではありませんので色々と試してみるとよいでしょう。

支払先のアドレスも用意しておきましょう。 前回の記事のように『XRP Test Net Faucet - XRP Ledger Dev Portal』ページの『Generate Credentialsb』でアドレスを払い出してもらっても良いですし、 自分でアドレスを自動生成することもできます。ここではアドレスを自動生成してみます。

1. アドレス自動生成

アドレスは以下のようにgenerateAddress()関数を呼び出してつくることができます。 addressとsecretはランダムに生成されますが、インターネット上の台帳(Ledger)にはまだ登録されていないためお金がまったくない状態です。 支払いなどのトランザクションを通じて一定額以上のXRPを受け取ることで、はじめて台帳に登録されます。 ですので、生成してからまだ何のトランザクションも無いアドレスの残高照会しても『Account not found.』と言われてしまいます。

generate.js
const RippleAPI = require('ripple-lib').RippleAPI;
const api = new RippleAPI();

let account = api.generateAddress();
console.log(`address: ${account.address}, secret:${account.secret}`);
実行例
$ node generate.js
address: rsiubD4ozAWngkd43eHJf33f9wyaNKmzdn, secret:s・・・・・・・・・・・・・・

2. 支払い

それでは、テスト用の10,000 XRPを受け取ったアドレスから、新たに作成したアドレスに500 XRPほど支払いを行ってみましょう。 以下の公式ドキュメントを見ると、一つのアドレスには最低20 XRPを入れておく必要があるようです。

https://developers.ripple.com/reserves.html

The current minimum reserve requirement is 20 XRP. (This is the cost of an address that owns no other objects in the ledger.)

payment.js
const RippleAPI = require('ripple-lib').RippleAPI;

const api = new RippleAPI({
//server: 'wss://s1.ripple.com' // Public rippled server
  server: 'wss://s.altnet.rippletest.net:51233' // testnet
});

const instructions = {maxLedgerVersionOffset: 5};

// 送信元
let address = '<アドレス>';
let secret = '<シークレット>';

// 支払先
let addressTo = '<支払い先アドレス>';

(async()=>{
  try {
    await api.connect();

    const payment = {
      source: {
        address: address,
        maxAmount: {
          value: '500.00',
          currency: 'XRP'
        }
      },
      destination: {
        address: addressTo,
        amount: {
          value: '500.00',
          currency: 'XRP'
        }
      }
    };

    let prepared = await api.preparePayment(address, payment, instructions);
    const {signedTransaction} = api.sign(prepared.txJSON, secret);

    let result = await api.submit(signedTransaction);
    console.log(result);

    await api.disconnect();

    console.log('done and disconnected.');

  } catch (e) {
    console.error(e);
  }
})();
実行結果
$ node payment.js
{ resultCode: 'tesSUCCESS',
  resultMessage:
   'The transaction was applied. Only final in a validated ledger.',
  engine_result: 'tesSUCCESS',
 ・
 ・
 ・
参考ページ

以下のページ参考にサンプルを作成しました。 github.com