Перейти к основному содержимому

Как разрешается спор

У спора две половины, и только одна из них что-либо решает.

Офчейн-слой собирает. Он проверяет подпись каждого арбитра, сверяет раскрытие с более ранним коммитом этого арбитра, отклоняет раскрытие от кошелька, который никогда не делал коммит, отбрасывает дубликаты и реплицирует результат, чтобы каждый узел видел одни и те же доказательства.

Цепочка решает. Она подсчитывает раскрытые голоса по своим собственным правилам — взвешенно по стейку, с нижним порогом засчитанных голосов, переоткрывая раунд при ничьей вместо того чтобы её разбить — и двигает эскроу.

Офчейн-слой не подсчитывает

Раньше подсчитывал. getDispute возвращал решение, выведенное из раскрытий, которые видел узел, и это было неверно в поучительном смысле, потому что это ошибка, которая выглядит как помощь.

Два подсчёта одних и тех же голосов — это генератор расхождения, а не второе мнение. Цепочка переарбитрирует по другим правилам, поэтому может прийти к другому ответу по тому же спору — и когда приходит, интерфейс показывает один исход, а деньги следуют другому. Цепочка — это власть над эскроу, поэтому офчейн-ответ не второе мнение: это утверждение, которое протокол делает, а затем опровергает собственными средствами.

Поэтому resolution задаётся ровно одной вещью: транзакцией исполнения, которую этот узел независимо наблюдал подтверждённой, чей исход он затем прочитал из аккаунта дела в цепочке.

AwaitingChainExecution — это реальный ответ

Когда приходит каждое требуемое раскрытие, дело остаётся в AwaitingChainExecution. Это состояние говорит, что офчейн-слой закончил свою работу, а эскроу ещё не сдвинулся. Это не «разрешено, ожидает исполнения» — такая формулировка притязала бы на исход, называть который узел не вправе.

Узел, который видел, как транзакция приземлилась, но не смог прочитать, что она решила, остаётся в AwaitingChainExecution и записывает подпись, которую наблюдал. В цепочке что-то произошло, а этот узел ещё не знает что; сказать об этом — честный ответ, а выдумать вердикт, чтобы заполнить пробел, — это ровно тот сбой, который данное правило устраняет.

Согласие сторон — не исключение

Обе стороны могут договориться о взаимном урегулировании, и офчейн-слой проверяет обе подписи напрямую. Он записывает это согласие, как только его имеет, — это реальный факт о деле, и удержание его скрыло бы от сторон их собственное решение.

Но записать согласие не значит записать разрешение. Пока эскроу фактически не сдвинулся, дело находится в AwaitingChainExecution, как любое другое.

Это легко перепутать, потому что, в отличие от постановления, здесь нет вычисления, которое два узла могли бы выполнить по-разному — согласие просто есть две подписи. Оно всё равно должно ждать, по двум причинам:

  • Подписи не двигают деньги. Дело, помеченное MutualSettlement, пока средства заблокированы, говорит обеим сторонам, что спор окончен и оплачен, тогда как ни то ни другое не верно.
  • Цепочка исполняет по своим срокам. Она остаётся вправе исполнить арбитражный исход по делу, стороны которого договорились приватно и так и не передали это, — снова вводя два слоя в противоречие по одному спору, что и существует всё это правило чтобы предотвратить.

Что должен показывать клиент

Узел говоритПоказать
resolution: null, статус AwaitingChainExecutionДело решено или согласовано; эскроу ещё не сдвинулся
resolution задан, с подписью исполненияИсход и транзакция, из которой он пришёл
Раскрытия собраны, изменения статуса нетСбор доказательств; исхода для показа не существует

Не выводите исход из раскрытий в ответе getDispute. Они там для того, чтобы любой мог проверить, что было дано цепочке, а не чтобы клиент пришёл к своему вердикту — клиент, который их подсчитывает, вновь ввёл ровно то расхождение, которое узел перестал производить.

См. OFS-2400 §16.2 и §17 для нормативной формулировки.