コンテンツにスキップ

ユーザー間のトークンの送金 | JavaScriptでのXRPL開発初段編

これまでの章で、アリスとボブはチャーリーが発行体となるDOJトークンを受領できる権利(トラストライン)を得ました。

アリスは、すでにチャーリーから1000 DOJほどトークンを受領しているので、試しにアリスからボブに100 DOJを送付してみます。

前提

このガイドでは、以下の登場人物が登場する設定で進行します。

  • チャーリー(トークン発行者)
  • アリス(差出人)
  • ボブ(受取人)

スクリプトを作成

以下は、アリスからボブにDOJトークンを送金するスクリプトです。

  1. プロジェクトディレクトリにpayment_token_ab.jsという新しいファイルを作成します。

  2. 以下のコードをpayment_token_ab.jsに貼り付けます。

    const xrpl = require('xrpl');
    async function paymentTokenAB() {
    // Testnetサーバーに接続します
    const client = new xrpl.Client('wss://s.altnet.rippletest.net:51233');
    await client.connect();
    // アリスのウォレットを設定
    const senderWallet = xrpl.Wallet.fromSecret('alice_wallet_secret_here');
    // ボブのウォレットアドレスを設定
    const recipientWalletAddress = 'bob_wallet_address_here';
    // トークン発行者のウォレットアドレスを設定(チャーリー)
    const issuerWalletAddress = 'charlie_wallet_address_here';
    const currencyCode = 'DOJ'; // トークンの通貨コード
    const amount = '100'; // 送金するトークンの量
    const response = await client.submitAndWait(
    {
    TransactionType: 'Payment', // 支払い
    Account: senderWallet.address, // アリスのアドレス
    Destination: recipientWalletAddress, // ボブのアドレス
    Amount: {
    issuer: issuerWalletAddress, // トークン発行者のアドレス(チャーリー)
    currency: currencyCode, // DOJ
    value: amount, // 100
    },
    },
    { wallet: senderWallet } // アリスのウォレットで認証
    );
    // コンソールに結果を出力します
    console.log('Transaction result:', response);
    // client.disconnect()メソッドを呼び出して、サーバーとの接続を切断します
    client.disconnect();
    }
    paymentTokenAB().catch(console.error);
    1. alice_wallet_secret_hereには、テストネットのアリスのシークレットキーを入力してください。
    2. bob_wallet_address_hereには、テストネットのボブのアドレスを入力してください。
    3. charlie_wallet_address_hereには、テストネットのチャーリーのアドレスを入力してください。

スクリプトの実行

  1. コマンドラインで以下のコマンドを実行して、スクリプトを実行します。

    Terminal window
    node payment_token_ab.js
  2. コンソールの結果を確認してみましょう。

    Terminal window
    {
    id: 14,
    result: {
    Account: 'rQr8KfkCQcpqvFwmRspDoaL36reZhcdaeA', // 差出人のアドレス(アリス)
    Amount: {
    currency: 'DOJ',
    issuer: 'rh8xETfGs1Ktizj9EXZb5QpW4aqk8bWUSU', // トークン発行者のアドレス(チャーリー)
    value: '100'
    },
    DeliverMax: {
    currency: 'DOJ',
    issuer: 'rh8xETfGs1Ktizj9EXZb5QpW4aqk8bWUSU',
    value: '100'
    },
    Destination: 'rDNVaJJSp9iQmHC8YAAwHytnLP9aXEPhDw', // ボブのアドレス
    Fee: '12', // 送金手数料: 12 drops
    Flags: 0,
    LastLedgerSequence: 475731,
    Sequence: 474065,
    SigningPubKey: 'ED2924DBD08E093DD7FC9C35B8DCEBD74CA4C8349D68D7BF566AD6C2533B8BB865',
    TransactionType: 'Payment',
    TxnSignature: '54F6F1198988F0F446B674119D383B73629DB6602B68E740BAE8A68E60F88A9E2D305D7B0113E8906433AB26AFAC32551FB5E2A059E43CD708E71A4281D80007', // ハッシュ値
    ctid: 'C0074241004B0001',
    date: 768405010,
    hash: '9F0350EC836C5A76AF1989FE5591DD3A91AD4345601AEA1187DD67EE7E820732',
    inLedger: 475713,
    ledger_index: 475713, // レジャーインデックス番号
    meta: {
    AffectedNodes: [Array],
    TransactionIndex: 75,
    TransactionResult: 'tecPATH_DRY' // 失敗
    },
    validated: true // 検証済みのトランザクション
    },
    type: 'response'
    }

    このアリスからボブへのPayment Transactionは失敗してしまったようです。

    TransactionResulttecPATH_DRYは送金失敗のステータス(テックコード)です。ここで一度、ステータス(テックコード)について学習してみましょう。

    またテックコードについてはこちらにて一覧を確認できます。

ユーザー間のトークンの送付について

アリスとボブはトラストラインを設定したものの、トークンの送付に失敗しました。

失敗した理由はなぜでしょうか?

まずは、IOUトークンという概念について勉強してみましょう!

トークン送付の仕組み

XRPLでは、基本的にはトークンは発行者を介してのみやりとりが許可されています。なぜなら、XRPLで発行されるトークンは債権だからです。

現実世界の例で考えると、特定のストアが発行したポイントを勝手に他人へ送付できることに違和感があるように、XRPL上でも基本的には第三者間で直接トークンをやりとりできないようになっています。 発行者を介してのみトークンが取引が可能になっているのは、トークン(債券)の信頼と管理を維持するためです。

トークンを送付するには?

XRPLでは前述の通り、トークンは発行者を介してのみやりとりが許可されていますが、発行者アカウントの設定を変更することで、発行者を仲介機関として扱うことができるようになり、発行者以外のユーザー間でのIOUトークンを送付を許可することができます。

この残高の調整機能は、Ripplingと呼び、同一通貨のトラストラインを有する複数のユーザー間でのやり取りを指します。

つまり、このガイドでは、チャーリーのアカウント情報のRipplingを許可する必要があるということです。

許可方法については、次の章で説明します。