a is 'n stelsel wat kollektiewe besluitneming deur middel van kode moontlik maak, sonder om te vertrou op tradisionele organisatoriese hiërargieë soos bestuurslede, CEO's of CTO's. Gebruik op 'n blockchain. DAO (Decentralized Autonomous Organization) smart contracts In sy kern, 'n DAO toelaat deelnemers om die en op 'n transparante en verifieerbare manier. stemmag is gewoonlik afgelei van deur deelnemers gehou word, waar elke token 'n eenheid van stemgewig verteenwoordig. propose vote execute decisions tokens A typical on-chain DAO is composed of three main smart contracts: Token kontrak: Definieer die bestuur token en volg stem mag. Gouverneur kontrak: Beheer voorstelle en stemming logika: wie kan voorstel, hoe stemme getel word, quorum vereistes, en voorstel uitkomste. Timelock kontrak: Dryf as 'n sekuriteitslaag deur 'n vertraging tussen voorstel goedkeuring en uitvoering te dwing, wat deelnemers tyd gee om te reageer op potensieel skadelike besluite. Die lewenscyklus van 'n voorstel is eenvoudig maar kragtig: 'n voorstel word aan die , stemme word versamel op grond van token-eienaarskap, en sodra die voorstel goedgekeur word, word dit na die vir vertraagde uitvoering.As die voorstel misluk, word dit eenvoudig verwerp. Governor Timelock In hierdie artikelreeks sal ons 'n DAO van die grond af bou met behulp van In hierdie gedeelte ( , ons sal fokus op die skryf, implementeer en toets van die wat ons sal noem Hierdie token sal later gebruik word om op-keten stemming en besluitneming in die DAO te toelaat. Openhoogte Part 1) governance token GovernanceToken Openhoogte Die token kode Sonder om verder te gaan, hier is die kode: // SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol"; import {ERC20Votes} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import {Nonces} from "@openzeppelin/contracts/utils/Nonces.sol"; contract GovernanceToken is ERC20, ERC20Permit, ERC20Votes, Ownable { constructor() ERC20("GovernanceToken", "MGT") ERC20Permit("GovernanceToken") Ownable(msg.sender) { _mint(msg.sender, 1_000_000 * 10 ** decimals()); } // Optional: Add controlled minting function mint(address to, uint256 amount) external { require(msg.sender == owner(), "Only owner can mint"); _mint(to, amount); } // ── Conflict resolution ── // Both ERC20 and ERC20Votes define _update function _update(address from, address to, uint256 amount) internal override(ERC20, ERC20Votes) { super._update(from, to, amount); } // Both ERC20Permit and Nonces define nonces() function nonces(address owner) public view override(ERC20Permit, Nonces) returns (uint256) { return super.nonces(owner); } } In vergelyking met 'n tradisionele ERC20 token, Integreer twee addisionele OpenZeppelin modules: en . GovernanceToken ERC20Permit ERC20Votes ERC20Votes voeg governance-spesifieke funksionaliteit by, veral getPastVotes(rekening, blokNumber). Hierdie funksie gee die stemmag van 'n rekening terug op 'n spesifieke blok, eerder as sy huidige balans. In 'n DAO konteks, is hierdie snapshot meganisme kritiek: stemmag word vasgestel op die oomblik dat 'n voorstel geskep word, wat gebruikers voorkom om stemme te manipuleer deur tokens te koop of te oordra na die feit. ERC20Permit maak gaslose goedkeuring via handtekenings (EIP-2612) moontlik, wat gebruikers toelaat om stemmag te oordra of te goedkeure sonder om 'n transaksie in die ketting te stuur. Die belangrikste logika is in die , wat al die geërfde modules inisialiseer en 'n miljoen governance tokens aan die implementer munt. funksie, beperk tot die kontrak-eienaar, om beheerde token-uitgifte na die invoering te toelaat (bruikbaar vir toetsing of toekomstige bestuurbesluite). constructor mint Twee van die funksies - en – moet uitdruklik oorreed word. Dit is nodig omdat hulle in verskeie ouerkontrakte gedefinieer word. , die versekering dat alle geërfde gedrag korrek samestel word en dat die kompiler se erfeniskonflikte skoon opgelos word. _update nonces super Die bou van die token Om ons governance token te bou, sal ons gebruik , 'n vinnige en moderne Ethereum-ontwikkelingstoolkit. Die volgende stappe neem 'n Linux-omgewing aan, maar die werkstroom is soortgelyk op macOS. Foundry Ons begin deur Foundry te installeer met behulp van die amptelike installasie script: curl -L https://foundry.paradigm.xyz | bash Na installasie, die script instrueer ons om ons shell omgewing te actualiseer en die Foundry binaries te installeer: source ~/.bashrc # path may vary depending on your system foundryup Dit installeer die volledige Foundry toolchain: (Onderwys en toets) (die interaksie van die (die plaaslike knooppunt) en (Hierdie weergawe forge cast anvil chisel Vervolgens begin ons 'n nuwe Foundry-projek in 'n leë directory: mkdir DAO cd DAO forge init Dit genereer 'n volledige projek skakels, insluitend die en deur die voorbeeld, foundry skep voorbeeld Aangesien ons net die projekstruktuur wil hê, kan ons hierdie voorbeeld lêers veilig verwyder en hulle vervang met ons eie kontrakte. src/ script/ test/ die kontant Voorlopig voeg ons ons bestuur token onder : src/ src/ └── GovernanceToken.sol (Die inhoud van die die kontrak wat in die vorige afdeling gedefinieer is.) GovernanceToken Omdat ons token afhanklik is van OpenZeppelin-modules, moet ons die OpenZeppelin-kontrakte-bibliotheek installeer: forge install OpenZeppelin/openzeppelin-contracts Hierdie bevel verkopers OpenZeppelin in die direktoraat en maak sy kontrakte beskikbaar vir invoer binne ons projek. lib/ Ten slotte stel ons die projek saam: forge build As alles korrek ingestel word, voltooi die kompilasie suksesvol en genereer 'n Hierdie folder bevat die gekompileerde artefakte (ABIs en bytecode) vir ook al die erfde OpenZeppelin afhanklikhede. out/ GovernanceToken Op hierdie punt is ons governance token ten volle saamgestel en gereed om ontplooi en getoets te word - stappe wat ons in die volgende afdelings sal dek. Uitvoering van die token Met die governance token saamgestel, kan ons dit nou in 'n plaaslike blockchain implementeer. . deployment scripts Ons begin met die skep van 'n uitrol script Onder die Die direkteur: DeployGovernanceToken.s.sol script/ // SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import {Script} from "forge-std/Script.sol"; import {GovernanceToken} from "../src/GovernanceToken.sol"; contract DeployGovernanceToken is Script { function run() external { vm.startBroadcast(); new GovernanceToken(); vm.stopBroadcast(); } } Hierdie teks definieer a funksie wat Foundry sal uitvoer. die / die Paar vertel Foundry om transaksie na die netwerk te stuur, eerder as om dit te simuleer. run vm.startBroadcast() vm.stopBroadcast() Volgende, ons begin 'n plaaslike Ethereum netwerk met behulp van (In 'n afsonderlike terminal): Anvil anvil Anvil begin 'n plaaslike knoop op en druk 'n lys van voorgefinansierde rekeninge saam met hul private sleutels. Hierdie rekeninge is slegs bedoel vir ontwikkeling en toetsing. http://127.0.0.1:8545 Met Anvil loop, kan ons die kontrak gebruik : forge script forge script script/DeployGovernanceToken.s.sol \ --rpc-url http://127.0.0.1:8545 \ --broadcast \ --private-key <ANVIL_PRIVATE_KEY> Die RPC-URL en private sleutel word direk van Anvil se uitvoer geneem.Wanneer die bevel suksesvol is, druk Foundry die transaksie-hash, implementeerde kontrakadres, gasgebruik en die blok nommer waarin die kontrak geskep is. Om vinnig te verifieer dat die ontplooiing gewerk het, kan ons die ontplooide kontrak deur middel van Byvoorbeeld, om te bel bevestig dat die aanvanklike myn plaasgevind het soos verwag: cast totalSupply() cast call <DEPLOYED_CONTRACT_ADDRESS> \ "totalSupply()(uint256)" \ --rpc-url http://127.0.0.1:8545 Die teruggekeerde waarde stem ooreen met ), ooreenstem met die bedrag wat in die bouer gemint is. 1,000,000 tokens with 18 decimals (1000000000000000000000000 [1e24] Op hierdie stadium is ons governance token live op 'n plaaslike netwerk en gereed om gebruik te word vir die toetsing van stemming, delegasie en - uiteindelik - DAO-regering. Testeer die token Om die gedrag van ons bestuur token te valideer, kan ons eenheid toetse skryf met behulp van , Foundry se toetsraamwerk. Toetse leef in die Die boek is geskryf in Solidity. forge-std test/ Hieronder is 'n eenvoudige toets wat die Funksie werk soos verwag: mint // test/GovernanceToken.t.sol pragma solidity ^0.8.20; import {Test} from "forge-std/Test.sol"; import {GovernanceToken} from "../src/GovernanceToken.sol"; contract TokenTest is Test { GovernanceToken token; function setUp() public { token = new GovernanceToken(); } function testMint() public { uint256 before = token.balanceOf(address(this)); token.mint(address(this), 100); uint256 after_ = token.balanceOf(address(this)); assertEq(after_ - before, 100); } } die Funksie word uitgevoer voor elke toets en implementeer 'n nuwe instansie van verseker die isolasie tussen die toets gevalle. Die funksie ondersoek dan die oproep verhoog die saldo van die ontvanger met die verwagte bedrag. setUp GovernanceToken testMint mint Die uitvoering van die toets suite is so eenvoudig as: forge test Foundry stel die kontrakte saam, voer die toets uit en rapporteer die resultate. 'N Pasende toets bevestig dat ons token se muntlogika korrek gedra. Konklusie In hierdie artikel het ons die eerste boublok van 'n DAO aangespreek: die Ons het begin deur die token-kontrak self te ondersoek, met spesiale aandag aan die OpenZeppelin-modules wat dit geërf het en die bykomende bestuurverwante funksies wat hulle bied. governance token Ons het dan deur die volledige ontwikkelingswerkstroom gegaan met - van die inisialisering van 'n projek, tot die implementering van die token op 'n plaaslike Anvil-netwerk, en uiteindelik die validering van sy gedrag met eenheidstoetse. Foundry In die volgende dele van hierdie reeks, sal ons daarop bou deur die invoering van delegasie, stemming meganismes, en die kern bestuur kontrakte wat hierdie token omskep in 'n ten volle funksionele on-keten DAO. Ek hoop dat jy hierdie artikel nuttig gevind het. voel vry om te hou, te deel en te abonneer vir meer inhoud in die reeks. Miscellaneous: Extra opdragte Alle opdragte wat in hierdie artikel getoon word, is binne 'n Docker-container uitgevoer wat met die volgende opdrag geskep is: docker run -it ubuntu:ubuntu@sha256:72297848456d5d37d1262630108ab308d3e9ec7ed1c3286a32fe09856619a782 Met behulp van 'n gekleurde beeld digest verseker , aangesien die omgewing altyd dieselfde sal wees, ongeag wanneer of waar die container gestuur word. full reproducibility Die hardloop in 'n afsonderlike terminal, het ons eenvoudig aan dieselfde container aangeheg: Anvil docker exec -it <CONTAINER_NAME> bash anvil Die variasie Dit kan gevind word deur die kommando: Die container se naam $ docker ps Foundry laat jou ook toe om ontplooiingsskripte uit te voer Die volgende bevel voer die script in 'n gesimuleerde omgewing uit en rapporteer gasverbruik, sonder om enige transaksie te versprei: without forge script script/DeployGovernanceToken.s.sol --broadcast Hierdie modus is nuttig vir die vinnige validering van die implementeringslogika en die raming van gas koste.As jy transaksie wil simuleer of uitvoer teen 'n werklike netwerk (lokale of Die vlag. --rpc-url Verwys na: Waarschuwings Gedurende die ontwikkeling, kan jy waarskuwings wat verband hou met afhanklikhede in plaas van jou eie kontrakte. Die biblioteek: lib/forge-std Warning (2424): Natspec memory-safe-assembly special comment for inline assembly is deprecated and scheduled for removal. Use the memory-safe block annotation instead. --> lib/forge-std/src/StdStorage.sol:301:13 Hierdie waarskuwings word veroorsaak deur a tussen die Solidity kompiler en die geïnstalleerde weergawe van Nieuwer Solidity weergawes deprecate die NatSpec kommentaar ten gunste van die blok aantekening, terwyl ouer biblioteek weergawes nog steeds die afgedankte sintaksie gebruik. version mismatch forge-std @memory-safe-assembly memory-safe Aangesien die probleem ontstaan in 'n afhanklikheid, is die eenvoudigste oplossing om te Na die nuutste weergawe: forge-std cd lib/forge-std git pull origin master git checkout master cd - Nadat die biblioteek opgedateer is, verdwyn die waarskuwings en die projek kompileer weer skoon. Dit is 'n goeie herinnering dat kompiler waarskuwings nie altyd veroorsaak word deur jou eie kode nie.Wanneer jy werk met vinnig ontwikkelende gereedskapsketens soos Foundry en Solidity, is dit dikwels nodig om afhanklikhede up-to-date te hou om lawaaierige of misleidende waarskuwings te voorkom.