👥

JavaScriptでXRPLのトラストラインの設定&発行したトークンの送金を行う

2024/04/30に公開

JavaScriptを用いて、XRPLのトラストラインの設定から、発行したトークンの送金を行う方法について解説します。

※また、この記事の内容は、XRPL道場でも紹介しています。

ゴール

  • XRPLのトークンの概念の基礎を理解する
  • トラストラインをセットすることができる
  • トークンを送金する方法を理解する

前提

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

  • チャーリー(トークン発行者)
  • アリス(トークン受領者)

こちらから、あらかじめテストネット用のアカウントを2つ用意して、メモしておいてください。

トラストラインとは?

XRPL(XRP Ledger)のトラストライン機能は、ユーザーが特定の通貨を受け入れる意向を示すためのものです。これは、XRP以外の資産をXRPL上で取り扱うために使用されます。例えば、あるユーザーが別の通貨や発行体のトークンを受け入れる場合、そのユーザーはその通貨に対してトラストラインを設定する必要があります。

トラストライン機能によってユーザーは他のユーザーや発行体が発行した資産を自分のアカウントで保持し、取引することを許可しています。例えば、アリスがチャーリーが発行体のトークンに対してトラストラインを設定することで、トークンをアリスは受け取ることが可能となります。

メリットとしては、受領を許可していないトークンを自身のアドレスに勝手に送金されることを防ぐことでき、ユーザー間の秩序を守ることができます。

トラストラインの設定

スクリプトを作成

以下は、アリスからチャーリーに、トラストラインをセットするスクリプトです。

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

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

    const xrpl = require('xrpl');
    
    async function trustSet() {
        // Testnetサーバーに接続します
        const client = new xrpl.Client('wss://s.altnet.rippletest.net:51233');
    
        // client.connect()メソッドを呼び出して、サーバーに接続します
        // awaitを使って、接続が完了するまで待機します
        await client.connect();
    
        // トークン発行者のウォレットを設定(チャーリー)
        const issuerWalletAddress = 'charlie_wallet_address_here';
    
        // トークン受領者のウォレットを設定(アリス)
        const recipientWallet = xrpl.Wallet.fromSeed(
            'alice_wallet_seed_here'
        );
    
        const currencyCode = 'DOJ'; // トークンの通貨コード
        const amount = '10000'; // アリスが受領できるトークンの量の最大値(整数値)
    
        const result = await client.submitAndWait(
        {
            TransactionType: 'TrustSet',
            Account: recipientWallet.address, // アリスのアドレス
            LimitAmount: {
                issuer: issuerWalletAddress, // チャーリーのアドレス(トークン発行者)
                currency: currencyCode, // DOJ
                value: amount, // 10000
            },
        },
        { wallet: recipientWallet } // アリスのウォレットで認証
        );
    
        // コンソールに結果を出力します
        console.log(result);
    
        // client.disconnect()メソッドを呼び出して、サーバーとの接続を切断します
        client.disconnect();
    }
    
    trustSet().catch(console.error);
    
    1. charlie_wallet_address_hereには、テストネットのチャーリーのアドレスを入力してください。
    2. alice_wallet_seed_hereには、テストネットのアリスのシークレットキーを入力してください。

スクリプトの実行

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

    node trust_set.js
    

    成功すれば、コンソールに以下が表示されます。

    {
        id: 8,
        result: {
            Account: 'rusJXJ5ba76K9MBC7RcUyTCJx8XdEBHoi',
            Fee: '12',
            Flags: 0,
            LastLedgerSequence: 265645,
            LimitAmount: {
                currency: 'DOJ',
                issuer: 'rGrnqGxiW4AQd8bCjQrHBhAnTMvLVQe3iL',
                value: '10000'
            },
            Sequence: 265605,
            SigningPubKey: 'EDCA712B8F9BC3E586553FEA9F40395CC7EDE766D42D6EE3D8D0521422F48D0B70',
            TransactionType: 'TrustSet',
            TxnSignature: '7658F96EA716F7AA760B2CCA52F673DBB31AF70F7AB9B45BB6F06DDD180B18EC4E909D3A22B93C5F83116A2D81B6B2244FEF1DE0FF3338452DED7C9208DF8505',
            ctid: 'C0040D9A00000001',
            date: 767754233,
            hash: '3AB395F4D04A56AB59B80BD5A2856C9EF2F8F35D08B5F6AF1546F300872F2826',
            inLedger: 265626,
            ledger_index: 265626,
            meta: {
                AffectedNodes: [Array],
                TransactionIndex: 0,
                TransactionResult: 'tesSUCCESS' // 成功
            },
            validated: true
        },
        type: 'response'
    }
    

    これでチャーリーが発行するトークン(DOJ)をアリスが受け取ることができるようになりました。

次に、トラストラインを設定したトークンを送金する方法を解説します。

XRPLでは、トラストラインを設定したアカウントとユーザー間であれば、即時にトークンを送金することができるようになります。

例えば、アリスからボブ(発行者以外のユーザー間)に送金する場合は、Ripplingという機能を用いて、明示的に許可する必要がありますが、当記事では割愛させていただきます。

トークンの送金

スクリプトを作成

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

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

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

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

スクリプトの実行

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

    node payment_token.js
    
  2. 成功すれば、コンソールに以下が表示されます。

    {
        id: 12,
        result: {
            Account: 'rGrnqGxiW4AQd8bCjQrHBhAnTMvLVQe3iL',
            Amount: {
                currency: 'DOJ', // 通貨コード
                issuer: 'rGrnqGxiW4AQd8bCjQrHBhAnTMvLVQe3iL', // チャーリーのアドレス(発行体)
                value: '10' // 送金額
            },
            DeliverMax: {
                currency: 'DOJ',
                issuer: 'rGrnqGxiW4AQd8bCjQrHBhAnTMvLVQe3iL',
                value: '10'
            },
            Destination: 'rusJXJ5ba76K9MBC7RcUyTCJx8XdEBHoi',
                Fee: '12', // 手数料
                Flags: 0,
                LastLedgerSequence: 266109,
                Sequence: 265602,
                SigningPubKey: 'ED37564C92BE1E835E660907B68F57934E07F94C2443AC70307D9C208CC5433FF7',
                TransactionType: 'Payment',
                TxnSignature: 'BE5AEAED12DC1ABE457B8A1490B96CA53159F8E39CB909D67B4B019C4EF0EA9B55A1B8F64F24F4BB55BDADFF1DCFB42BA519A5D230115F49DEEC1D0ACE893A0A',
                ctid: 'C0040F6B00000001',
                date: 767755690,
                hash: 'DAEED2C83399A39700377C11BABDBAA218E60A5926E012AD8114597538D355C8', // ハッシュ値
                inLedger: 266091,
                ledger_index: 266091,
                meta: {
                AffectedNodes: [Array],
                TransactionIndex: 0,
                TransactionResult: 'tesSUCCESS', // 成功
                delivered_amount: [Object]
            },
            validated: true
        },
        type: 'response'
    }
    

    チャーリーからアリスに無事、チャーリーが発行したDOJトークンを送付することができました。

    エクスプローラーで実際に確認してみましょう!実際に私が送信したアカウントはこちらです。10DOJを保有している状態になっていることが確認できます。

アリスがDOJを発行したらどうなるの?

トラストラインを設定するだけで、結果としてトークンが発行できることは非常にスマートでしたが、ここで疑問は湧いてこないでしょうか?

逆に、ボブがアリスに同様の通貨コードDOJでトラストラインをセットしたとします。

これはアリスが発行したIOUとなり、全く別物となります。
さらにいえば、誰でも通貨コードUSDを発行できることが可能ですが、他者が発行したUSDとは別物となります。

以下コード内のAmountissuerにあえて「トークン発行者のアドレスが必要(チャーリー)」と記載しているのはそのためです。

これ以上、トークンを操作するにはこの辺りの理解が必須となってきますので、別途、IOUとXRPLトークンの説明については以下を参考にしていただくと良いかと思います。IOUなどの仕組みの理解はエンジニアの知識と全く関係がないものとなります。

https://tequ.dev/posts/what-is-iou

const result = await client.submitAndWait(
    {
    TransactionType: 'Payment', // 支払い
    Account: issuerWallet.address, // チャーリーのアドレス(トークン発行者)
    Destination: recipientWallet.address, // アリスのアドレス
    Amount: {
        issuer: issuerWallet.address, // トークン発行者のアドレスが必要(チャーリー)
        currency: currencyCode, // DOJ
        value: amount, // 10
    },
    },
    { wallet: issuerWallet } // チャーリー(トークン発行者)のウォレットで認証
);

まとめ

このように、XRPLではトラストライン機能を利用することで、非常にスマートで安全にトークンを発行することが可能となっています。

このように一般的なWeb開発者や初心者でも簡単にパブリック・ブロックチェーンを利用できることが、XRPLのエコシステムの強みであると思います。

Discussion