>기술 주변기기 >IT산업 >이더 리움 DAPP 구축 : 맞춤형 토큰으로 투표

이더 리움 DAPP 구축 : 맞춤형 토큰으로 투표

Christopher Nolan
Christopher Nolan원래의
2025-02-16 10:35:10205검색

Building Ethereum DApps: Voting with Custom Tokens

코어 포인트

항목 삭제 및 블랙리스트 주소를 포함하여 제안 투표를 위해 DAO에서 사용자 정의 토큰을 사용하여 분산 거버넌스 및 운영 유연성을 향상시킵니다.

투표 중에 토큰 소유권 및 잠금 토큰을 검증 해야하는 강력한 투표 메커니즘을 구현하여 조작을 방지하고 헌신을 보장합니다.
    질서 있고 효율적인 DAO 운영을 유지하기 위해 구조화 된 마감일 및 구현 표준을 갖춘 제안 및 투표 시스템을 설계합니다.
  • 제안서 생성을 회원 전용으로 제한하고 DAO 소유자가 제어하는 ​​비상 삭제 기능을 가능하게하여 잠재적 인 보안 문제를 해결합니다.
  • 가스 비용을 관리하고 성공적인 배포를 보장하기위한 코드 최적화의 중요성을 강조하면서 이더 리움에 대규모 스마트 계약을 배치하기위한 기술적 과제와 솔루션을 탐색합니다.
  • 이 튜토리얼 시리즈의 다섯 번째 부분은 이더 리움을 사용하여 DAPP 구축을 소개하며, 스토리에 컨텐츠 추가와 DAO에서 토큰을 구매하고 참가자를위한 이야기에 컨텐츠를 제출하는 능력을 추가하는 방법에 대해 논의합니다. 지금은 DAO의 최종 형태 인 투표, 블랙리스트의 포함/부전, 배당 분배 및 철수의 시간입니다. 우리는 여분의 도우미 기능을 추가 할 것입니다.
  • 이에 의해 혼란스러워지면 전체 소스 코드는 코드 기반에서 찾을 수 있습니다.
  • 투표와 제안 우리는 투표를 위해 제안과 투표를 사용할 것입니다. 우리는 두 가지 새로운 구조가 필요합니다 :
  • 제안에는 사람들이 한 제안서에 두 번 투표하는 것을 막기 위해 유권자지도와 자기 설명이어야 할 다른 메타 데이터가 포함됩니다. 투표는 유권자의 투표가되거나 유권자의 이유와 투표권, 즉이 제안에 투표하기 위해 사용하고자하는 토큰의 수를 기억할 것입니다. 또한 제안 수를 계산하기위한 카운터뿐만 아니라 어딘가에 보관할 수 있도록 다양한 제안을 추가했습니다.
이제 투표 기능으로 시작하여 지원 기능을 구축합시다.

참고 : 함수 수정 자 참고 :이 수정자를 계약에 추가하면 미래의 기능에이를 추가하고 토큰 보유자 만 기능을 실행할 수 있는지 확인할 수 있습니다. 이것은 재사용 가능한 보안 점검입니다!

투표 기능은 투표 권한이 긍정적이며 유권자는 실제로 투표 할 수있는 충분한 토큰을 가지고 있습니다. 그런 다음 스토리지에서 제안서를 가져 와서 만료되거나 실행되지 않도록합니다. 완료된 제안에 투표하는 것은 의미가 없습니다. 또한이 사람이 아직 투표하지 않았는지 확인해야합니다. 우리는 투표권이 변경 될 수 있지만, 이로 인해 마지막 순간에 투표를 철회하는 사람들 등과 같은 허점에 DAO를 넣을 수 있습니다. 아마도 미래 버전의 후보자일까요?

그런 다음 새 투표를 제안서에 등록하고 현재 결과를 변경하여 점수를 찾은 다음 최종적으로 투표 이벤트를 발행합니다. 그러나 Token.increaSelockedAmount 란 무엇입니까?

이 논리는 사용자의 잠긴 토큰의 수를 증가시킵니다. 이 기능은 토큰 계약의 소유자에 의해서만 실행될 수 있으며 (이번에는 DAO가 될 것으로 예상됩니다) 사용자가 자신의 계정에 등록 된 잠긴 금액보다 더 많은 것을 보내지 못하게합니다. 이 잠금은 제안서가 실패하거나 실행 된 후에 해제됩니다.

이제 삭제 항목을 제시하기위한 함수를 작성해 봅시다.

삭제 및 블랙리스트에 투표

이 시리즈의 첫 번째 부분에서, 우리는 세 가지 입력 삭제 함수를 계획했습니다.

입력 삭제 : 확인 확인 후 대상 항목을 삭제하십시오. 투표 시간 : 48 시간. 비상 삭제 항목 [소유자 만] : 소유자만이 트리거됩니다. 확인 확인 후 대상 항목을 삭제하십시오. 투표 시간 : 24 시간. 비상 삭제 사진 [소유자 만] : 그림 항목에만 적용됩니다. 소유자에 의해서만 트리거됩니다. 확인 확인 후 대상 항목을 삭제하십시오. 투표 시간 : 4 시간.

단일 주소에 대해 5 개의 항목을 삭제하면 블랙리스트가 발생합니다.

우리가 지금 어떻게하는지 봅시다. 먼저 함수를 삭제하십시오
    제출 후 제안서는 제안 목록에 추가되고 대상 항목은 입력 해시에 의해 기록됩니다. 설명을 저장하고 기본값을 추가하고 제안 유형에 따라 마감일을 계산하십시오. 부가자 이벤트가 발행되고 총 제안 수가 증가합니다.
  1. 다음, 제안서를 구현하는 방법을 살펴 보겠습니다. 집행 가능하면 제안서는 충분한 투표를 가져야하며 마감일을 초과해야합니다. 실행 함수는 실행될 제안의 ID를 수락합니다. EVM이 한 번에 보류중인 모든 제안을 실행하는 쉬운 방법은 없습니다. 실행할 보류 제안이 너무 많을 수 있으며 DAO의 데이터를 크게 변경할 수 있으며, 이는 이더 리움 블록의 가스 한계를 초과하여 거래 실패를 초래할 수 있습니다. 잘 정의 된 규칙을 준수하는 사람이 호출 할 수있는 수동 실행 기능을 구축하는 것이 훨씬 쉽습니다. 따라서 커뮤니티는 실행 해야하는 제안에 집중할 수 있습니다.
  2. 우리는 신분증으로 제안서를 받고, 비정규직을 충족하고 마감일이 만료되었는지 확인한 다음 제안 유형이 제안서를 삭제하고 투표가 긍정적 인 경우 서면 삭제 기능을 사용하고 마지막으로 투표를합니다. 새 이벤트를 발급하십시오 (계약 상단에 추가). Assert Call은 요구 사항이있는 것과 같은 방식으로 작동합니다. Assert는 일반적으로 결과가 사실입니다. 필수는 전제 조건에 사용됩니다. 기능적으로 그것들은 동일합니다. 차이점은 Assert 진술이 실패한 상황을 처리하기 위해 메시지 매개 변수를 받아 들일 수 없다는 것입니다. 이 기능은 제안서의 모든 투표에 대해 토큰을 잠금 해제함으로써 끝납니다.
  3. 우리는 동일한 방법을 사용하여 다른 유형의 제안서를 추가 할 수 있지만 먼저, DeletEsubmission 함수를 업데이트하여 사용자에게 자신의 계정에 5 개 이상의 삭제를 금지합니다. 이는 항상 커뮤니티가 반대하는 콘텐츠를 제출하는 것을 의미합니다. deletesubmission 함수를 업데이트합시다
    <code>struct Proposal {
        string description;
        bool executed;
        int256 currentResult;
        uint8 typeFlag; // 1 = delete
        bytes32 target; // 提案目标的ID。例如,标志1,目标XXXXXX(哈希)表示删除submissions[hash]的提案
        uint256 creationDate;
        uint256 deadline;
        mapping (address => bool) voters;
        Vote[] votes;
        address submitter;
    }
    
    Proposal[] public proposals;
    uint256 proposalCount = 0;
    event ProposalAdded(uint256 id, uint8 typeFlag, bytes32 hash, string description, address submitter);
    event ProposalExecuted(uint256 id);
    event Voted(address voter, bool vote, uint256 power, string justification);
    
    struct Vote {
        bool inSupport;
        address voter;
        string justification;
        uint256 power;
    }</code>
    <.> 이것은 더 좋습니다. 자동으로 블랙리스트 및 5 번 삭제되었습니다. 블랙리스트 주소에게 구속 할 기회를주지 않는 것은 불공평합니다. 또한 블랙리스트 기능 자체를 정의해야합니다. 이 두 가지를 모두 수행하고 예를 들어 블랙리스트를 0.05 에테르로 취소하기 위해 수수료를 설정합시다.

    블랙리스트 계정에 대한 토큰은 블랙리스트를 취소하기 위해 수수료를 보낼 때까지 잠겨 있습니다.
    <code>modifier tokenHoldersOnly() {
        require(token.balanceOf(msg.sender) >= 10**token.decimals());
        _;
    }
    
    function vote(uint256 _proposalId, bool _vote, string _description, uint256 _votePower) tokenHoldersOnly public returns (int256) {
    
        require(_votePower > 0, "At least some power must be given to the vote.");
        require(uint256(_votePower) <= token.balanceOf(msg.sender), "Vote power exceeds token balance.");
        Proposal storage p = proposals[_proposalId];
    
        require(p.executed == false, "Proposal must not have been executed already.");
        require(p.deadline > now, "Proposal must not have expired.");
        require(p.voters[msg.sender] == false, "User must not have already voted.");
    
        uint256 voteid = p.votes.length++;
        Vote storage pvote = p.votes[voteid];
        pvote.inSupport = _vote;
        pvote.justification = _description;
        pvote.voter = msg.sender;
        pvote.power = _votePower;
    
        p.voters[msg.sender] = true;
    
        p.currentResult = (_vote) ? p.currentResult + int256(_votePower) : p.currentResult - int256(_votePower);
        token.increaseLockedAmount(msg.sender, _votePower);
    
        emit Voted(msg.sender, _vote, _votePower, _description);
        return p.currentResult;
    }</code>

    기타 유형의 투표

    위에서 쓴 기능에 대한 영감을 기반으로 다른 제안서를 작성하십시오. 스포일러의 경우 프로젝트의 GitHub 코드 기반을 확인하고 최종 코드를 여기에서 복사하십시오. 간결하게, 우리가 여전히 DAO에서 가지고있는 다른 기능으로 넘어 갑시다.

    챕터의 끝 이야기의 시간 또는 장 제한에 도달하면 이야기를 끝내야 할 때입니다. 날짜가 지나면 누구나 최종 기능을 호출 할 수있어 배당금을 철회 할 수 있습니다. 먼저, 새로운 Storydao 속성과 이벤트가 필요합니다.

    그런 다음 기능을 구축합시다 :

    단순 : 수집 된 수수료를 소유자에게 보내고 이벤트를 보내고 나면 이야기가 비활성화됩니다. 그러나 실제로 이것은 DAO의 전반적인 상황을 실제로 바꾸지 않습니다. 다른 기능은 그 끝에 반응하지 않습니다. 그래서 다른 수정 자 :

    를 만들어 봅시다

    그런 다음 아래와 같이 철수 소유자를 제외한 모든 기능 에이 수정자를 추가합니다. DAO에 여전히 토큰이 남아 있다면, 다시 가져 와서 토큰의 소유권을 가져 와서 나중에 다른 이야기를 위해 사용할 수 있습니다. UnlockyTokens 기능은 특정 사용자가 잠글 수있는 모든 잠긴 토큰을 잠금 해제하는 데 사용됩니다. 이런 일이 일어나지 않아야 하며이 기능은 많은 테스트를 통해 제거되어야합니다.

    배당 배당 분배 및 철수

    <code>modifier memberOnly() {
        require(whitelist[msg.sender]);
        require(!blacklist[msg.sender]);
        _;
    }
    
    function proposeDeletion(bytes32 _hash, string _description) memberOnly public {
    
        require(submissionExists(_hash), "Submission must exist to be deletable");
    
        uint256 proposalId = proposals.length++;
        Proposal storage p = proposals[proposalId];
        p.description = _description;
        p.executed = false;
        p.creationDate = now;
        p.submitter = msg.sender;
        p.typeFlag = 1;
        p.target = _hash;
    
        p.deadline = now + 2 days;
    
        emit ProposalAdded(proposalId, 1, _hash, _description, msg.sender);
        proposalCount = proposalId + 1;
    }
    
    function proposeDeletionUrgent(bytes32 _hash, string _description) onlyOwner public {
    
        require(submissionExists(_hash), "Submission must exist to be deletable");
    
        uint256 proposalId = proposals.length++;
        Proposal storage p = proposals[proposalId];
        p.description = _description;
        p.executed = false;
        p.creationDate = now;
        p.submitter = msg.sender;
        p.typeFlag = 1;
        p.target = _hash;
    
        p.deadline = now + 12 hours;
    
        emit ProposalAdded(proposalId, 1, _hash, _description, msg.sender);
        proposalCount = proposalId + 1;
    }    
    
    function proposeDeletionUrgentImage(bytes32 _hash, string _description) onlyOwner public {
    
        require(submissions[_hash].image == true, "Submission must be existing image");
    
        uint256 proposalId = proposals.length++;
        Proposal storage p = proposals[proposalId];
        p.description = _description;
        p.executed = false;
        p.creationDate = now;
        p.submitter = msg.sender;
        p.typeFlag = 1;
        p.target = _hash;
    
        p.deadline = now + 4 hours;
    
        emit ProposalAdded(proposalId, 1, _hash, _description, msg.sender);
        proposalCount = proposalId + 1;
    }</code>
    이제 이야기가 끝났으므로 제출에 대해 청구 된 수수료는 모든 토큰 보유자에게 할당되어야합니다. 우리는 화이트리스트를 재사용하여 이미 수수료를 철회 한 모든 사람들을 표시 할 수 있습니다.

    이 배당금이 특정 시간 제한 내에 철회되지 않으면 소유자는 나머지 부분을 얻을 수 있습니다.

    숙제로서,이 배포 된 스마트 계약을 재사용하고, 데이터를 정리하고, 수영장에 토큰을 유지하고, 다른 장을 재배치하지 않고 여기에서 다시 시작하는 것이 얼마나 쉽고 어려운지 고려하십시오. 이 작업을 직접 시도 하고이 시리즈가 다루는 향후 업데이트를 위해 코드 기반을 따르십시오! 또한 추가 인센티브를 고려하십시오. 계정의 토큰 수는 이야기가 끝날 때부터받는 배당에 영향을 미칩니다. 당신의 상상력은 무한합니다!
    <code>function executeProposal(uint256 _id) public {
        Proposal storage p = proposals[_id];
        require(now >= p.deadline && !p.executed);
    
        if (p.typeFlag == 1 && p.currentResult > 0) {
            assert(deleteSubmission(p.target));
        }
    
        uint256 len = p.votes.length;
        for (uint i = 0; i < len; i++) {
            token.decreaseLockedAmount(p.votes[i].voter, p.votes[i].power);
        }
    
        p.executed = true;
        emit ProposalExecuted(_id);
    }</code>
    <🎜 🎜> <<> 배포 문제

    <🎜 🎜> 계약이 상당히 크고, 배치 및/또는 테스트를 통해 이더 리움 블록의 가스 제한을 초과 할 수 있습니다. 이것은 대규모 응용 프로그램이 Ethereum 네트워크로 배포되는 것을 제한하는 것입니다. 어쨌든 배치하려면 다음과 같이 최적화 된 SOLC 설정을 포함하도록 Truffle.js 파일을 변경하여 컴파일하는 동안 코드 최적화기를 사용해보십시오.

    <code>struct Proposal {
        string description;
        bool executed;
        int256 currentResult;
        uint8 typeFlag; // 1 = delete
        bytes32 target; // 提案目标的ID。例如,标志1,目标XXXXXX(哈希)表示删除submissions[hash]的提案
        uint256 creationDate;
        uint256 deadline;
        mapping (address => bool) voters;
        Vote[] votes;
        address submitter;
    }
    
    Proposal[] public proposals;
    uint256 proposalCount = 0;
    event ProposalAdded(uint256 id, uint8 typeFlag, bytes32 hash, string description, address submitter);
    event ProposalExecuted(uint256 id);
    event Voted(address voter, bool vote, uint256 power, string justification);
    
    struct Vote {
        bool inSupport;
        address voter;
        string justification;
        uint256 power;
    }</code>
    배포 전에 좁아 지거나 삭제하거나 추상화 할 수있는 영역을 찾기 위해 코드에서 최적화기를 200 회 실행하여 배포 비용을 크게 줄일 수 있습니다.

    결론

    이것은 우리의 상세한 DAO 개발을 끝내지 만 코스는 아직 끝나지 않았습니다! 우리는 여전히이 이야기를 위해 UI를 구축하고 배포해야합니다. 다행히도 백엔드가 블록 체인에서 완전히 호스팅되기 때문에 프론트 엔드를 구축하는 것이 훨씬 쉽습니다. 이 시리즈의 두 번째 부분에서 이것을 살펴 보겠습니다. 이더 리움 DAPP 건설 및 맞춤형 토큰으로 투표하는 것에 대해 자주 묻는 질문

    블록 체인 투표는 실제로 어떻게 작동합니까?

    블록 체인 투표는 블록 체인 기술의 투명성과 보안을 활용하는 분산 투표 시스템입니다. 이론적으로는 완벽하게 작동해야하지만 실제로는 종종 도전에 직면합니다. 투표 절차에는 이더 리움 블록 체인에서 스마트 계약을 창출하는 것이 포함되며 각 투표는 검증 가능한 거래입니다. 그러나 유권자 익명 성, 투표 조작 및 블록 체인 플랫폼 사용의 기술적 복잡성과 같은 문제는 실제 구현을 방해 할 수 있습니다.

    DAO 투표 메커니즘은 무엇입니까? DAO (DECENTRALIZINID ACTONOMOUS ORGITOM) 투표 메커니즘은 DAO의 토큰 보유자가 토큰 소유권에 따라 제안서에 투표 할 수있는 시스템입니다. 가장 일반적인 메커니즘에는 단순한 다수의 투표가 포함되며, 제안서가 투표의 50% 이상을받는 경우 수용되고, 제안에 대한 여러 투표 비용이 기하 급수적으로 증가하는 2 차 투표. 보안 토큰에서 거버넌스는 어떻게 작동합니까?

    안전한 토큰의 거버넌스는 일반적으로 토큰 소지자가 프로젝트의 다양한 측면에 투표 할 수있는 투표 시스템을 통해 처리됩니다. 여기에는 프로젝트 개발, 토큰 경제학 및 거버넌스 시스템 자체의 변화에 ​​대한 결정이 포함될 수 있습니다. 토큰 보유자의 투표권은 일반적으로 그들이 보유한 토큰 수에 비례합니다.

    DAO 거버넌스를 설정하는 방법?

    DAO 거버넌스 설정에는 투표권 및 제안 메커니즘을 포함하여 조직의 규칙을 간략하게 설명하는 이더 리움 블록 체인에 스마트 계약을 체결하는 것이 포함됩니다. 이 계약은 블록 체인에 배치되며 투표권을 나타내는 토큰은 회원에게 분배됩니다. 그런 다음 회원은 조직 변경을 제안하고 투표 할 수 있습니다.

    DAO 거버넌스 토큰을 보유 할 위험은 무엇입니까?

    DAO 거버넌스 토큰을 보유하는 것은 암호 화폐의 변동성과 DAO를 둘러싼 규제 불확실성으로 인해 위험 할 수 있습니다. 예를 들어, CFTC (Commodity Futures Trading Commission)는 투표에 DAO 토큰을 사용하는 것이 시장 조작의 한 형태로 간주 될 수 있다고 경고합니다. 또한 DAO가 제대로 관리되지 않거나 해커 공격의 피해자가되면 토큰 보유자가 투자를 잃을 수 있습니다.

    이더 리움 DAPP에서 투표를위한 맞춤형 토큰을 만드는 방법은 무엇입니까?

    이더 리움 DAPP에서 투표에 대한 맞춤형 토큰을 만드는 데는 이더 리움 블록 체인에 스마트 계약을 작성하고 배포하는 것이 포함됩니다. 이 계약은 이름, 기호 및 총 공급과 같은 토큰의 속성을 정의합니다. 계약이 배치되면 토큰을 사용자에게 배포 할 수 있으며 사용자는이를 사용하여 DAPP의 제안서에 투표 할 수 있습니다.

    투표에 블록 체인을 사용하면 어떤 이점이 있습니까?

    블록 체인 투표는 투명성, 보안 및 불변성을 포함한 다양한 혜택을 제공합니다. 투표는 블록 체인의 거래로 기록되어 투명하고 검증 가능합니다. 블록 체인의 분산 특성은 또한 단일 당사자가 투표 과정을 조작하기가 어렵습니다.

    블록 체인 투표에서 유권자의 익명 성을 보장하는 방법은 무엇입니까?

    블록 체인 투표에서 유권자 익명 성은 블록 체인 거래의 투명한 특성으로 인해 어려울 수 있기 때문입니다. 그러나 제로 지식 증거와 같은 기술은 유권자의 신원을 밝히지 않고 유권자의 타당성을 확인하는 데 사용될 수 있습니다.

    블록 체인 투표를 구현하는 데 어떤 어려움이 있습니까?

    기술적 복잡성, 규제 불확실성 및 잠재적 보안 위험으로 인해 블록 체인 투표를 구현하는 것은 어려울 수 있습니다. 사용자는 투표 과정에 참여하기 위해 블록 체인 기술에 익숙해야하며 규제 당국은 블록 체인 투표 시스템의 정당성과 보안에 대한 우려를 표명 할 수 있습니다.

    DAO 거버넌스 토큰과 관련된 위험을 완화하는 방법은 무엇입니까?

    DAO 거버넌스 토큰과 관련된 위험 완화 위험 완화에는 신중한 DAO 관리, 철저한 보안 조치 및 항상 규제 개발을 주시하는 것이 포함됩니다. 또한 포트폴리오를 다각화하고 감당할 수있는 것보다 더 많이 투자하지 않는 것이 중요합니다.

위 내용은 이더 리움 DAPP 구축 : 맞춤형 토큰으로 투표의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.