JavaScriptでXRPLのトラストラインの設定&発行したトークンの送金を行う
JavaScriptを用いて、XRPLのトラストラインの設定から、発行したトークンの送金を行う方法について解説します。
※また、この記事の内容は、XRPL道場でも紹介しています。
ゴール
- XRPLのトークンの概念の基礎を理解する
- トラストラインをセットすることができる
- トークンを送金する方法を理解する
前提
このガイド一式では、以下の登場人物が登場する設定で進行します。
- チャーリー(トークン発行者)
- アリス(トークン受領者)
こちらから、あらかじめテストネット用のアカウントを2つ用意して、メモしておいてください。
トラストラインとは?
XRPL(XRP Ledger)のトラストライン機能は、ユーザーが特定の通貨を受け入れる意向を示すためのものです。これは、XRP以外の資産をXRPL上で取り扱うために使用されます。例えば、あるユーザーが別の通貨や発行体のトークンを受け入れる場合、そのユーザーはその通貨に対してトラストラインを設定する必要があります。
トラストライン機能によってユーザーは他のユーザーや発行体が発行した資産を自分のアカウントで保持し、取引することを許可しています。例えば、アリスがチャーリーが発行体のトークンに対してトラストラインを設定することで、トークンをアリスは受け取ることが可能となります。
メリットとしては、受領を許可していないトークンを自身のアドレスに勝手に送金されることを防ぐことでき、ユーザー間の秩序を守ることができます。
トラストラインの設定
スクリプトを作成
以下は、アリスからチャーリーに、トラストラインをセットするスクリプトです。
-
プロジェクトディレクトリに
trust_set.js
という新しいファイルを作成します。 -
以下のコードを
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);
-
charlie_wallet_address_here
には、テストネットのチャーリーのアドレスを入力してください。 -
alice_wallet_seed_here
には、テストネットのアリスのシークレットキーを入力してください。
-
スクリプトの実行
-
コマンドラインで以下のコマンドを実行して、スクリプトを実行します。
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
という機能を用いて、明示的に許可する必要がありますが、当記事では割愛させていただきます。
トークンの送金
スクリプトを作成
以下は、チャーリーからアリスにトークンを送金するスクリプトです。
-
プロジェクトディレクトリに
payment_token.js
という新しいファイルを作成します。 -
以下のコードを
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);
-
charlie_wallet_seed_here
には、テストネットのチャーリーのシークレットキーを入力してください。 -
alice_wallet_address_here
には、テストネットのアリスのアドレスを入力してください。
-
スクリプトの実行
-
コマンドラインで以下のコマンドを実行して、スクリプトを実行します。
node payment_token.js
-
成功すれば、コンソールに以下が表示されます。
{ 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
とは別物となります。
以下コード内のAmount
のissuer
にあえて「トークン発行者のアドレスが必要(チャーリー)」と記載しているのはそのためです。
これ以上、トークンを操作するにはこの辺りの理解が必須となってきますので、別途、IOUとXRPLトークンの説明については以下を参考にしていただくと良いかと思います。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