Как разрешается спор
У спора две половины, и только одна из них что-либо решает.
Офчейн-слой собирает. Он проверяет подпись каждого арбитра, сверяет раскрытие с более ранним коммитом этого арбитра, отклоняет раскрытие от кошелька, который никогда не делал коммит, отбрасывает дубликаты и реплицирует результат, чтобы каждый узел видел одни и те же доказательства.
Цепочка решает. Она подсчитывает раскрытые голоса по своим собственным правилам — взвешенно по стейку, с нижним порогом засчитанных голосов, переоткрывая раунд при ничьей вместо того чтобы её разбить — и двигает эскроу.
Офчейн-слой не подсчитывает
Раньше подсчитывал. getDispute возвращал решение, выведенное из раскрытий,
которые видел узел, и это было неверно в поучительном смысле, потому что это
ошибка, которая выглядит как помощь.
Два подсчёта одних и тех же голосов — это генератор расхождения, а не второе мнение. Цепочка переарбитрирует по другим правилам, поэтому может прийти к другому ответу по тому же спору — и когда приходит, интерфейс показывает один исход, а деньги следуют другому. Цепочка — это власть над эскроу, поэтому офчейн-ответ не второе мнение: это утверждение, которое протокол делает, а затем опровергает собственными средствами.
Поэтому resolution задаётся ровно одной вещью: транзакцией исполнения, которую
этот узел независимо наблюдал подтверждённой, чей исход он затем прочитал из
аккаунта дела в цепочке.
AwaitingChainExecution — это реальный ответ
Когда приходит каждое требуемое раскрытие, дело остаётся в
AwaitingChainExecution. Это состояние говорит, что офчейн-слой закончил свою
работу, а эскроу ещё не сдвинулся. Это не «разрешено, ожидает исполнения» — такая
формулировка притязала бы на исход, называть который узел не вправе.
Узел, который видел, как транзакция приземлилась, но не смог прочитать, что она
решила, остаётся в AwaitingChainExecution и записывает подпись, которую
наблюдал. В цепочке что-то произошло, а этот узел ещё не знает что; сказать об
этом — честный ответ, а выдумать вердикт, чтобы заполнить пробел, — это ровно тот
сбой, который данное правило устраняет.
Согласие сторон — не исключение
Обе стороны могут договориться о взаимном урегулировании, и офчейн-слой проверяет обе подписи напрямую. Он записывает это согласие, как только его имеет, — это реальный факт о деле, и удержание его скрыло бы от сторон их собственное решение.
Но записать согласие не значит записать разрешение. Пока эскроу фактически не
сдвинулся, дело находится в AwaitingChainExecution, как любое другое.
Это легко перепутать, потому что, в отличие от постановления, здесь нет вычисления, которое два узла могли бы выполнить по-разному — согласие просто есть две подписи. Оно всё равно должно ждать, по двум причинам:
- Подписи не двигают деньги. Дело, помеченное
MutualSettlement, пока средства заблокированы, говорит обеим сторонам, что спор окончен и оплачен, тогда как ни то ни другое не верно. - Цепочка исполняет по своим срокам. Она остаётся вправе исполнить арбитражный исход по делу, стороны которого договорились приватно и так и не передали это, — снова вводя два слоя в противоречие по одному спору, что и существует всё это правило чтобы предотвратить.
Что должен показывать клиент
| Узел говорит | Показать |
|---|---|
resolution: null, статус AwaitingChainExecution | Дело решено или согласовано; эскроу ещё не сдвинулся |
resolution задан, с подписью исполнения | Исход и транзакция, из которой он пришёл |
| Раскрытия собраны, изменения статуса нет | Сбор доказательств; исхода для показа не существует |
Не выводите исход из раскрытий в ответе getDispute. Они там для того, чтобы
любой мог проверить, что было дано цепочке, а не чтобы клиент пришёл к своему
вердикту — клиент, который их подсчитывает, вновь ввёл ровно то расхождение,
которое узел перестал производить.
См. OFS-2400 §16.2 и §17 для нормативной формулировки.