Giter Site home page Giter Site logo

commons-budget-contract's People

Contributors

jkkang-kosac avatar linked0 avatar michaelkim20 avatar

Watchers

 avatar  avatar  avatar  avatar

commons-budget-contract's Issues

Ballot commitment 항목 변경

지금 현재 commitment 계산은 VoteraVote 에서 다음과 같이 하고 있습니다.

dataHash = keccak256(abi.encode(voteContract, _proposalID, _validator, _choices[i], _nonces[i]));

여기에서 voteContract는 address voteContract = address(this); 로 현재 contract의 주소를 사용하고 있는데
#11 과 같이 proxy를 사용하거나 다른 연유로 인해 외부에서 호출하는 contract 주소와 내부에서 처리하는 contract 주소가 다른 경우에 문제가 생길 수 있습니다.

해결 방안은

  1. voteContract를 빼서 계산
  2. voteContract를 address(this) 가 아닌 contract의 state variable로 owner가 설정할 수 있도록 변경

저는 1번 방안으로 하는 것이 좋을 것 같은데 의견 있으시면 알려주시기 바랍니다.

검증자 정체와 검증자 세트에 대한 체크

적은 수의 검증자만이 있는 초기 상황에서, 공격자가 검증자로 위장하여 커먼스 버짓의 함수들을 호출상황이 있을수 있다. 공격자의 목적은 자금의 탈취나 부당한 이득을 취하는 것이다. 따라서, 문제가 있을 수 있는 상황을 정리하고, 대응 필요시 방안을 정리하고, 최적의 방안을 구현한다.

추가적인 조사 진행 필요.

Definition of done:

  • VoteraVoteaddValidators 함수를 CommonsBudget 함수로 옮기고, 커먼스 버짓 관리자가 호출하도록 한다.
  • 지정된 검증자 수가 넘지 않았으면 투표 진행관련 함수가 호출되지 않도록 한다.
  • addValidators 호출시, 각 검증자가 40K 보아를 가지고 있는지와 EOA 계정인지 확인한다. (optional)

자금 인출 가능 여부 확인 함수 구현

#14 의 하위 이슈로서 자금인출 가능여부를 확인하는 다음의 함수를 구현합니다. 컨트랙트 사이즈 이슈로 구현이 안되었으며, #11 이슈가 해결되면서 진행할 예정입니다.

// 해당 제안에 대한 인출여부를 확인하는 함수입니다. 리턴되는 code의 값이 "W00" 일때만 인출이 가능합니다.
function checkWithdrawState(bytes32 _proposalID) external returns (string code, uint256 countingFinishTime);

EDIT
withdraw 함수도 원래의 설계대로 다음과 같이 구현하려고 했으나 트랜잭션을 발생하는 함수이기 때문에 리턴값을 제공하지 않는 기존의 구현을 유지 한다.
// 해당 제안에 대해서 펀딩자금을 인출하는 코드입니다.
function withdraw(bytes32 _proposalID) external returns;

집계가 종료된 후 투표의 유효성, 가부상태를 검사하고 기록한다.

컨트랙트 VoteraVote의 함수 countVote에서 투표용지를 집계한 후 커먼스버짓 컨트랙트의 함수 finishVote()를 호출한다.
다음 기능을 커먼스버짓 컨트랙트에 구현한다.

  1. 투표에 참여한 검증자들의 수가 의결정족수 조건을 충족하는지를 체크한다. 만약 의결정족수 조건을 충족하지 못하면 투표를 무효처리한다.
  2. 투표의 결과가 가결인지 부결인지를 판단한다.
  3. 투표의 결과와 투표가 종료된 블록의 시간을 기록한다.
  4. ProposalStates 에 필요한 상태를 추가한다.

제안 투표 진행 단계에 따른 Event 추가

현재 CommonsBuget은 제안 금액 인출시에 발생하는 FundTransfer Event 만을 가지고 있다. 다음의 상태에 대한 이벤트의 추가가 필요하다.

    // @notice This event is emitted when a assessment is finished
    // @param proposalID id of proposal
    event AssessmentFinish(bytes32 proposalID, bool assessResult);

    // @notice This event is emitted when a vote counting is finished
    // @param proposalID id of proposal
    event VoteCountingFinish(bytes32 proposalID, bool countingResult);

    // @notice This event is emitted when funding is refused by the owner
    // @param proposalID id of proposal
    event FundWithdrawReject(bytes32 proposalID);

    // @notice This event is emitted when funding is allowed by the owner
    // @param proposalID id of proposal
    event FundWithdrawAllow(bytes32 proposalID);

Definition of done:

  • Event 코드 추가
  • 테스트 코드 추가

업그레이드 가능한 스마트 컨트랙트에 대한 고려

제안에 대한 데이터를 유지하면서도, 제안을 처리하는 알고리즘을 변경할 필요가 있으므로 업그레이드 가능한 컨트랙트에 대해서 검토가 필요하다.

Definition of done:

  • 테스트 코드 등 리팩토링
  • CommonsBudget 컨트랙트 분리
  • OpenZeppelin Upgrades Plugins 적용

개요

현재 진행되는 CommonsBudget 컨트랙트의 구현에서도 다음의 룰을 컨트랙트 오너가 수정할 수 있다.

  • 펀드 제안 수수료율
  • 시스템 제안 수수료
  • 정족수 비율

하지만, 이외의 변경에 대해서는 예측할 수 없으므로, 업그레이드 가능한 컨트랙트가 필요할 수 있으며 다음과 같은 composition 방식을 고려할 수 있다. 이외에도 inheritance 방식과 proxy contract 방식이 있다.

contract ProposalStorage is Ownable {
    mapping(bytes32 => ProposalData) private proposalMaps;
    function saveProposalData(...) public { ... }
}

contract CommonsBudget is Ownable, IERC165, ICommonsBudget {
    ProposalStorage store;
    
    constructor (address storage) {
         store = ProposalStorage(storage);
    }

    function createFundProposal(...) external payable override onlyInvalidaProposal(_proposalID) {
         store.saveProposalData(...);
    }

    function createSystemProposal(...) external payable override onlyInvalidaProposal(_proposalID) {
         store.saveProposalData(...);
    }
}

정책변수 세팅함수 복원

컨트랙트 사이즈 이슈때문에 제거된 다음의 정책 변수 세팅함수를 복원해야 합니다.

setFundProposalFeePermil, setSystemProposalFee, setVoteQuorumFactor, setVoterFee

#11 이슈가 컨트랙트 분리와 관련이 있어서 함께 진행될 예정입니다.

제안자가 펀딩금액을 받아 갈 수 있는 기능을 구현한다

다음 조건일 때 펀딩제안에 대한 펀딩금액을 지급받을 수 있도록 합니다.

  1. 투표의 결과가 가결일 때
  2. 요청한 시간이 개표종료시간으로 부터 24시간 초과 일때
  3. 제안자의 요청일때
  4. 거부권이 행사되지 않았을 때
  5. 펀딩금액이 이미 지급되지 않았을 때

테스트 네트워크 상에서 대량 검증자 테스트

지금까지 hardhat 네트워크를 기반으로 많아야 100명 정도의 검증자로 테스트를 진행하였다. 이 테스트들을 DevNet과 TestNet 네트워트에서 진행할 수 있도록 하는, 1000명 이상의 검증자를 기반으로 진행될 수 있는 테스트 코드를 작성한다.
기존의 테스트 코드를 활용하기에는 중복되는 내용이 많기 때문에 따로 대용량 검증자을 가지고 테스트 네트워크(DevNet, TestNet) 상에서 테스트할 수 있는 테스트 코드를 작성한다.

Definition of done:

  • 테스트 네트워크용 테스트 스크립트 작성
  • validator 정보 json 파일로부터 1000명 이상의 검증자 정보 만들기
  • 테스트용 web3 화면을 작성하여 web3 연동 테스트

스마트 컨트랙트에 탈중앙화 요소 반영

현재 구현되어 있는 CommonsBudget 컨트랙트에 탈중화 내용을 반영하기 위한 다음의 작업을 진행한다.

Definition of done:

  • 수수료등 설정값 변경 기능 제거(모든 값을 상수로 처리)
  • 비밀투표 요소 제거
  • Admin, Manager 권한 제거
  • Vote Manager 권한 제거
  • IFPS 연동 관련 사항 설계 및 반영

고려할 사항

  • 제안 생성시 signature 제거하고, 현재 Votera서버 검증 내용 반영
  • docHash 관련 코드 제거하고 제안 무결성 및 정합성 체크 추가
  • 테스트 코드 및 스크립트 수정

`VoteState`의 `RUNNING` 상태 관련 변경 필요

현재 VoteState는 다음과 같이 정의되어 있다.

enum VoteState {
    INVALID,
    CREATED,
    RUNNING,
    FINISHED
}

현재의 구현에서 setupVoteInfo함수에서 다음과 같이 투표 상태를 VoteState.RUNNING으로 세팅한다.

    voteInfos[_proposalID].state = VoteState.RUNNING;

현재 #15 에서 투표하기 시작하기 전에, 검증자 비용을 전달하는 것으로 구현하고 있다. 따라서, RUNNING의 상태는 검증자들에게 투표 비용을 모두 지불한 이후에 설정되고, 기존의 RUNNING을 사용하던 부분에 대해서는 READY와 같은 추가적인 상태가 필요할 것으로 보인다. CommonsBudget은 검증자들에게 투표비용을 모두 지불했는지를 체크할 수 있는 isVoteFeePaid함수를 제공한다.

추가적으로 setupVoteInfo라는 함수명 대신 readyToVotesetReadyVote같이 제안 프로세스 상에서의 하나의 상태를 지정하는 의미를 가진 함수명으로 변경되어야 할 것으로 보인다.

다른 의견이나 추가적인 의견이 있으면 말씀해 주세요.

투표비용을 지불하는 기능을 구현한다

  1. 제안서가 생성된 후, 투표시작전, 검증자들에게 전달합니다.
  2. 검증자 리스트는 VoteraVote 컨트랙트의 ValidatorMap를 사용합니다.
  3. 모든 검증자에게 투표비용을 지급합니다.
  4. 투표비용은 x BOA를 기본으로 설정하고, 수정될 수 있도록 합니다.
  5. 투표비용은 커먼스버짓에서 제공합니다.
  6. 투표비용은 하나의 제안에 대해서 1회만 지출될 수 있도록 합니다.
  7. 투표비용을 지불하는 메소드를 호출하는 관리자는 이 메소드를 호출하는 과정에서 많은 트랜잭션 수수료를 지불해야 합니다.
    검증자의 수에 따른 예상되는 수수료를 계산하여 메소드를 호출한 관리자 계정으로 그 금액이 지급되도록 하는 기능을 구현합니다.

Definition of done:

  • 검증자에 투표비용 제공
  • 검증자에 평가비용 제공
  • 기타 가스비에 대한 내용 정리(보테라 관리자에 검증자 추가 비용제공, 투표용지 공개할때 비용, 검증자 투표비용 지불할때 비용등)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.