gagarinchain / network

Network implementation
1 stars 0 forks source link

Settlements #1

Open gagarinchain opened 5 years ago

gagarinchain commented 5 years ago

Settlement

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

Инициатор, который делает токенизацию (выпускает или изымает токены), инициирует транзакцию типа SETTLEMENT, со следующими полями:

type = Type.SETTLEMENT ## запрос на сеттлмент
to = default ## специальный адрес, константа используется чтобы облегчить расчет хэша транзакции
nonce = nonce ## нонс
value = amount ## сумма, на которую изменяется баланс, может быть отрицательной 
fee = fee + default_reward ## суммарная награда, которую получат custodians
signature = sign ## подпись
data = script_to_validate ## сейчас это просто имя grpc сервиса, который генерирует стандартный ответ, в идеале это должен быть некий скрипт, который подтверждает совершение блокировки средств и т д

После включения такой транзакции в блок, создается account с адресом address(settlment_hash), на него зачисляется fee - default_fee Сustodians(сейчас для простоты это commitee) могут сгенерировать транзакцию типа AGREEMENT, следующего вида:

type = Type. AGREEMENT ## одобрение сеттлмента
to = address(settlment_hash) ## адрес сгенерированный по хешу settlment
nonce = nonce ## нонс
value = amount ## 0
fee = fee ## комиссия
signature = sign ## подпись
data = proof ## sign(settlment_hash, pk)

Инициатор токенизации, должен собрать 2N/3 + 1 proof и выпустить транзакцию proof следующего вида

type = Type. PROOF ## одобрение сеттлмента
to = address(settlment_hash) ## адрес сгенерированный по хешу settlment
nonce = nonce ## нонс
value = amount ## 0
fee = fee ## комиссия
signature = sign ## подпись
data = proof ## aggregate_sign(sign(settlment_hash, pki)…)

После включения PROOF в блок (proof верен) баланс инициатора меняется на value, вознаграждение делится равно на всех участников proof

gagarinchain commented 5 years ago

похоже, что единственный способ не хранить в аккаунте список приславших Agreement, это делить reward пропорционально на всех custodian. проблема этого подхода в том, что кто-то при этом заплатит комиссию, кто-то нет (так как собираем мы 2N/3 + 1 голосов и часть может просто не голосовать). не брать комиссию с Agreement тоже плохо, так как либо злоумышленник может заспамить сеть такими транзакциями и остановить прогресс либо они вообще не попадут в блок в зависимости от приоритезации пула

самым правильным на данный момент выглядет вариант с сохранением списка голосовавших в аккаунте и соответственно в стейте, нужно подумать о последствиях такого расширения аккаунта