Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Idea/Proposal: DataDAO #25

Open
gmelodie opened this issue Feb 1, 2023 · 0 comments
Open

Idea/Proposal: DataDAO #25

gmelodie opened this issue Feb 1, 2023 · 0 comments
Assignees

Comments

@gmelodie
Copy link

gmelodie commented Feb 1, 2023

Proposal: DataDAO

Author Gabriel Cruz
Status Draft
Revision 0.0.1

Proposal/Overview

DataDAO is an organization that curates data stored in Filecoin, allowing its members to vote on the CIDs that should be part of the collection of curated data.

Obs: heavily inspired in idea and code snippets from https://aayushguptaji.hashnode.dev/how-to-build-your-first-datadao-factory-on-fvm

Why this is important

There has been increased demand for useful data on the Filecoin network. Allowing peers to vote on CIDs that contain this type of data incentivizes more quality of data in Filecoin.

Non-goals

We are not trying to ensure that the accepted CIDs actually have "useful" data (whatever the definition of "useful" is). We only allow for voting. It is up to the members of the organization to revise the contents of the proposals and vote wisely.

Design Overview

  1. Storage Provider (SP) creates a proposal to add a CID to DataDAO.
  2. DataDAO members vote on the proposal until it expires.
  3. Once expired, if upvotes > downvotes, the CID is added to the DataDAO.

Detailed Design

Another level of detail beyond the design overview, if needed.

Creating Proposal

SP will create a proposal using the following function

    function createCIDProposal(bytes calldata cidraw, uint size) public {
        proposalCount++;
        Proposal memory proposal = Proposal(proposalCount, msg.sender, cidraw, size, 0, 0, block.timestamp, block.timestamp + 1 hours);
        proposals[proposalCount] = proposal;
        cidSet[cidraw] = true;
        cidSizes[cidraw] = size;
    }

Voting on a Proposal

DataDAO members upvote or downvote the Proposal

    function voteCIDProposal(uint256 proposalID, bool upvote) public {
        require(proposals[proposalID].storageProvider != msg.sender, "Storage Provider cannot vote his own proposal");
        require(!hasVotedForProposal[msg.sender][proposalID], "Already Voted");
        require(!votingIsExpired(proposalID), "Voting Period Finished");

        if (upvote == true) {
            proposals[proposalID].upVoteCount = proposals[proposalID].upVoteCount + 1;
        } else {
            proposals[proposalID].downVoteCount = proposals[proposalID].downVoteCount + 1;
        }

        hasVotedForProposal[msg.sender][proposalID] = true;
    }

Add voted CID to DataDAO

TODO

Miscellaneous

Data and auxiliary variables

contract DataDAO {
    uint64 constant public AUTHORIZE_MESSAGE_METHOD_NUM = 2643134072; 
    // number of proposals currently in DAO
    uint256 public proposalCount;
    // mapping to check whether the cid is set for voting 
    mapping(bytes => bool) public cidSet;
    // storing the size of the cid
    mapping(bytes => uint) public cidSizes;

    mapping(bytes => mapping(bytes => bool)) public cidProviders;

    // address of the owner of DataDAO
    address public immutable owner;

    struct Proposal {
        uint256 proposalID;
        address storageProvider;
        bytes cidraw;
        uint size;
        uint256 upVoteCount;
        uint256 downVoteCount;
        uint256 proposedAt;
        uint256 proposalExpireAt;
    }

    // mapping to keep track of proposals
     mapping(uint256 => Proposal) public proposals;

    // mapping array to track whether the user has voted for the proposal
    mapping(address => mapping(uint256 => bool)) public hasVotedForProposal;

/**
 * @dev constructor: to set the owner address
 */
constructor(address _owner) {
     require(_owner != address(0), "invalid owner!");
     owner = _owner;
}

Check if voting time has expired

    function votingIsExpired(uint256 proposalID) view public returns(bool) {
       return proposals[proposalID].proposalExpireAt <= block.timestamp;
    }

application-research/estuary#880

@gmelodie gmelodie self-assigned this Feb 1, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant