時間に基づくEscrowの送信
EscrowCreateトランザクションタイプでは、リリースの唯一の条件が特定時刻を経過することであるEscrowを作成できます。このためには、FinishAfter
フィールドを使用し、Condition
フィールドを省略します。
1.リリース時刻の計算
時刻を Rippleエポック以降の経過秒数 として指定する必要があります。Rippleエポックは、UNIXエポックの946684800秒後です。たとえば、2017年11月13日の午前0時(UTC)に資金をリリースする場合、以下のようになります。
// JavaScript Date() is natively expressed in milliseconds; convert to seconds const release_date_unix = Math.floor( new Date("2017-11-13T00:00:00Z") / 1000 ); const release_date_ripple = release_date_unix - 946684800; console.log(release_date_ripple); // 563846400
警告: FinishAfter
フィールドで、UNIX時刻を同等のRipple時刻に変換せずに使用すると、ロック解除時刻が30年先に設定されることになります。
2.EscrowCreateトランザクションの送信
EscrowCreateトランザクションに署名して送信します。トランザクションのFinishAfter
フィールドを、保留中の支払いがリリースされる時刻に設定します。Condition
フィールドを省略して、時刻を保留中の支払いをリリースする唯一の条件とします。Destination
を受取人に設定します。受取人と送金元のアドレスは同じでもかまいません。Amount
を、EscrowするXRP、drop単位の合計額に設定します。
自分が管理していないサーバに秘密鍵を送信しないでください。暗号化されていない秘密鍵をネットワーク経由で送信しないでください。
リクエスト:
{ "id": 2, "command": "submit", "secret": "s████████████████████████████", "tx_json": { "Account": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG", "TransactionType": "EscrowCreate", "Amount": "10000", "Destination": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", "FinishAfter": 557020800 } }
レスポンス:
{ "id": 2, "status": "success", "type": "response", "result": { "engine_result": "tesSUCCESS", "engine_result_code": 0, "engine_result_message": "The transaction was applied. Only final in a validated ledger.", "tx_blob": "1200012280000000240000000120252133768061400000000000271068400000000000000A732103C3555B7339FFDDB43495A8371A3A87B4C66B67D49D06CB9BA1FDBFEEB57B6E437446304402203C9AA4C21E1A1A7427D41583283E7A513DDBDD967B246CADD3B2705D858A7A8E02201BEA7B923B18910EEB9F306F6DE3B3F53549BBFAD46335B62B4C34A6DCB4A47681143EEB46C355B04EE8D08E8EED00F422895C79EA6A83144B4E9C06F24296074F7BC48F92A97916C6DC5EA9", "tx_json": { "Account": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG", "Amount": "10000", "Destination": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", "Fee": "10", "FinishAfter": 557020800, "Flags": 2147483648, "Sequence": 1, "SigningPubKey": "03C3555B7339FFDDB43495A8371A3A87B4C66B67D49D06CB9BA1FDBFEEB57B6E43", "TransactionType": "EscrowCreate", "TxnSignature": "304402203C9AA4C21E1A1A7427D41583283E7A513DDBDD967B246CADD3B2705D858A7A8E02201BEA7B923B18910EEB9F306F6DE3B3F53549BBFAD46335B62B4C34A6DCB4A476", "hash": "55B2057332F8999208C43BA1E7091B423A16E5ED2736C06300B4076085205263" } } }
トランザクションの識別用hash
値をメモしておきます。これにより、検証済みレジャーバージョンに記録されるときにその最終ステータスを確認できます。
3.検証の待機
本番環境のネットワークやTestnetでは、レジャーが自動的に閉鎖するまでに4~7秒かかる場合があります。
スタンドアロンモードでrippled
を実行している場合は、[ledger_acceptメソッド][]を使用してレジャーを手動で閉鎖します。
4.Escrowが作成されたことの確認
トランザクションの識別用ハッシュを指定したtxメソッドを使用して、トランザクションの最終ステータスを確認します。Escrowレジャーオブジェクトが作成されたことを示すCreatedNode
をトランザクションメタデータで探します。
リクエスト:
{ "id": 3, "command": "tx", "transaction": "55B2057332F8999208C43BA1E7091B423A16E5ED2736C06300B4076085205263" }
レスポンス:
{ "id": 3, "status": "success", "type": "response", "result": { "Account": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG", "Amount": "10000", "Destination": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", "Fee": "10", "FinishAfter": 557020800, "Flags": 2147483648, "Sequence": 1, "SigningPubKey": "03C3555B7339FFDDB43495A8371A3A87B4C66B67D49D06CB9BA1FDBFEEB57B6E43", "TransactionType": "EscrowCreate", "TxnSignature": "304402203C9AA4C21E1A1A7427D41583283E7A513DDBDD967B246CADD3B2705D858A7A8E02201BEA7B923B18910EEB9F306F6DE3B3F53549BBFAD46335B62B4C34A6DCB4A476", "date": 557014081, "hash": "55B2057332F8999208C43BA1E7091B423A16E5ED2736C06300B4076085205263", "inLedger": 1828796, "ledger_index": 1828796, "meta": { "AffectedNodes": [ { "ModifiedNode": { "LedgerEntryType": "AccountRoot", "LedgerIndex": "13F1A95D7AAB7108D5CE7EEAF504B2894B8C674E6D68499076441C4837282BF8", "PreviousTxnID": "613B28E0890FC975F2CBA3D700F75116F623B1E3FE48CB7CB2EB216EAD6F097D", "PreviousTxnLgrSeq": 1799920 } }, { "CreatedNode": { "LedgerEntryType": "Escrow", "LedgerIndex": "2B9845CB9DF686B9615BF04F3EC66095A334D985E03E71B893B90FCF6D4DC9E6", "NewFields": { "Account": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG", "Amount": "10000", "Destination": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", "FinishAfter": 557020800 } } }, { "ModifiedNode": { "FinalFields": { "Account": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG", "Balance": "9999989990", "Flags": 0, "OwnerCount": 1, "Sequence": 2 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "AE5AB6584A76C37C7382B6880609FC7792D90CDA36FF362AF412EB914C1715D3", "PreviousFields": { "Balance": "10000000000", "OwnerCount": 0, "Sequence": 1 }, "PreviousTxnID": "F181D45FD094A7417926F791D9DF958B84CE4B7B3D92CC9DDCACB1D5EC59AAAA", "PreviousTxnLgrSeq": 1828732 } }, { "CreatedNode": { "LedgerEntryType": "DirectoryNode", "LedgerIndex": "D623EBEEEE701D4323D0ADA5320AF35EA8CC6520EBBEF69343354CD593DABC88", "NewFields": { "Owner": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG", "RootIndex": "D623EBEEEE701D4323D0ADA5320AF35EA8CC6520EBBEF69343354CD593DABC88" } } } ], "TransactionIndex": 3, "TransactionResult": "tesSUCCESS" }, "validated": true } }
5.リリース時刻までの待機
FinishAfter
時刻が指定されている保留中の支払いは、EscrowノードのFinishAfter
時刻よりも後のclose_time
ヘッダーフィールドの時刻でレジャーが閉鎖するまでは完了できません。
最新の検証済みレジャーの閉鎖時刻は、ledgerメソッドを使用して検索できます。
リクエスト:
{ "id": 4, "command": "ledger", "ledger_index": "validated" }
レスポンス:
{ "id": 4, "status": "success", "type": "response", "result": { "ledger": { "accepted": true, "account_hash": "3B5A8FF5334F94F4D3D09F236F9D1B4C028FCAE30948ACC986D461DDEE1D886B", "close_flags": 0, "close_time": 557256670, "close_time_human": "2017-Aug-28 17:31:10", "close_time_resolution": 10, "closed": true, "hash": "A999223A80174A7CB39D766B625C9E476F24AD2F15860A712CD029EE5ED1C320", "ledger_hash": "A999223A80174A7CB39D766B625C9E476F24AD2F15860A712CD029EE5ED1C320", "ledger_index": "1908253", "parent_close_time": 557256663, "parent_hash": "6A70C5336ACFDA05760D827776079F7A544D2361CFD5B21BD55A92AA20477A61", "seqNum": "1908253", "totalCoins": "99997280690562728", "total_coins": "99997280690562728", "transaction_hash": "49A51DFB1CAB2F134D93D5D1C5FF55A15B12DA36DAF9F5862B17C47EE966647D" }, "ledger_hash": "A999223A80174A7CB39D766B625C9E476F24AD2F15860A712CD029EE5ED1C320", "ledger_index": 1908253, "validated": true } }
6.EscrowFinishトランザクションの送信
FinishAfter
の時刻が経過した後で資金のリリースを実行するEscrowFinishトランザクションに署名して送信します。トランザクションのOwner
フィールドにEscrowCreateトランザクションのAccount
アドレスを設定し、OfferSequence
にEscrowCreateトランザクションのSequence
番号を設定します。時刻のみに基づいて保留されているEscrowの場合は、Condition
フィールドとFulfillment
フィールドを省略します。
ヒント: XRP Ledgerの状態はトランザクションでしか変更できないため、EscrowFinishトランザクションが必要です。このトランザクションの送信者は、Escrowの受取人、Escrowの元としての送金人、またはその他のXRP Ledgerアドレスのいずれかです。
Escrowが有効期限切れの場合は、Escrowの取消しだけが可能です。
自分が管理していないサーバに秘密鍵を送信しないでください。暗号化されていない秘密鍵をネットワーク経由で送信しないでください。
リクエスト:
{ "id": 5, "command": "submit", "secret": "s████████████████████████████", "tx_json": { "Account": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG", "TransactionType": "EscrowFinish", "Owner": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG", "OfferSequence": 1 } }
レスポンス:
{ "id": 5, "status": "success", "type": "response", "result": { "engine_result": "tesSUCCESS", "engine_result_code": 0, "engine_result_message": "The transaction was applied. Only final in a validated ledger.", "tx_blob": "1200022280000000240000000220190000000168400000000000000A732103C3555B7339FFDDB43495A8371A3A87B4C66B67D49D06CB9BA1FDBFEEB57B6E4374473045022100923B91BA4FD6450813F5335D71C64BA9EB81304A86859A631F2AD8571424A46502200CCE660D36781B84634C5F23619EB6CFCCF942709F54DCCF27CF6F499AE78C9B81143EEB46C355B04EE8D08E8EED00F422895C79EA6A82143EEB46C355B04EE8D08E8EED00F422895C79EA6A", "tx_json": { "Account": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG", "Fee": "10", "Flags": 2147483648, "OfferSequence": 1, "Owner": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG", "Sequence": 2, "SigningPubKey": "03C3555B7339FFDDB43495A8371A3A87B4C66B67D49D06CB9BA1FDBFEEB57B6E43", "TransactionType": "EscrowFinish", "TxnSignature": "3045022100923B91BA4FD6450813F5335D71C64BA9EB81304A86859A631F2AD8571424A46502200CCE660D36781B84634C5F23619EB6CFCCF942709F54DCCF27CF6F499AE78C9B", "hash": "41856A742B3CAF307E7B4D0B850F302101F0F415B785454F7501E9960A2A1F6B" } } }
トランザクションの識別用hash
値をメモしておきます。これにより、検証済みレジャーバージョンに記録されるときにその最終ステータスを確認できます。
7.検証の待機
本番環境のネットワークやTestnetでは、レジャーが自動的に閉鎖するまでに4~7秒かかる場合があります。
スタンドアロンモードでrippled
を実行している場合は、[ledger_acceptメソッド][]を使用してレジャーを手動で閉鎖します。
8.最終結果の確認
EscrowFinishトランザクションの識別用ハッシュを指定したtxメソッドを使用して、トランザクションの最終ステータスを確認します。特にトランザクションメタデータ内で、エスクローに預託された支払いの送金先のModifiedNode
(タイプがAccountRoot
)を確認します。オブジェクトのFinalFields
に、Balance
フィールドのXRP返金額の増分が表示されている必要があります。
リクエスト:
{ "id": 21, "command": "tx", "transaction": "41856A742B3CAF307E7B4D0B850F302101F0F415B785454F7501E9960A2A1F6B" }
レスポンス:
{ "id": 21, "status": "success", "type": "response", "result": { "Account": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG", "Fee": "10", "Flags": 2147483648, "OfferSequence": 1, "Owner": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG", "Sequence": 2, "SigningPubKey": "03C3555B7339FFDDB43495A8371A3A87B4C66B67D49D06CB9BA1FDBFEEB57B6E43", "TransactionType": "EscrowFinish", "TxnSignature": "3045022100923B91BA4FD6450813F5335D71C64BA9EB81304A86859A631F2AD8571424A46502200CCE660D36781B84634C5F23619EB6CFCCF942709F54DCCF27CF6F499AE78C9B", "date": 557256681, "hash": "41856A742B3CAF307E7B4D0B850F302101F0F415B785454F7501E9960A2A1F6B", "inLedger": 1908257, "ledger_index": 1908257, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", "Balance": "400210000", "Flags": 0, "OwnerCount": 0, "Sequence": 1 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "13F1A95D7AAB7108D5CE7EEAF504B2894B8C674E6D68499076441C4837282BF8", "PreviousFields": { "Balance": "400200000" }, "PreviousTxnID": "55B2057332F8999208C43BA1E7091B423A16E5ED2736C06300B4076085205263", "PreviousTxnLgrSeq": 1828796 } }, { "DeletedNode": { "FinalFields": { "Account": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG", "Amount": "10000", "Destination": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", "FinishAfter": 557020800, "Flags": 0, "OwnerNode": "0000000000000000", "PreviousTxnID": "55B2057332F8999208C43BA1E7091B423A16E5ED2736C06300B4076085205263", "PreviousTxnLgrSeq": 1828796 }, "LedgerEntryType": "Escrow", "LedgerIndex": "2B9845CB9DF686B9615BF04F3EC66095A334D985E03E71B893B90FCF6D4DC9E6" } }, { "ModifiedNode": { "FinalFields": { "Account": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG", "Balance": "9999989980", "Flags": 0, "OwnerCount": 0, "Sequence": 3 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "AE5AB6584A76C37C7382B6880609FC7792D90CDA36FF362AF412EB914C1715D3", "PreviousFields": { "Balance": "9999989990", "OwnerCount": 1, "Sequence": 2 }, "PreviousTxnID": "55B2057332F8999208C43BA1E7091B423A16E5ED2736C06300B4076085205263", "PreviousTxnLgrSeq": 1828796 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG", "RootIndex": "D623EBEEEE701D4323D0ADA5320AF35EA8CC6520EBBEF69343354CD593DABC88" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "D623EBEEEE701D4323D0ADA5320AF35EA8CC6520EBBEF69343354CD593DABC88" } } ], "TransactionIndex": 2, "TransactionResult": "tesSUCCESS" }, "validated": true } }