🔍

XRPLトランザクションのメタデータを学ぶ

2023/07/30に公開

XRPレジャー

XRPレジャーはBitcoinやEthereumなどと同じ分散型のパブリックブロックチェーンです。ビットコインの初期コントリビュータを含む3人の開発者により2012年に開発され、PoWやPoSとは異なる独自のコンセンサスアルゴリズムが用いられています。

NFTやDEXなどの機能がプロトコルネイティブに実装されており、他チェーンに比べて安全にこれらの機能を利用することができます。

レジャーオブジェクト

レジャーオブジェクトとは、XRPレジャーのステートを構成するデータのことを指します。
XRPレジャー上の全てのステートはレジャーオブジェクトで表され、トランザクションによってのみ変更されます。

例えば次のようなレジャーオブジェクトが存在します。

  • AccountRoot: 1アカウントのXRP残高やドメインなどのメタ情報を保持するオブジェクト
  • Offer: オーダーブックに存在する1注文情報を保持するオブジェクト
  • NFTokenPage: アカウントが保有するNFTの情報をページとして保持するオブジェクト

https://xrpl.org/ja/ledger-object-types.html

トランザクション

レジャーオブジェクトを変更するための処理です。
トランザクションはレジャーオブジェクトを変更するための処理であり、レジャーオブジェクトの変更はトランザクションによってのみ行われます。

例えば次のようなトランザクションが存在します。

  • Payment: 1アカウントから別のアカウントへXRP/トークンを送金します。トランザクションによりAccountRootRippleStateなどのオブジェクトが変更されることがあります。
  • OfferCreate: ある通貨ペアに対するDEXの注文を作成します。トランザクションによりOfferオブジェクトが作成され、クロスする注文が存在した場合は、他のOfferオブジェクトを変更したり、削除したりします。また、この約定によりXRPの残高を持つAccountRootやトークンの残高を持つRippleStateオブジェクトが変更されることがあります。
  • NFTokenMint: NFTokenPageを作成し、その中にNFTokenを格納します。既にNFTokenを格納可能なNFTokenPageが存在する場合、そのNFTokenPageに変更が発生します。

https://xrpl.org/ja/transaction-types.html

メタデータ

レジャーにより検証されたトランザクション情報からレジャーオブジェクトがどう変化したかを確認することができます。

例えば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チャンネルへ是非お越しください!
日本語チャンネルもありますので、英語ができなくても大丈夫です!
https://xrpldevs.org

私のTwitterはこちら!

Discussion