# 時間に基づくEscrowの送信 [EscrowCreateトランザクション](/ja/docs/references/protocol/transactions/types/escrowcreate)タイプでは、リリースの唯一の条件が特定時刻を経過することであるEscrowを作成できます。このためには、`FinishAfter`フィールドを使用し、`Condition`フィールドを省略します。 ## 1.リリース時刻の計算 時刻を **[Rippleエポック以降の経過秒数](/ja/docs/references/protocol/data-types/basic-data-types#%E6%99%82%E9%96%93%E3%81%AE%E6%8C%87%E5%AE%9A)** として指定する必要があります。Rippleエポックは、UNIXエポックの946684800秒後です。たとえば、2017年11月13日の午前0時(UTC)に資金をリリースする場合、以下のようになります。 JavaScript ```js // 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 ``` Python 3 ```python import datetime release_date_utc = datetime.datetime(2017,11,13,0,0,0,tzinfo=datetime.timezone.utc) release_date_ripple = int(release_date_utc.timestamp()) - 946684800 print(release_date_ripple) # 563846400 ``` `FinishAfter`フィールドで、UNIX時刻を同等のRipple時刻に変換せずに使用すると、ロック解除時刻が30年先に設定されることになります。 ## 2.EscrowCreateトランザクションの送信 [EscrowCreateトランザクション](/ja/docs/references/protocol/transactions/types/escrowcreate)に[署名して送信](/ja/docs/concepts/transactions#%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B6%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%B8%E3%81%AE%E7%BD%B2%E5%90%8D%E3%81%A8%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B6%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E9%80%81%E4%BF%A1)します。トランザクションの`FinishAfter`フィールドを、保留中の支払いがリリースされる時刻に設定します。`Condition`フィールドを省略して、時刻を保留中の支払いをリリースする唯一の条件とします。`Destination`を受取人に設定します。受取人と送金元のアドレスは同じでもかまいません。`Amount`を、Escrowする[XRPのdrop数](/ja/docs/references/protocol/data-types/basic-data-types#%E9%80%9A%E8%B2%A8%E9%A1%8D%E3%81%AE%E6%8C%87%E5%AE%9A)の合計額に設定します。 注意 自分が管理していないサーバに秘密鍵を送信しないでください。暗号化されていない秘密鍵をネットワーク経由で送信しないでください。 リクエスト: Websocket { "id": 2, "command": "submit", "secret": "s████████████████████████████", "tx_json": { "Account": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG", "TransactionType": "EscrowCreate", "Amount": "10000", "Destination": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", "FinishAfter": 557020800 } } レスポンス: Websocket { "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メソッド](/ja/docs/references/http-websocket-apis/public-api-methods/transaction-methods/tx)を使用して、トランザクションの最終ステータスを確認します。[Escrowレジャーオブジェクト](/ja/docs/concepts/payment-types/escrow)が作成されたことを示す`CreatedNode`をトランザクションメタデータで探します。 リクエスト: Websocket { "id": 3, "command": "tx", "transaction": "55B2057332F8999208C43BA1E7091B423A16E5ED2736C06300B4076085205263" } レスポンス: Websocket { "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`ヘッダーフィールド](/ja/docs/references/protocol/ledger-data/ledger-header)の時刻でレジャーが閉鎖するまでは完了できません。 最新の検証済みレジャーの閉鎖時刻は、[ledgerメソッド](/ja/docs/references/http-websocket-apis/public-api-methods/ledger-methods/ledger)を使用して検索できます。 リクエスト: Websocket { "id": 4, "command": "ledger", "ledger_index": "validated" } レスポンス: Websocket { "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トランザクション](/ja/docs/references/protocol/transactions/types/escrowfinish)に[署名して送信](/ja/docs/concepts/transactions#%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B6%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%B8%E3%81%AE%E7%BD%B2%E5%90%8D%E3%81%A8%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B6%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E9%80%81%E4%BF%A1)します。トランザクションの`Owner`フィールドにEscrowCreateトランザクションの`Account`アドレスを設定し、`OfferSequence` にEscrowCreateトランザクションの`Sequence`番号を設定します。時刻のみに基づいて保留されているEscrowの場合は、`Condition`フィールドと`Fulfillment`フィールドを省略します。 XRP Ledgerの状態はトランザクションでしか変更できないため、EscrowFinishトランザクションが必要です。このトランザクションの送信者は、Escrowの受取人、Escrowの元としての送金人、またはその他のXRP Ledgerアドレスのいずれかです。 Escrowが有効期限切れの場合は、[Escrowの取消し](/ja/docs/tutorials/how-tos/use-specialized-payment-types/use-escrows/cancel-an-expired-escrow)だけが可能です。 注意 自分が管理していないサーバに秘密鍵を送信しないでください。暗号化されていない秘密鍵をネットワーク経由で送信しないでください。 リクエスト: Websocket { "id": 5, "command": "submit", "secret": "s████████████████████████████", "tx_json": { "Account": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG", "TransactionType": "EscrowFinish", "Owner": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG", "OfferSequence": 1 } } レスポンス: Websocket { "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メソッド](/ja/docs/references/http-websocket-apis/public-api-methods/transaction-methods/tx)を使用して、トランザクションの最終ステータスを確認します。特にトランザクションメタデータ内で、エスクローに預託された支払いの送金先の`ModifiedNode`(タイプが`AccountRoot`)を確認します。オブジェクトの`FinalFields`に、`Balance`フィールドのXRP返金額の増分が表示されている必要があります。 リクエスト: Websocket { "id": 21, "command": "tx", "transaction": "41856A742B3CAF307E7B4D0B850F302101F0F415B785454F7501E9960A2A1F6B" } レスポンス: Websocket { "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 } }