XRPLの学習フロー 基礎(2)
XRPレジャーの学習
こちらの記事にてXRPLの学習フローを作成しました。
本記事ではフロー内の基礎部分(パート2)について説明したいと思います。
パートはこちら
本記事で説明する内容
- アカウント
- Payment(XRP)
- トラストライン
- Rippling
- Payment(Token)
アカウント
アドレス
XRPレジャーのアカウントはrf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn
のようなrから始まる25から35文字の文字列のアドレスで表されます。
イーサリアムアドレスとは異なり、(数字「0」、大文字「O」、大文字「I」、小文字「l」を除く)英数字が使用可能であり、デフォルトで大/小文字を区別します。またアドレス内にチェックサムも含んでいます。
rアドレスと呼ばれることもあるこのアドレスはEthereumなどのHEXタイプの公開鍵アドレスから変換することが可能です。
例えばVitalikのアドレスである0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
はraiCBp5jFCDXAuR1mYSMx7VrC7VJ5wDP3W
に変換することができます。
アカウントのオブジェクト
アカウントのデータはAccountRoot
オブジェクトとして表されます。
このオブジェクトにはアカウントの保有するXRPの残高や所有者準備金の計算に使われる保有オブジェクトの総数やメタデータなどが含まれます。
{
"LedgerEntryType": "AccountRoot",
"Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"AccountTxnID": "0D5FB50FA65C9FE1538FD7E398FFFE9D1908DFA4576D8D7A020040686F93C77D",
"Balance": "148446663",
"Flags": 8388608,
"OwnerCount": 3,
"PreviousTxnID": "0D5FB50FA65C9FE1538FD7E398FFFE9D1908DFA4576D8D7A020040686F93C77D",
"PreviousTxnLgrSeq": 14091160,
"Sequence": 336,
"index": "13F1A95D7AAB7108D5CE7EEAF504B2894B8C674E6D68499076441C4837282BF8"
}
トランザクションの送信時には手数料として少額のXRPが消費されるため、ほぼ全てのトランザクションにおいてAccountRoot
オブジェクト(のXRP残高)が変更されます。
AccountRoot
オブジェクトのメタデータはAccountSet
トランザクションを利用することで設定することができます。
Payment(XRP)
XRPレジャーのネイティブトークンであるXRPを送金するにはPaymentトランザクションを利用します。
Paymentトランザクションは以下のようなフォーマットで表されます。(全てのトランザクションに共通であるフィールドはいくつか省略しています。)
{
"TransactionType" : "Payment",
"Account" : "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"Destination" : "ra5nK24KXen9AHvsdFTKHSANinZseWnPcX",
"Amount" : "1000000",
}
特徴的なフィールドはDestination
とAmount
です。
Destination
フィールドは送金先のアドレスを表します。
Amount
フィールドは相手に着金する資産の額を表します。送金量を文字列で指定でXRP(drop建: 1XRP=1,000,000drops)の送金を表します。
トラストライン
トラストライン/RippleStateは2つのアカウント間の債務関係を表すオブジェクトです。
このオブジェクトは片方のアカウントがもう一方のアカウントの指定したトークンをいくつまで保有することができる(限度額)か、そしてその保有残高を表します。
全てのアカウントは送金先アカウントに対してそのアカウントの限度額を超えるようなトークンの送金を行うことはできません。
しかし、DEX取引などを利用したアカウント自身の行動により、その限度額を超えるトークンを受領することは可能です。
RippleStateの値が全てデフォルト値の場合、このオブジェクトは存在しませんが、トラストラインに限度額が設定してあったり、残高が存在する場合はこのオブジェクトが作成され、所有者準備金が適用されることになります。
現在のXRPLエコシステムにおいては一般的にトークンの残高を表すオブジェクトとして認識されています。
Rippling
Ripplingはトラストラインと同様にXRPLのトークン機能の根幹となる機能です。
Ripplingを設定しているトラストラインは、
自身が設定する同一通貨コードの他のトラストラインの残高を減少させ、
その分残高が増加することが許可されます。
最悪の場合、自身が保有する強く信頼できる発行者のトークン残高が減少し、自身が保有するあまり信用できない発行者のトークン残高が増えるということが起き得るようになるのです。
デフォルト値
デフォルトではRipplingは無効化されており、発行者のトークンはアカウント間(not発行者)での送金は行えません。
トークンの発行者はユーザアカウント毎にRipplingの設定を行うことで、アカウントの残高の付け替えが可能となりトークンの送金が行えるようになるのです。
また、
トークンの発行者は保有を希望するアカウント毎にRippling有効化の設定を行う
という作業はあまりにも不便であるため、発行者アカウントのRipplingのデフォルト値を有効へと変更することが可能です。
Rippling機能を利用することで次のようなことが可能になります。
①発行者を介した特定トークンの送金
発行者は自身が発行するトークンのトラストラインにRipplingを設定しておくことでユーザ間のトークンのやり取りを許可することができます。
例) 発行者ABCが発行したJPYトークンの送金
②同一通貨コードかつ別の発行者のトークンの送金
発行者が異なり、同一の通貨コードを持つ2つのトークンを持つアカウントが存在し、そのトラストラインにおいてRipplingを許可している場合、そのアカウントがハブとなるクロスカレンシー送金が可能となります。
例) 送金人はABC.JPYトークンを送金し、受取人はDEF.JPYトークンを受け取る
Payment(Token)
PaymentトランザクションではXRPだけでなく、トークンの送金も行うことができます。
Amountフィールドに文字列を指定した場合はXRPの送金となりますが、Amountフィールドにオブジェクトを指定した場合はトークンの送金となります。
Amountフィールドのオブジェクトにはトークンの発行者、通貨コード、送金額を指定します。
{
"TransactionType" : "Payment",
"Account" : "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"Destination" : "ra5nK24KXen9AHvsdFTKHSANinZseWnPcX",
"Amount" : {
"issuer" : "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"currency" : "USD",
"value" : "1"
},
}
トークンの送金時はDestination
に指定したアカウントがAmount
で指定したトークンのトラストラインを保有し、送金後の残高がトラストラインの限度額を上回らないようにする必要があります。
特殊なケースのため、ここでは詳しくは説明しませんがSendMax
フィールドやDeliverMin
フィールド、PartialPaymentフラグなどを利用し、クロスカレンシー送金や部分支払いなどの高度な支払いを行うことが可能です。
おわりに
基礎のPart2ではアカウントやトラストライン、Paymentについて説明しました。
トラストライン・Rippling機能はXRPLの根幹的機能であり、トークンの送金はもちろんDEXを利用する場合も理解してことが必要です。
Paymentトランザクションは非常にシンプルな機能でありながら、XRPとトークンを同じように扱うことができ、またクロスカレンシー支払いや部分支払いなども行える、XRPLの中でも最も高度な機能の一つです。
興味を持たれた方はXRPL開発者のDiscordチャンネルへ是非お越しください!
日本語チャンネルもありますので、英語ができなくても大丈夫です!
私のTwitterはこちら!
Discussion