XRPLトランザクションのメタデータを学ぶ
XRPレジャー
XRPレジャーはBitcoinやEthereumなどと同じ分散型のパブリックブロックチェーンです。ビットコインの初期コントリビュータを含む3人の開発者により2012年に開発され、PoWやPoSとは異なる独自のコンセンサスアルゴリズムが用いられています。
NFTやDEXなどの機能がプロトコルネイティブに実装されており、他チェーンに比べて安全にこれらの機能を利用することができます。
レジャーオブジェクト
レジャーオブジェクトとは、XRPレジャーのステートを構成するデータのことを指します。
XRPレジャー上の全てのステートはレジャーオブジェクトで表され、トランザクションによってのみ変更されます。
例えば次のようなレジャーオブジェクトが存在します。
-
AccountRoot
: 1アカウントのXRP残高やドメインなどのメタ情報を保持するオブジェクト -
Offer
: オーダーブックに存在する1注文情報を保持するオブジェクト -
NFTokenPage
: アカウントが保有するNFTの情報をページとして保持するオブジェクト
トランザクション
レジャーオブジェクトを変更するための処理です。
トランザクションはレジャーオブジェクトを変更するための処理であり、レジャーオブジェクトの変更はトランザクションによってのみ行われます。
例えば次のようなトランザクションが存在します。
-
Payment
: 1アカウントから別のアカウントへXRP/トークンを送金します。トランザクションによりAccountRoot
やRippleState
などのオブジェクトが変更されることがあります。 -
OfferCreate
: ある通貨ペアに対するDEXの注文を作成します。トランザクションによりOffer
オブジェクトが作成され、クロスする注文が存在した場合は、他のOffer
オブジェクトを変更したり、削除したりします。また、この約定によりXRPの残高を持つAccountRoot
やトークンの残高を持つRippleState
オブジェクトが変更されることがあります。 -
NFTokenMint
:NFTokenPage
を作成し、その中にNFToken
を格納します。既にNFToken
を格納可能なNFTokenPage
が存在する場合、そのNFTokenPage
に変更が発生します。
メタデータ
レジャーにより検証されたトランザクション情報からレジャーオブジェクトがどう変化したかを確認することができます。
例えばDEXへの注文を行なった場合では、既存のオーダーブックの内、どの注文が完全に約定し、どの注文が一部約定したか、またその結果どのアカウントの残高がどのように変化したかなど、変更された全ての情報を確認することができます。
例
以下の例は、OfferCreateトランザクションの実行結果です。
このJSONにはメタデータが含まれており、DeletedNode
フィールドで既存のオファーの約定による削除やModifiedNode
フィールドでトークン残高の変更などが確認できます。
{
"Account": "rogue5HnPRSszD9CWGSUz8UGHMVwSSKF6",
"Fee": "100",
"Flags": 655360,
"LastLedgerSequence": 80089709,
"Memos": [
{
"Memo": {
"MemoData": "77F2D57AC019FAE57B1A6EA64191028DC63624A004897DF13FF0BE3E26D41CFD4023A6CCD70D1F2B40249075ED9148843FF0083126E978D5"
}
}
],
"Sequence": 3346291,
"SigningPubKey": "ED3DC1A8262390DBA0E9926050A7BE377DFCC7937CC94C5F5F24E6BD97D677BA6C",
"TakerGets": {
"currency": "USD",
"issuer": "rhub8VRN55s94qWKDv6jmDy1pUykJzF3wq",
"value": "10.7190344241941"
},
"TakerPays": {
"currency": "USD",
"issuer": "rEn9eRkX25wfGPLysUMAvZ84jAzFNpT5fL",
"value": "10.19717327526322"
},
"TransactionType": "OfferCreate",
"TxnSignature": "46DCD5694D5C8733999C8412AFF921F35685757D5090E5C910E679F679A22D073BED4ED95DAD57EA6A9A6BB5591F4E3FBD7F395CE2543E0C2F0EA672CD76A706",
"date": 738617350,
"hash": "26521749B7D414DB383A765F2F75C0B3798242BB18BF2DE9AFB4B3619D06D1FB",
"inLedger": 80089709,
"ledger_index": 80089709,
"meta": {
"AffectedNodes": [
{
"DeletedNode": {
"FinalFields": {
"ExchangeRate": "55038d7ea4c68000",
"Flags": 0,
"RootIndex": "08AD73D0C85FE555610CD39AC6E4942D4088348B559503A855038D7EA4C68000",
"TakerGetsCurrency": "0000000000000000000000005553440000000000",
"TakerGetsIssuer": "9A5AA43C30E205AC07FB9C0FE7C93A1A412C3C9F",
"TakerPaysCurrency": "0000000000000000000000005553440000000000",
"TakerPaysIssuer": "2ADB0B3959D60A6E6991F729E1918B7163925230"
},
"LedgerEntryType": "DirectoryNode",
"LedgerIndex": "08AD73D0C85FE555610CD39AC6E4942D4088348B559503A855038D7EA4C68000"
}
},
{
"DeletedNode": {
"FinalFields": {
"ExchangeRate": "55039faf41abc000",
"Flags": 0,
"RootIndex": "08AD73D0C85FE555610CD39AC6E4942D4088348B559503A855039FAF41ABC000",
"TakerGetsCurrency": "0000000000000000000000005553440000000000",
"TakerGetsIssuer": "9A5AA43C30E205AC07FB9C0FE7C93A1A412C3C9F",
"TakerPaysCurrency": "0000000000000000000000005553440000000000",
"TakerPaysIssuer": "2ADB0B3959D60A6E6991F729E1918B7163925230"
},
"LedgerEntryType": "DirectoryNode",
"LedgerIndex": "08AD73D0C85FE555610CD39AC6E4942D4088348B559503A855039FAF41ABC000"
}
},
{
"DeletedNode": {
"FinalFields": {
"Account": "rfcoGE3E59UcwJ7LUHmbRjGR5rWA8VQScB",
"BookDirectory": "08AD73D0C85FE555610CD39AC6E4942D4088348B559503A855038D7EA4C68000",
"BookNode": "0",
"Flags": 131072,
"OwnerNode": "0",
"PreviousTxnID": "42A4E8E1271DE3CF53070E30ECCDF035D727DD773984EBC07818C8E2F38875B1",
"PreviousTxnLgrSeq": 79686699,
"Sequence": 79477622,
"TakerGets": {
"currency": "USD",
"issuer": "rEn9eRkX25wfGPLysUMAvZ84jAzFNpT5fL",
"value": "0.448202696103"
},
"TakerPays": {
"currency": "USD",
"issuer": "rhub8VRN55s94qWKDv6jmDy1pUykJzF3wq",
"value": "0.448202696103"
}
},
"LedgerEntryType": "Offer",
"LedgerIndex": "0A56627A7561BEE84C860CF30CA2AB714102F257273C85A133EF6985CACA0B43"
}
},
{
"ModifiedNode": {
"FinalFields": {
"Balance": {
"currency": "USD",
"issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
"value": "0"
},
"Flags": 1114112,
"HighLimit": {
"currency": "USD",
"issuer": "rhub8VRN55s94qWKDv6jmDy1pUykJzF3wq",
"value": "0"
},
"HighNode": "26",
"LowLimit": {
"currency": "USD",
"issuer": "rogue5HnPRSszD9CWGSUz8UGHMVwSSKF6",
"value": "100000"
},
"LowNode": "0"
},
"LedgerEntryType": "RippleState",
"LedgerIndex": "197E542413061266DC6995ADD18728149974484D717A415649AE12E89E297DA5",
"PreviousFields": {
"Balance": {
"currency": "USD",
"issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
"value": "9.825781705500002"
}
},
"PreviousTxnID": "70198986AB0016E6B09041ABA96493BF573C6C716855E71F78BDCFA7A71203C6",
"PreviousTxnLgrSeq": 80089709
}
},
{
"ModifiedNode": {
"FinalFields": {
"Balance": {
"currency": "USD",
"issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
"value": "23.85510663871068"
},
"Flags": 65536,
"HighLimit": {
"currency": "USD",
"issuer": "rEn9eRkX25wfGPLysUMAvZ84jAzFNpT5fL",
"value": "0"
},
"HighNode": "2a",
"LowLimit": {
"currency": "USD",
"issuer": "rogue5HnPRSszD9CWGSUz8UGHMVwSSKF6",
"value": "1000000000"
},
"LowNode": "10"
},
"LedgerEntryType": "RippleState",
"LedgerIndex": "8E8DEA2EF30CC9BE23F77BEAF13014EB10A5F43143893F1CE437C8AD9D606036",
"PreviousFields": {
"Balance": {
"currency": "USD",
"issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
"value": "13.59348001577766"
}
},
"PreviousTxnID": "1A4E117C10DEB82DC3A1FEF18D66D98C47488A299165360DC85466B4C9A54738",
"PreviousTxnLgrSeq": 80089535
}
},
{
"ModifiedNode": {
"FinalFields": {
"Flags": 0,
"Owner": "rfcoGE3E59UcwJ7LUHmbRjGR5rWA8VQScB",
"RootIndex": "A2FA8B3F2EF824DFAEAF33AD0AE77846946CAF92F2E18DC5D0409C603204DD0D"
},
"LedgerEntryType": "DirectoryNode",
"LedgerIndex": "A2FA8B3F2EF824DFAEAF33AD0AE77846946CAF92F2E18DC5D0409C603204DD0D"
}
},
{
"ModifiedNode": {
"FinalFields": {
"Balance": {
"currency": "USD",
"issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
"value": "-195.2064187338744"
},
"Flags": 2228224,
"HighLimit": {
"currency": "USD",
"issuer": "rBANKDxfAy8vRGrNLzSon7zQfR2V5zpgRb",
"value": "10000000000"
},
"HighNode": "0",
"LowLimit": {
"currency": "USD",
"issuer": "rhub8VRN55s94qWKDv6jmDy1pUykJzF3wq",
"value": "0"
},
"LowNode": "21a1"
},
"LedgerEntryType": "RippleState",
"LedgerIndex": "B84DC013433D10B260A7115D11784C9C5C96D737A3FBA2B36CE919759F676F9B",
"PreviousFields": {
"Balance": {
"currency": "USD",
"issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
"value": "-185.400249367108"
}
},
"PreviousTxnID": "06E3C456FADFEB97C5D216E82D681AE4918D4A44F63F8661BC030F52530F750A",
"PreviousTxnLgrSeq": 80071809
}
},
{
"ModifiedNode": {
"FinalFields": {
"Balance": {
"currency": "USD",
"issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
"value": "310.9696580939263"
},
"Flags": 1114112,
"HighLimit": {
"currency": "USD",
"issuer": "rEn9eRkX25wfGPLysUMAvZ84jAzFNpT5fL",
"value": "0"
},
"HighNode": "27",
"LowLimit": {
"currency": "USD",
"issuer": "rBANKDxfAy8vRGrNLzSon7zQfR2V5zpgRb",
"value": "10000000000"
},
"LowNode": "0"
},
"LedgerEntryType": "RippleState",
"LedgerIndex": "BDF8813AA1B5669828978CF11A263BFCF2E99F94F3581E3E9E6B09DE098DCD70",
"PreviousFields": {
"Balance": {
"currency": "USD",
"issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
"value": "321.2312847168593"
}
},
"PreviousTxnID": "86972874B075346D43052C8522697A85B2CBA1AF8C50F5DA06C087CB10B0B69E",
"PreviousTxnLgrSeq": 80052448
}
},
{
"DeletedNode": {
"FinalFields": {
"Account": "rfcoGE3E59UcwJ7LUHmbRjGR5rWA8VQScB",
"BookDirectory": "08AD73D0C85FE555610CD39AC6E4942D4088348B559503A855039FAF41ABC000",
"BookNode": "0",
"Flags": 131072,
"OwnerNode": "0",
"PreviousTxnID": "DCA518757EDBDC327D06AF2177D0E34B6B05496F13C495369EC33AD7F1B625C2",
"PreviousTxnLgrSeq": 79533097,
"Sequence": 79477533,
"TakerGets": {
"currency": "USD",
"issuer": "rEn9eRkX25wfGPLysUMAvZ84jAzFNpT5fL",
"value": "0.2783452490683"
},
"TakerPays": {
"currency": "USD",
"issuer": "rhub8VRN55s94qWKDv6jmDy1pUykJzF3wq",
"value": "0.2839121540498"
}
},
"LedgerEntryType": "Offer",
"LedgerIndex": "BF9CFB0EF73AECA7E967F266DD88F0811DE2C70040895B93CBED77EA739E2064"
}
},
{
"ModifiedNode": {
"FinalFields": {
"Account": "rfcoGE3E59UcwJ7LUHmbRjGR5rWA8VQScB",
"Balance": "99997196",
"Flags": 0,
"OwnerCount": 6,
"RegularKey": "rpKsri7AKuYmxb3jCVMDH2ATs1puDoZbpX",
"Sequence": 79477752
},
"LedgerEntryType": "AccountRoot",
"LedgerIndex": "D26FC1C78F273B85BD064844C484F88B86DA06E5B93C43AFE522321225EECE7B",
"PreviousFields": {
"OwnerCount": 8
},
"PreviousTxnID": "4E46F1FF5570074F62B8056BAB710E98B4AA2809D0F591259EBB79DEB1CC6A5D",
"PreviousTxnLgrSeq": 80087756
}
},
{
"ModifiedNode": {
"FinalFields": {
"Account": "rBANKDxfAy8vRGrNLzSon7zQfR2V5zpgRb",
"BookDirectory": "08AD73D0C85FE555610CD39AC6E4942D4088348B559503A85421F345B3015FA2",
"BookNode": "0",
"Flags": 0,
"OwnerNode": "20",
"Sequence": 76119537,
"TakerGets": {
"currency": "USD",
"issuer": "rEn9eRkX25wfGPLysUMAvZ84jAzFNpT5fL",
"value": "0.02052309629074"
},
"TakerPays": {
"currency": "USD",
"issuer": "rhub8VRN55s94qWKDv6jmDy1pUykJzF3wq",
"value": "0.019612188744792"
}
},
"LedgerEntryType": "Offer",
"LedgerIndex": "D918AD3B6125F111F6D5EDCD9C544DA6A3E9B85E5FCB380106C2629712DE64FD",
"PreviousFields": {
"TakerGets": {
"currency": "USD",
"issuer": "rEn9eRkX25wfGPLysUMAvZ84jAzFNpT5fL",
"value": "10.28214971922376"
},
"TakerPays": {
"currency": "USD",
"issuer": "rhub8VRN55s94qWKDv6jmDy1pUykJzF3wq",
"value": "9.825781555511261"
}
},
"PreviousTxnID": "38A98F8E489C22B82EBC88FCE310AF6F7D76693F4D3EBA136EE28300AE001DF3",
"PreviousTxnLgrSeq": 80049157
}
},
{
"ModifiedNode": {
"FinalFields": {
"Account": "rogue5HnPRSszD9CWGSUz8UGHMVwSSKF6",
"AccountTxnID": "26521749B7D414DB383A765F2F75C0B3798242BB18BF2DE9AFB4B3619D06D1FB",
"Balance": "3276619382",
"Flags": 0,
"OwnerCount": 307,
"Sequence": 3346292
},
"LedgerEntryType": "AccountRoot",
"LedgerIndex": "E7C799A822859C2DC1CA293CB3136B6590628B19F81D5C7BA8752B49BB422E84",
"PreviousFields": {
"AccountTxnID": "70198986AB0016E6B09041ABA96493BF573C6C716855E71F78BDCFA7A71203C6",
"Balance": "3276619482",
"Sequence": 3346291
},
"PreviousTxnID": "70198986AB0016E6B09041ABA96493BF573C6C716855E71F78BDCFA7A71203C6",
"PreviousTxnLgrSeq": 80089709
}
}
],
"TransactionIndex": 29,
"TransactionResult": "tesSUCCESS"
},
"validated": true
}
まとめ
XRPLのトランザクションのメタデータを確認することで、そのトランザクションがどのような変更をもたらしたのかを確認することができます。
メタデータはトランザクションの動作・詳細を知る上で非常に重要な情報ですので、ぜひ活用してみてください!
興味を持たれた方はXRPレジャー開発者のDiscordチャンネルへ是非お越しください!
日本語チャンネルもありますので、英語ができなくても大丈夫です!
私のTwitterはこちら!
Discussion