Вики ZooBC
Транзакции

Эскроу

Эскроу — это платёж, который удерживает сама цепочка, пока третья сторона, утверждающий, не решит, пройдёт ли он. Деньги не хранит никакая компания, и никакой код контрактов не участвует: эскроу — это обычная транзакция SendZBC или TransferToken с дополнительной частью в конверте, а завершают его фиксированные правила цепочки. Оно подходит для доставок, работы фрилансеров или любой сделки, в которой плательщику нужен арбитр.

Как создать эскроу

Часть эскроу в транзакции называет:

  • утверждающего — адрес, который будет судить сделку;
  • вознаграждение утверждающему;
  • абсолютный срок в секундах Unix, позже метки времени транзакции;
  • инструкцию для утверждающего, например «выплатить при доставке», не более 128 000 байт и без нулевого байта.

Часть эскроу могут нести только SendZBC и TransferToken. Когда блок включает транзакцию, отправитель платит сумму, комиссию, вознаграждение и аренду эскроу, а цепочка удерживает сумму и вознаграждение. В эскроу с токеном сумма выражена в токене, а комиссия, вознаграждение и аренда оплачиваются в ZBC.

Четыре исхода

Ящик эскроу, в котором лежат сумма и вознаграждение, с четырьмя выходами: утверждение, отклонение, отказ получателя и истечение срока; для каждого показано, куда уходят обе части
Ящик эскроу, в котором лежат сумма и вознаграждение, с четырьмя выходами: утверждение, отклонение, отказ получателя и истечение срока; для каждого показано, куда уходят обе части
ИсходКак происходитСумма уходитВознаграждение уходит
Утверждениеутверждающий отправляет ApprovalEscrowполучателюутверждающему
Отклонениеутверждающий отправляет ApprovalEscrowотправителюутверждающему
Отказполучатель отправляет DeclineEscrowRequestотправителюотправителю
Срок истёкпервый блок после срока, сам собойотправителюотправителю

Утверждающий получает вознаграждение и когда утверждает, и когда отклоняет, потому что в обоих случаях его работой было рассудить сделку. Если получатель отказывается или никто не действует вовремя, отправитель получает обе части обратно.

У ApprovalEscrow тело в 36 байт: значение утверждения и хеш транзакции эскроу. Отправить её может только названный утверждающий. Каждое эскроу завершается один раз, и повторное утверждение уже завершённого эскроу — оплаченная пустая операция: она платит комиссию и больше ничего не делает. Отправитель не может забрать платёж по своему желанию: эскроу закрывают только эти четыре исхода. Срок сверяется с меткой времени предыдущего блока (см. Срок действия и метки времени).

Цепочка записывает статус каждого эскроу: 0 — ожидает, 1 — утверждено, 2 — отклонено, 3 — истекло, 4 — отказано.

Аренда эскроу

Эскроу занимает место в состоянии цепочки, пока не завершится, поэтому сверх комиссии оно платит аренду:

escrow rent = storage price of the escrow part's bytes × lock duration in blocks ÷ billing period

Аренда списывается при создании эскроу, уходит в пул долголетия (см. Пулы) и никогда не возвращается, каким бы ни был исход. GET /api/v1/blockchain/estimate-fee сообщает её до подписания.

Срок, лежащий дальше момента, когда транзакция была бы удалена при обрезке истории, отклоняется, если только депозит survival транзакции не оплачивает её хранение на такой срок (см. Плата за сохранение данных (долговечность)).

Запросы эскроу: получатель ходит первым

Иногда условия хочет задать получатель. С помощью EscrowRequest получатель публикует плательщика, сумму, утверждающего, вознаграждение, абсолютный срок, инструкцию и окно пополнения в блоках. Затем плательщик либо пополняет его транзакцией SendZBC с эскроу, условия которой в точности совпадают, либо отказывается от него транзакцией DeclineEscrowRequest. Транзакция пополнения с отличающимися условиями — оплаченная пустая операция.

Многостороннее эскроу несёт либо соподпись получателя, либо идентификатор такого запроса.

См. также