Skip to content
This repository has been archived by the owner on Nov 16, 2018. It is now read-only.

Workflow работы с multisig contract

Vasily Nemkov edited this page Jul 7, 2018 · 26 revisions

workflow по работе backend со мультисиг смартконтрактом.

workflow по отправки с мультисиг кошелька

Создание мультисиг смартконтракта

workflow по созданию мультисиг кошелька

 Multy Core API для взаимодействия с ETH Multisig contract(s)

Всё взаимодействие, как и в случае с токенами, осуществляется через специальное свойство транзакции: multisig

Создание multisig кошелька

Сформировать транзакцию на адрес multisig factory contract, установить свойство multisig => new_wallet:[0xaddr1, ... 0xaddrN]:K, где N - количество адресов, K - количество подписей для совершения транзакции.

Запрос на оплату

Сформировать транзакцию на адрес multisig wallet contract, установить свойство multisig => new_request:0xADDRESS, где 0xADDRESS - это адрес получателя денег. Сумма запроса берется из суммы перевода транзакции.

Подтверждение

Сформировать транзакцию на адрес 0xADDRESS, установить свойство multisig => confirm:REQ_ID, где 0xADDRESS - это адрес multisig wallet contract, REQ_ID -  ID запроса на перевод денег.

Отмена подтверждения

Сформировать транзакцию на адрес 0xADDRESS, установить свойство multisig => revoke:REQ_ID, где 0xADDRESS - это адрес multisig wallet contract, REQ_ID -  ID запроса на перевод денег.

Явная отправка транзакции

Смартконтракты

исходный код Контракта-фабрики

создание мультисиг кошелька

При создании контракта фабрикой в логах контракта фабрики появятся лог Event:ContractInstantiation( где на первом месте будет адрес создателя нового смартконтракта(может не являться участником кошелька), на втором адрес созданного контракта multisig кошелька) Мы должны распарсить входную транзакцию на контракт. В поле Data первые 4 байта f8f73808- id функции(create(address[],uint256)) после этого идет массив адресов которые будут являться owner-ам контракта( владельцами кошелька) и количество подтверждений необходимых для отправки транзакции в этом кошельке. Пример транзакции создания multisig кошелька там указанны два адреса владельцев кошелька [0xfad9edb6094fc4909c6f1b236ca4dd77c1165f53, 0x4168432255d9991791dea5c24379e70261632c7c] и одно подтверждение необходимое для отправки с этого кошелька. контракт залитый в тестовую сеть



исходный код контракта multisig

Перевод денег на SC

логи:

event Deposit(address indexed sender(адрес отправитель), uint value(Количество переведенных ETH));

Такая транзакция выглядит как обычный перевод между аккаунтами. она оставляет логи описанные выше/\

Отправка денег со смарт-контракта

пример транзакции

функция submitTransaction(address destination, uint256 value, bytes data)(c6427474) передаваемые значения:

  • адрес получателя,
  • количество ETH,
  • поле data

(Должен отправлять owner контракта иначе будет отклонена транзакция)

логи:

event Submission(uint indexed transactionId(индекс новой транзакции, он используется в последствии для подтверждения транзакции другими владельцами кошелька) );

появляется когда пользователь владелец кошелька(они только и могут дергать метод submitTransaction)

event Confirmation(address indexed sender(адрес владельца подтвердившего транзакцию ), uint indexed transactionId (Номер подтверджаемой транзакции ));

Подтверждения транзакции

после того как транзакция появилась пример транзакции

confirmTransaction(uint256 transactionId)(0xc01a8c84) передаваемые значения:

  • номер подтверждаемой транзакции

владелец кошелька может отправить подтверждение транзакции присланной от бэкенда

логи:

event Confirmation(address indexed sender(адрес владельца подтвердившего транзакцию ), uint indexed transactionId (Номер подтверджаемой транзакции ));

Откат подтверждения.

пример транзакции

После того как подтвердил транзакцию, можно отвернуть конфирмацию этим методом (эти действия обратимы вызовом снова метода confirmTransaction)

revokeConfirmation(uint256)(0x20ea8d86) передаваемое значение

  • Номер транзакции в которой хотят убрать свое подтверждение

Логи:

event Revocation(address indexed sender(адрес того кто отвернул свое подтверждение), uint indexed transactionId(Индекс транзакции в которой убрано подтверждение));

Отправка транзакции

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




Методы описанные выше мы имеем возможность вызывать. Если предыдущая транзакция ждет всех подтверждений, то создавать еще одну транзакцию на подтверждение можно, они будут в листе ожидания и отправятся как только придет подтверждение. Если подтверждений будет недостаточно, то они просто останутся висеть в блокчейне.

Clone this wiki locally