- Контракты написаны в рамках хаккатона Phystech Business Solutions специально для Zerion.
- Контракты размещен в сети Kovan: https://kovan.etherscan.io/address/0xD871A341fE03823D62E2f09f87eE54404Bd3484B https://kovan.etherscan.io/address/0x4e05976904A508958072c027345D7D17201b510f#code
- В качестве "децентрализованного суда" в целях демонстрации выступает контракт с адресом
0x08F800979535088e669658E7B97701D1aA65FCFE
(он же владелец контракта)
Идея контракта в обеспечении честного P2P обмена, без привлечения посредника, но с необходимостью оставлять залог.
- Посредник инициирует обмен, отправляя транзакцию
sendOffer(address buyer)
с количеством эфира, в два раза большим чем сумма желаемого обмена (т.к. вторая половина резервируется на случай оплаты суда). При этом вызывается событие, содержащееsessionId
- Покупатель может принять обмен вызвав
acceptOffer(uint sessionId)
. При этом он должен заложить как минимум половину от отправленной продавцом суммы (на оплату суда) (в этот момент продавец ещё может отменить обмен вызвавcancelTrade(uint sessionId)
) - Далее покупатель нажимает
approveBuyer(uint sessionId)
и отправляет фиат на счёт продавца. После этого продавец не сможет отменить обмен. - Продавец ждет поступления фиата на счёт и после его получения нажимает
approveBuyer(uint sessionId)
, после чего покупателю отправляется половина залога продавца, а вторая половина возвращается продавцу. - Если покупатель не отправляет деньги, либо продавец не подтверждает получение денег, любая сторона может обратиться в суд, вызвав
callTheCourt(uint sessionId)
. Далее суд примет решение, и с помощью функцииtransferMoneyTo(uint sessionId, address to)
переведет деньги потерпевшей стороне, при этом деньги на оплату суда взымутся со стороны, нарушевшей правила обмена.
Идея контракта в обеспечении честного P2P обмена, с привлечением посредника, без необходимости оставлять залог.
- Посредник инициирует обмен, отправляя транзакцию
sendOffer(address buyer, address seller)
с количеством эфира, в три раза большим чем сумма желаемого обмена (для возможного покрытия издержек суда и другой стороны). При этом вызывается событие, содержащееsessionId
- Далее, в течении отведённого времени (в контракте это 1 минута), Стороны отправляют деньги посреднику, который пересылает их другой стороне. В течении этого времени посредник не может вывести свой залог. Он заблокирован контрактом.
- Если кто то из сторон не получил деньги, он может вызвать суд
callTheCourt(uint sessionId)
заплатив при этом ровно 1/3 от залога посредника. Во время суда посредник не может закончить обмен и вывести свой залог. - Суд принимает одно из четырёх решений: обманут продавец, обманут покупатель, обмануты оба или не обманут никто
transferMoney(uint sessionId, uint option)
. В каждом из этих случаев суд забирает плату за свою работу за счёт стороны, которая не права (либо ложный вызов суда, либо обман посредником). - Если время обмена вышло, посредник завершает обмен вызвав
finishTrade(uint sessionId)
.