-
제안서 생성을 회원 전용으로 제한하고 DAO 소유자가 제어하는 비상 삭제 기능을 가능하게하여 잠재적 인 보안 문제를 해결합니다. - 이 튜토리얼 시리즈의 다섯 번째 부분은 이더 리움을 사용하여 DAPP 구축을 소개하며, 스토리에 컨텐츠 추가와 DAO에서 토큰을 구매하고 참가자를위한 이야기에 컨텐츠를 제출하는 능력을 추가하는 방법에 대해 논의합니다. 지금은 DAO의 최종 형태 인 투표, 블랙리스트의 포함/부전, 배당 분배 및 철수의 시간입니다. 우리는 여분의 도우미 기능을 추가 할 것입니다.
- 이에 의해 혼란스러워지면 전체 소스 코드는 코드 기반에서 찾을 수 있습니다.
- 투표와 제안
우리는 투표를 위해 제안과 투표를 사용할 것입니다. 우리는 두 가지 새로운 구조가 필요합니다 : 제안에는 사람들이 한 제안서에 두 번 투표하는 것을 막기 위해 유권자지도와 자기 설명이어야 할 다른 메타 데이터가 포함됩니다. 투표는 유권자의 투표가되거나 유권자의 이유와 투표권, 즉이 제안에 투표하기 위해 사용하고자하는 토큰의 수를 기억할 것입니다. 또한 제안 수를 계산하기위한 카운터뿐만 아니라 어딘가에 보관할 수 있도록 다양한 제안을 추가했습니다.
삭제 및 블랙리스트에 투표
입력 삭제 : 확인 확인 후 대상 항목을 삭제하십시오. 투표 시간 : 48 시간.
-
제출 후 제안서는 제안 목록에 추가되고 대상 항목은 입력 해시에 의해 기록됩니다. 설명을 저장하고 기본값을 추가하고 제안 유형에 따라 마감일을 계산하십시오. 부가자 이벤트가 발행되고 총 제안 수가 증가합니다.
- 다음, 제안서를 구현하는 방법을 살펴 보겠습니다. 집행 가능하면 제안서는 충분한 투표를 가져야하며 마감일을 초과해야합니다. 실행 함수는 실행될 제안의 ID를 수락합니다. EVM이 한 번에 보류중인 모든 제안을 실행하는 쉬운 방법은 없습니다. 실행할 보류 제안이 너무 많을 수 있으며 DAO의 데이터를 크게 변경할 수 있으며, 이는 이더 리움 블록의 가스 한계를 초과하여 거래 실패를 초래할 수 있습니다. 잘 정의 된 규칙을 준수하는 사람이 호출 할 수있는 수동 실행 기능을 구축하는 것이 훨씬 쉽습니다. 따라서 커뮤니티는 실행 해야하는 제안에 집중할 수 있습니다.
-
우리는 신분증으로 제안서를 받고, 비정규직을 충족하고 마감일이 만료되었는지 확인한 다음 제안 유형이 제안서를 삭제하고 투표가 긍정적 인 경우 서면 삭제 기능을 사용하고 마지막으로 투표를합니다. 새 이벤트를 발급하십시오 (계약 상단에 추가). Assert Call은 요구 사항이있는 것과 같은 방식으로 작동합니다. Assert는 일반적으로 결과가 사실입니다. 필수는 전제 조건에 사용됩니다. 기능적으로 그것들은 동일합니다. 차이점은 Assert 진술이 실패한 상황을 처리하기 위해 메시지 매개 변수를 받아 들일 수 없다는 것입니다. 이 기능은 제안서의 모든 투표에 대해 토큰을 잠금 해제함으로써 끝납니다.
<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) 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>
기타 유형의 투표
챕터의 끝
그런 다음 아래와 같이 철수 소유자를 제외한 모든 기능 에이 수정자를 추가합니다.
배당 배당 분배 및 철수
<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 </code>배포 문제
결론
DAO 거버넌스 토큰과 관련된 위험 완화 위험 완화에는 신중한 DAO 관리, 철저한 보안 조치 및 항상 규제 개발을 주시하는 것이 포함됩니다. 또한 포트폴리오를 다각화하고 감당할 수있는 것보다 더 많이 투자하지 않는 것이 중요합니다. <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>
위 내용은 이더 리움 DAPP 구축 : 맞춤형 토큰으로 투표의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

이 최고의 개발자 뉴스 레터와 함께 최신 기술 트렌드에 대해 정보를 얻으십시오! 이 선별 된 목록은 AI 애호가부터 노련한 백엔드 및 프론트 엔드 개발자에 이르기까지 모든 사람에게 무언가를 제공합니다. 즐겨 찾기를 선택하고 Rel을 검색하는 데 시간을 절약하십시오

이 튜토리얼은 AWS 서비스를 사용하여 서버리스 이미지 처리 파이프 라인을 구축함으로써 안내합니다. ECS Fargate 클러스터에 배포 된 Next.js Frontend를 만들어 API 게이트웨이, Lambda 기능, S3 버킷 및 DynamoDB와 상호 작용합니다. th

CNCF (Cloud Native Computing Foundation), Ampere Computing, Equinix Metal 및 Actuated 간의 공동 작업 인이 파일럿 프로그램은 CNCF Github 프로젝트를위한 ARM64 CI/CD를 간소화합니다. 이 이니셔티브는 보안 문제 및 성과를 다룹니다


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

DVWA
DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

안전한 시험 브라우저
안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

드림위버 CS6
시각적 웹 개발 도구

SecList
SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.