📖

XRPLのPaymentトランザクションを読み解く:JSONデータの詳細解説

に公開

はじめに

XRP Ledgerは分散型のパブリック・ブロックチェーンです。
コンセンサスプロトコルを採用し、10年以上にわたり、安定的に稼働しているブロックチェーンで、開発者は、トークン発行、オンラインゲーム、NFT、DeFiなどのユースケースにわたって革新的なブロックチェーンプロジェクトやアプリケーションを構築可能です。

トランザクション・データ

XRPL(XRP Ledger)のトランザクションは、詳細がJSON形式で確認できます。

無作為に選んだ特定のPaymentトランザクションのJSONデータを例にとり、各フィールドが何を意味しているのかを詳しく見ていきましょう。

https://xrplwin.com/tx/6B34C05B9914FF72BA7FA3044B8D48586532C44FAD3EE8B7A463B9CCA5ABA4EF#raw

JSONデータ:

{
    "Account": "rEiq1iAcpzP8WLjezP9MzAQEJ7jqKMLFSA",
    "Amount": "75596347",
    "DeliverMax": "75596347",
    "Destination": "rDNvjMc6LjtpR7BdfiSNvavUBjznhhmpNq",
    "DestinationTag": 905312,
    "Fee": "24",
    "Flags": 2147483648,
    "LastLedgerSequence": 95844482,
    "Sequence": 65773132,
    "SigningPubKey": "024979DFC8EA12B95CB832E57D9E11AFABB2F4A8F99736F4AA1050F7C3F4297B77",
    "TransactionType": "Payment",
    "TxnSignature": "3045022100E1CBFD6E29E3AD311E07DECB8336C26C8C38120C7F0C6D5F2043B60611D2F9AC02202CF7AE83F2F8B6E8FAA810051E60519456415D447DD537024FD0ABAB72180833",
    "ctid": "C5B6445D00010000",
    "date": 799431570,
    "hash": "6B34C05B9914FF72BA7FA3044B8D48586532C44FAD3EE8B7A463B9CCA5ABA4EF",
    "inLedger": 95831133,
    "ledger_index": 95831133,
    "meta": {
        "AffectedNodes": [
            {
                "ModifiedNode": {
                    "FinalFields": {
                        "Account": "rEiq1iAcpzP8WLjezP9MzAQEJ7jqKMLFSA",
                        "Balance": "4901552994070",
                        "Flags": 0,
                        "OwnerCount": 1,
                        "Sequence": 65773133
                    },
                    "LedgerEntryType": "AccountRoot",
                    "LedgerIndex": "38EDA33EB564190519CE39E829A9643F4E3855E4533BE2CABC6A57BD77846AA0",
                    "PreviousFields": {
                        "Balance": "4901628590441",
                        "Sequence": 65773132
                    },
                    "PreviousTxnID": "6745C63C124135266C6922D7D495C6CFCA4AA204AA54F08986E5126F2FDF5EC5",
                    "PreviousTxnLgrSeq": 95831130
                }
            },
            {
                "ModifiedNode": {
                    "FinalFields": {
                        "Account": "rDNvjMc6LjtpR7BdfiSNvavUBjznhhmpNq",
                        "Balance": "422388857",
                        "Flags": 0,
                        "OwnerCount": 0,
                        "Sequence": 68225102
                    },
                    "LedgerEntryType": "AccountRoot",
                    "LedgerIndex": "CD587D82DAC1C35D7ABBE5374ABA452FA526D80FC8550EAAEE1BC3CFD034CE73",
                    "PreviousFields": {
                        "Balance": "346792510"
                    },
                    "PreviousTxnID": "A509220DA0DD32B7E845541077805644DB3D93A5B8767A3DC9A0518E86BDBA55",
                    "PreviousTxnLgrSeq": 95831126
                }
            }
        ],
        "TransactionIndex": 1,
        "TransactionResult": "tesSUCCESS",
        "delivered_amount": "75596347"
    },
    "status": "success",
    "validated": true
}

トランザクションの概要

このJSONは、あるアカウントから別のアカウントへのXRP送金(Payment)トランザクションの詳細を示しています。

具体的には、アカウント rEiq1iAcpzP8WLjezP9MzAQEJ7jqKMLFSA からアカウント rDNvjMc6LjtpR7BdfiSNvavUBjznhhmpNq へ、75,596,347 drops(75.596347 XRP)が送金され、成功したことがわかります。

このトランザクションはレジャーインデックス 95831133 に含まれています。

主要フィールドの解説

以下、JSON内の主要なフィールドを個別に解説します。

  • TransactionType: "Payment"
    • トランザクションの種類を示します。ここでは「支払い」を意味します。
  • Account: "rEiq1iAcpzP8WLjezP9MzAQEJ7jqKMLFSA"
    • トランザクションを送信したアカウント(送金元)のアドレスです。
  • Destination: "rDNvjMc6LjtpR7BdfiSNvavUBjznhhmpNq"
    • 支払いを受け取るアカウント(送金先)のアドレスです。
  • DestinationTag: 905312
    • 送金先が指定した数値タグです。取引所など、単一アドレスで多数のユーザーを管理する場合に、どのユーザーへの入金かを識別するために利用されます。(一般的には宛先タグと呼ばれます)
  • Amount: "75596347"
    • 送金するように指定された額です。単位は drops(1 XRP = 1,000,000 drops)です。したがって、75.596347 XRP に相当します。
  • DeliverMax: "75596347"
    • 部分支払い(Partial Payment)が許可されている場合に、送金元が送金する最大額を指定します。XRPの送金では常に全額が送金されるため、通常Amountと同じ値が設定されます。
  • Fee: "24"
    • このトランザクションを処理するために支払われた手数料です。単位は drops です(0.000024 XRP)。
  • Sequence: 65773132
    • 送金元アカウント (Account) のシーケンス番号です。アカウントから送信されるトランザクションは、それぞれ一意のシーケンス番号を持つ必要があり、二重支払いを防ぎます。トランザクションが成功すると、アカウントのシーケンス番号は1増加します(metaセクションで確認できます)。
  • LastLedgerSequence: 95844482
    • このトランザクションが有効とみなされる最後のレジャーインデックスです。もしトランザクションがこのレジャー番号までに台帳に含まれなかった場合、それは永久に無効となります。LastLedgerSequence によって、トランザクションがコンセンサスに参加できるリミットが定められます。ネットワークが遅延した場合などでも、期限を過ぎると自動的に無効になります。
  • Flags: 2147483648
    • トランザクションの挙動を制御するフラグです。この値は 0x80000000 であり、tfFullyCanonicalSig フラグが立っていることを示します。これは、トランザクション署名が厳密なDERエンコーディングの標準形式であることを要求するものです。
  • SigningPubKey: "0249..."
    • このトランザクションに署名した公開鍵です。送金元アカウントに紐づいています。
  • TxnSignature: "3045..."
    • トランザクションデータ全体に対するデジタル署名です。これにより、SigningPubKey に対応する秘密鍵の所有者(=Accountの所有者)がこのトランザクションを承認したことが証明されます。
  • hash: "6B34..."
    • このトランザクションの一意な識別子(ハッシュ値)です。
  • ledger_index / inLedger: 95831133
    • このトランザクションが含まれたレジャーのインデックス(バージョン番号)です。
  • date: 799431570
    • トランザクションがレジャーに含まれた時刻です。これはXRPL Epoch(2000年1月1日 00:00:00 UTC)からの経過秒数で表されます。
  • validated: true
    • このトランザクションが検証済み(コンセンサスプロセスを経て確定済み)のレジャーに含まれていることを示します。
  • status: "success"
    • APIリクエスト自体のステータスです。status: "success"はAPIリクエストが成功したことを意味します。実際にトランザクションが検証済みであるかは、validated: true フィールドを確認してください。

メタデータ (meta) の解説

meta セクションには、トランザクションが実行された結果に関する詳細情報が含まれます。

  • TransactionResult: "tesSUCCESS"
    • トランザクションの最終的な結果コードです。tesSUCCESS はトランザクションが成功し、意図した通りの処理(この場合はXRPの送金)が手数料のみで完了したことを示します。tec から始まるコードは失敗を示します。
  • delivered_amount: "75596347"
    • 実際に送金先に届けられた額です。XRPの送金では Amount と同じ値になりますが、発行済み通貨(IOU)の送金や部分支払いの場合は、Amount より少なくなる可能性があります。
  • AffectedNodes:
    • このトランザクションによって変更されたレジャーオブジェクト(State Nodes)のリストです。
    • 1番目の ModifiedNode:
      • LedgerEntryType: "AccountRoot" - 変更されたオブジェクトの種類(アカウントの基本情報)。
      • LedgerIndex: "38ED..." - 変更された AccountRoot オブジェクトの一意なID。
      • FinalFields: 変更後のアカウント状態。Balance が送金額(Amount)と手数料(Fee)の合計分だけ減少し (4901628590441 - 75596347 - 24 = 4901552994070)、Sequence が1増加 (65773132 -> 65773133) していることがわかります。
      • PreviousFields: 変更前のアカウント状態(BalanceSequence)。
    • 2番目の ModifiedNode:
      • LedgerEntryType: "AccountRoot" - 送金先アカウントの AccountRoot オブジェクト。
      • LedgerIndex: "CD58..." - 送金先 AccountRoot オブジェクトの一意なID。
      • FinalFields: 変更後の送金先アカウント状態。Balancedelivered_amount 分だけ増加 (346792510 + 75596347 = 422388857) しています。送金先アカウントの Sequence はこのトランザクションでは変更されません。
      • PreviousFields: 変更前の送金先アカウント状態(Balance)。

まとめ

このように、XRPLのトランザクションJSONデータには、取引の詳細だけでなく、その実行結果や台帳状態への影響に関する豊富な情報が含まれています。

各フィールドの意味を理解することで、XRPL上で何が起こったのかを正確に追跡し、分析することが可能になりますが、最初からすべてを理解するのは難しいため、まずは主要フィールド(TransactionType、Hash、Feeなど)から理解できるようにすると良いと思います。

さいごに

また、Xで情報を発信していますので、興味を持たれた方はぜひフォローを!

https://x.com/nabe3_m

XRPLのイベント情報はこちら👇

https://x.com/XRPLJapan/status/1917750406685585812

Discussion