エスクロー
エスクローとは、第三者である承認者が実行するかどうかを決めるまで、チェーン自身が預かる支払いです。お金を預かる会社はなく、コントラクトのコードも関係しません。エスクローは、エンベロープに追加の部分を持つ通常の SendZBC または TransferToken であり、チェーンの固定されたルールがそれを決着させます。配送、フリーランスの仕事、あるいは支払者が審判を必要とするどんな取引にも向いています。
エスクローを作る
トランザクションのエスクロー部分は次のものを指定します。
- 承認者:取引を判断するアドレス
- 承認者への手数料
- トランザクションのタイムスタンプより後の、Unix 秒で表した絶対的な期限
- 「納品時に解放」のような、承認者への指示。最大 128,000 バイトで、ゼロのバイトを含んではなりません。
エスクロー部分を運べるのは SendZBC と TransferToken だけです。ブロックがそのトランザクションを取り込むと、送信者は金額、手数料、承認者への手数料、エスクローレントを支払い、チェーンは金額と承認者への手数料を預かります。トークンのエスクローでは金額はトークンで、手数料、承認者への手数料、レントは ZBC で支払われます。
4 つの結末
| 結末 | 起こり方 | 金額の行き先 | 承認者への手数料の行き先 |
|---|---|---|---|
| 承認 | 承認者が ApprovalEscrow を送る | 受取人 | 承認者 |
| 拒否 | 承認者が ApprovalEscrow を送る | 送信者 | 承認者 |
| 辞退 | 受取人が DeclineEscrowRequest を送る | 送信者 | 送信者 |
| 期限切れ | 期限を過ぎた最初のブロックで自動的に | 送信者 | 送信者 |
承認者は、承認しても拒否しても手数料を得ます。どちらにしても、取引を判断することが承認者の仕事だったからです。受取人が辞退した場合や、誰も期限内に行動しなかった場合は、送信者が両方の部分を取り戻します。
ApprovalEscrow の本体は 36 バイトで、承認の値とエスクローされたトランザクションのハッシュです。それを送れるのは指定された承認者だけです。各エスクローは一度だけ決着し、決着済みのエスクローに対する 2 回目の承認は有料の空操作です。手数料を支払い、それ以外は何もしません。送信者が支払いを任意に引き戻すことはできません。エスクローを閉じるのは、この 4 つの結末だけです。期限は直前のブロックのタイムスタンプと照らして確認されます(有効期限とタイムスタンプ を参照)。
チェーンは各エスクローのステータスを、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 は署名前にそれを報告します。
トランザクションがプルーニングされる時点より先にある期限は拒否されます。ただし、トランザクションの延命デポジットがそれだけ長く保存しておく費用を支払っている場合は除きます(データ保持のための支払い(ロンジェビティ) を参照)。
エスクローのリクエスト:受取人が先に動く
受取人が条件を決めたい場合もあります。EscrowRequest を使うと、受取人は支払者、金額、承認者、承認者への手数料、絶対的な期限、指示、そしてブロック数で表した資金拠出の時間枠を公開します。支払者は、条件がちょうど一致するエスクロー付きの SendZBC で資金を入れるか、DeclineEscrowRequest で辞退します。条件の異なる資金拠出のトランザクションは有料の空操作です。
複数当事者によるエスクローは、受取人の共同署名か、そのようなリクエストの ID のどちらかを運びます。