Tech

Tech

Alex Nikolaev


RassvetDAO


Условные обозначения :

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 :


  1. Users must always look up the current address, and anyone who fails to do so risks using an old version of the contract
  2. 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.)

Report Page