Tech
Alex NikolaevRassvetDAO
Условные обозначения :
RC token - Rassvet Capital token,стандартартизированный ERC20\23 токен, имеющий функции передачи,хранения и тд
Архитектура
Архитектурно контракт предсттавляет из себя набор сущностей других контрактов,
с возможностью их апргрейда(способ апгрейда еще не выбран, см. пункт Upgrading Contracts ниже)
Сущности которые должны быть реализованы в основном контракте :
Task.sol
TaskManager.sol
Voting.sol
Blogger.sol
Token.sol
Вспомогательные контракты
Owned.sol
Shareable.sol
Access Control List
Task.sol
Создавать задания могут shareholder ы\привелигированные пользователи, например являющимися держателями токенов RC
Задания могут иметь несколько состояний
Unaccepted
Uncompleted
Completed
Confirmed
Rejected
При создание задания указывается адресс исполнителя, награда ,сроки
Изначальное состояние задания :
Unaccepted
Функции доступные для исполнения :
AcceptTask(), Проверяет что msg.sender = адрессу исполнителя
меняет статус задания на Uncompleted
Uncompleted
Функции доступные для исполнения :
SubmitTask(),Проверяет что msg.sender = адрессу исполнителя
меняет статус задания на Completed, запускает функцию startApproval()
StartApproval(),получает на вход множество кандидатов апруверов,
используя RNG выбирает из них случайное подмножество размерности N
Completed
Функции доступные для исполнения :
Approve(), Проверяет что msg.sender = адрессу апрувера,голос уже был учтен. Если условия голосования соблюдены(<51%) меняет статус на confirmed
reject(), Проверяет что msg.sender = адрессу апрувера,голос уже был учтен. Если условия голосования соблюдены(<51%) меняет статус на Rejected
Продумать
Функцию распределения денег апруверам
Upgrading Contracts
Option 1 : Use a registry contract to store latest version of a contract
contract SomeRegister { address backendContract; address[] previousBackends; address owner; function SomeRegister() { owner = msg.sender; } modifier onlyOwner() { if (msg.sender != owner) { throw; } _ } function changeBackend(address newBackend) public onlyOwner() returns (bool) { if(newBackend != backendContract) { previousBackends.push(backendContract); backendContract = newBackend; return true; } return false; } }
Disadvantages :
- Users must always look up the current address, and anyone who fails to do so risks using an old version of the contract
- You will need to think carefully about how to deal with the contract data, when you replace the contract
Option 2 : Use a DELEGATECALL to forward data and calls
contract Relay { address public currentVersion; address public owner; modifier onlyOwner() { if (msg.sender != owner) { throw; } _ } function Relay(address initAddr) { currentVersion = initAddr; owner = msg.sender; // this owner may be another contract with multisig, not a single contract owner } function changeContract(address newVersion) public onlyOwner() { currentVersion = newVersion; } function() { if(!currentVersion.delegatecall(msg.data)) throw; } }
Disadvantages :
You must be extremely careful with how you store data in this contract. If your new contract has a different storage layout than the first, your data may end up corrupted. Additionally, this simple version of the pattern cannot return values from functions, only forward them, which limits its applicability. (More complex implementations attempt to solve this with in-line assembly code and a registry of return sizes.)