Вся развилка записана в одном объекте
Найдите подтверждённую `EscrowCreate`. Её отправитель записан в поле `Account`. Обычный порядковый номер `Sequence` становится `OfferSequence`. Если создание использовало объект `Ticket` вместо обычного номера, в `OfferSequence` ставят его `TicketSequence`. Эта пара нужна и для `EscrowFinish`, и для `EscrowCancel`. В завершающей транзакции поле `Owner` должно повторять исходный `Account`. Отправить её может любой аккаунт, но получатель и направление возврата уже зафиксированы.
Сохраните `Amount`, `Destination`, `FinishAfter`, `CancelAfter`, `Condition`, индекс объекта и номер подтверждённого реестра. `Amount` — удерживаемая сумма, а `Destination` — зафиксированный получатель. `FinishAfter` задаёт временную границу завершения, а `CancelAfter` — временную границу отмены. `Condition` — криптографическое условие, а `Fulfillment` — данные, которые его выполняют. Разбор ниже относится к классическому XRP Escrow.
Если `Amount` представлен объектом токена, отдельно проверьте активность TokenEscrow и правила доверительной линии. У токенов есть дополнительные условия, поэтому ветку классического XRP к ним нельзя переносить автоматически.
| Состояние объекта | Что можно отправить | Что остановит операцию |
|---|---|---|
| Есть будущий `FinishAfter` | Пока ничего | `EscrowFinish` раньше времени |
| `FinishAfter` прошёл, `CancelAfter` ещё нет | `EscrowFinish` | Отсутствующий или неверный `Fulfillment`, если задан `Condition` |
| Есть `Condition`, но нет `FinishAfter` | `EscrowFinish` сразу после создания | Нет совпадающего выполнения условия |
| `CancelAfter` прошёл | `EscrowCancel` | Попытка Finish после истечения |
| Нет `CancelAfter` | Завершение по остальным условиям | Отмена никогда не становится доступной |
- Состояние объекта
- Есть будущий `FinishAfter`
- Что можно отправить
- Пока ничего
- Что остановит операцию
- `EscrowFinish` раньше времени
- Состояние объекта
- `FinishAfter` прошёл, `CancelAfter` ещё нет
- Что можно отправить
- `EscrowFinish`
- Что остановит операцию
- Отсутствующий или неверный `Fulfillment`, если задан `Condition`
- Состояние объекта
- Есть `Condition`, но нет `FinishAfter`
- Что можно отправить
- `EscrowFinish` сразу после создания
- Что остановит операцию
- Нет совпадающего выполнения условия
- Состояние объекта
- `CancelAfter` прошёл
- Что можно отправить
- `EscrowCancel`
- Что остановит операцию
- Попытка Finish после истечения
- Состояние объекта
- Нет `CancelAfter`
- Что можно отправить
- Завершение по остальным условиям
- Что остановит операцию
- Отмена никогда не становится доступной
Временную границу задаёт предыдущий реестр
Поля времени считаются от эпохи Ripple. Сеть сравнивает их со временем закрытия предыдущего подтверждённого реестра. Завершение слишком раннее, пока `FinishAfter` позже этого времени. Отмена недоступна, пока `CancelAfter` позже времени предыдущего реестра. Равенство не подпадает под эти два условия отказа. Однако часы устройства не показывают, какой предыдущий реестр увидит следующая транзакция.
Получите свежий подтверждённый реестр и его `close_time`. Если значение ещё не прошло нужную границу, не повышайте комиссию и не меняйте объект: подождите новый подтверждённый реестр. Разница между включением и окончательностью разобрана отдельно.
Condition не раскрывает секрет выполнения
`Condition` — шестнадцатеричное представление криптографического условия PREIMAGE-SHA-256. Для завершения передают исходное `Condition` и соответствующий `Fulfillment`. По одному условию нельзя восстановить секрет. Если байты изменились или относятся к другому объекту, операция не пройдёт.
Не вставляйте `Fulfillment` в публичную форму до отправки: любой аккаунт вправе подать корректный `EscrowFinish`. Это не позволяет переназначить получателя, но посторонний отправитель выберет момент исполнения и заплатит свою комиссию. После `CancelAfter` правильное выполнение условия уже не возвращает ветку завершения.
Finish и Cancel закрывают объект по-разному
Для завершения укажите `Owner` исходного отправителя и его `OfferSequence`. Добавьте `Condition` и `Fulfillment` только если они есть в объекте. При успехе Escrow удаляется, а сумма поступает на неизменяемый `Destination`. Если у получателя включён DepositAuth, авторизация входящего зачисления проверяется отдельно.
Для отмены используются те же `Owner` и `OfferSequence`, но только после `CancelAfter`. Успешная операция удаляет объект и возвращает удержанную сумму исходному `Account`. Если истёкший Escrow всё ещё виден, транзакцию отмены ещё никто не отправил. Средства автоматически не возвращаются.
| Поле или результат | Зачем сохранить | Что не следует из него |
|---|---|---|
| `Account` + `OfferSequence` | Однозначно связать Finish/Cancel с созданием | Не доказывает доступность операции сейчас |
| предыдущий подтверждённый `close_time` | Проверить временную границу | Не заменяет `Condition` и `Fulfillment` |
| `tesSUCCESS` и метаданные | Подтвердить применение транзакции | Успешный ответ RPC до включения этого не доказывает |
| удаление объекта Escrow | Доказать закрытие обязательства | Не показывает изменение баланса аккаунта без метаданных |
| изменения балансов | Различить выплату и возврат | Нужно учитывать комиссию отправителя Finish/Cancel |
- Поле или результат
- `Account` + `OfferSequence`
- Зачем сохранить
- Однозначно связать Finish/Cancel с созданием
- Что не следует из него
- Не доказывает доступность операции сейчас
- Поле или результат
- предыдущий подтверждённый `close_time`
- Зачем сохранить
- Проверить временную границу
- Что не следует из него
- Не заменяет `Condition` и `Fulfillment`
- Поле или результат
- `tesSUCCESS` и метаданные
- Зачем сохранить
- Подтвердить применение транзакции
- Что не следует из него
- Успешный ответ RPC до включения этого не доказывает
- Поле или результат
- удаление объекта Escrow
- Зачем сохранить
- Доказать закрытие обязательства
- Что не следует из него
- Не показывает изменение баланса аккаунта без метаданных
- Поле или результат
- изменения балансов
- Зачем сохранить
- Различить выплату и возврат
- Что не следует из него
- Нужно учитывать комиссию отправителя Finish/Cancel
Если операция не прошла, объект не нужно создавать заново
При слишком ранней попытке перечитайте подтверждённое время. При ошибке условия сравните байты `Condition` и `Fulfillment` с исходным объектом. При неверной паре `Owner` и `OfferSequence` вернитесь к `EscrowCreate`. Если объект уже исчез, найдите закрывшую его транзакцию и проверьте фактически доставленную сумму.
Повтор имеет смысл только после сверки исходного объекта, предыдущего подтверждённого времени и результата закрывающей транзакции. Новый Escrow не разблокирует старый, а неподтверждённый ответ узла не доказывает его состояние.
Источники
Мы используем прямые ссылки и фиксируем дату проверки. Полный текст чужих материалов не перепечатывается.
- XRPL Docs — Escrow XRP Ledger · Проверено 25 августа 2026 г. в 09:22 GMT+5
- XRPL Protocol — Escrow ledger object XRP Ledger · Проверено 25 августа 2026 г. в 09:22 GMT+5
- XRPL Protocol — EscrowCreate XRP Ledger · Проверено 25 августа 2026 г. в 09:22 GMT+5
- XRPL Protocol — EscrowFinish XRP Ledger · Проверено 25 августа 2026 г. в 09:22 GMT+5
- XRPL Protocol — EscrowCancel XRP Ledger · Проверено 25 августа 2026 г. в 09:22 GMT+5
- XRPL Docs — Ledger Close Times XRP Ledger · Проверено 25 августа 2026 г. в 09:22 GMT+5
- XRPL mainnet server_info Ripple · Проверено 25 августа 2026 г. в 09:22 GMT+5
