XRP Ledgerで独自トークンを作成してみよう
XRP Ledgerのトークンについて
XRP Ledgerでは代替性トークン(Fungible Token)と非代替性トークン(NFT, Non Fungible Token)の2種類をネイティブに取り扱うことができます。本記事では代替性トークンについて取り扱います。
NFTについてはこちらの記事をどうぞ!
機能
代替性トークンで利用可能な機能の一部として次のようなものがあります。
これら全ては スマートトランザクタ (コントラクトの記述なしに、プロトコルネイティブに利用可能)です。
利用例
このトークン機能には、次のような利用例が存在します。
- ステーブルコイン
- プロジェクトトークン
- コミュニティクレジット
- AMMのLP Token(流動性トークン)(AMMは執筆時点では開発中の機能です。)
トラストライン
XRP Ledgerには不要なトークンを他者に保有させることはできないという強い原則を実現させるために、トラストラインという仕組みが存在します。
この仕組みは2つのアカウントの双方向の関係から成り立ち、一方のアカウントが他方のアカウントが発行するトークンをトラストすることを表し、その残高(一方がプラス、他方がマイナス)は債務の関係も表します。
アカウントはトラストラインが設定されていないトークンを保有することは出来ませんし、設定されていないアカウントへ他者が配布することも出来ません。(XRP LedgerのネイティブトークンであるXRPにはトラストラインの設定は必要なく、誰もが自由に保有/送金できます。)
対象
本記事ではテストネット上でトークンをアカウントに対して転送し、特定トークンの保有者とその残高を確認するまでを取り扱います。
今回はXRP LedgerのJavaScript/TypeScriptライブラリであるxrpl.jsを使用します。
Javascript以外にもPythonなどの他の言語のライブラリも存在します。
チェックしてみてください。
0. テストネット用のアカウントを取得する。
以下のサイトからテストネット用のアカウントを2つ取得してください。
1. トークン情報を決定する。
以下の情報でトークンを作成します。
- 発行アカウント: 取得したアカウントの内1つ
- トークン名: TST
2. 発行アカウントの設定
前述の通り、他者が発行したトークンを保有するためにはトラストラインが必要です。
発行者以外の2つのアカウント間でトークンを送付する場合、2アカウント間で直接トークンをやりとりするのではなく、発行者を通じてトークンがやりとりされます。これは2アカウントそれぞれと発行者間の債務の残高を調整することで送付の仕組みが実現されています。
この残高の調整機能はRipplingと呼ばれ、発行者以外のアカウントでも動作させることが可能であり、暗黙のうちに利用されることを防ぐため、デフォルトではオフとなっています。
そのため、トークンのユーザ間での送付を許可するためには、発行者アカウントでRipplingをオンに設定する必要があります。
AccountSetトランザクションのSetFlagフィールドを使用してDefaultRippleフラグを有効化します。
import { AccountSetAsfFlags, Client, Wallet } from 'xrpl'
const client = new Client('wss://testnet.xrpl-labs.com')
const issuerWallet = Wallet.fromSecret('sEd****************************')
await client.connect()
await client.submitAndWait({
TransactionType: 'AccountSet',
Account: issuerWallet.address,
SetFlag: AccountSetAsfFlags.asfDefaultRipple,
}, { wallet: issuerWallet })
Flagが設定されたことを確認します。
const response = await client.request<AccountInfoRequest,AccountInfoResponse>({
command: 'account_info',
account: issuerWallet.address
})
const flag = response.result.account_data.Flags
console.log('DefaultRippled Flag: ' + ((flag & AccountRootFlags.lsfDefaultRipple) > 0))
3. 受け取りアカウントでトラストラインを設定する
受け取りアカウントで発行者アカウントのTSTトークンを10000TSTを上限にトラストするようにトラストラインを設定します。
TrustSetトランザクションを使用します。
const wallet = Wallet.fromSecret('sEd****************************')
await client.submitAndWait({
TransactionType: 'TrustSet',
Account: wallet.address,
LimitAmount: {
issuer: issuerWallet.address,
currency: 'TST',
value: '10000'
}
},{ wallet })
4. 受け取りアカウントへトークンを送信する
Paymentトランザクションを使用して、発行者アカウントからトークンを送信します。
発行者アカウントはPaymentトランザクションを使用してトークンの発行と転送が同時に行えます。
await client.submitAndWait({
TransactionType: 'Payment',
Account: issuerWallet.address,
Destination: wallet.address,
Amount: {
issuer: issuerWallet.address,
currency: 'TST',
value: '5000'
}
}, { wallet: issuerWallet })
ここでトラストラインの上限額を上回る額を送金しようとした場合、トランザクションは失敗します。
5. トークンの保有者とその残高の一覧を表示する
account_linesメソッドを使用すると、そのアカウントに紐づくトラストラインの一覧が取得できます。
const response = await client.request<AccountLinesRequest, AccountLinesResponse>({
command: 'account_lines',
account: issuerWallet.address,
})
const lines = response.result.lines
console.log(lines)
[
{
account: 'rGNNciFFFiyV4ZuAUk4QizcaYyY4T9Yzft',
balance: '-5000',
currency: 'TST',
limit: '0',
limit_peer: '10000',
no_ripple: false,
no_ripple_peer: false,
quality_in: 0,
quality_out: 0
}
]
balanceフィールドの値がマイナス値となっていますが、これはトークン発行者側からのトラストラインを表示しているためです。
受け取りアカウントで上記のコマンドを実行するとプラスになっていることがわかります。
活用方法
発行したトークンはPaymentやDEXトレード、NFTの売買など様々なユースケースで使用可能です。
執筆時点で開発中の機能であるAMMでも使用可能です。
まとめ
XRP Ledgerではスマートトランザクタ(プロトコルネイティブな機能)なトークン機能が実装されており、Solidityなどの独自言語の習得の必要なしにJavascriptやPythonなどで独自トークンの発行や売買などが可能です。
今回使用したコードは以下のリポジトリからも参照できます。
興味を持たれた方はXRP Ledger開発者のDiscordチャンネルへ是非お越しください!
日本語チャンネルもありますので、英語ができなくても大丈夫です!
Discussion