a je systém, ktorý umožňuje kolektívne rozhodovanie prostredníctvom kódu, bez spoliehania sa na tradičné organizačné hierarchie, ako sú rady riaditeľov, generálni riaditelia alebo CTO. Umiestnený na blockchain. DAO (Decentralized Autonomous Organization) smart contracts V jeho jadre DAO umožňuje účastníkom , , , a transparentným a overiteľným spôsobom. hlasovacie právo je zvyčajne odvodené od držané účastníkmi, kde každý žetón predstavuje jednotku hlasovacej hmotnosti. propose vote execute decisions tokens A typical on-chain DAO is composed of three main smart contracts: Tokenová zmluva: Definuje token riadenia a sleduje hlasovaciu silu. Správa návrhov a hlasovacej logiky: kto môže navrhnúť, ako sa počítajú hlasy, požiadavky na kvórum a výsledky návrhu. Zmluva Timelock: Pôsobí ako bezpečnostná vrstva tým, že presadzuje oneskorenie medzi schválením návrhu a vykonávaním, čo účastníkom poskytuje čas na reakciu na potenciálne škodlivé rozhodnutia. Životný cyklus návrhu je jednoduchý, ale silný: návrh sa predkladá , hlasy sa zhromažďujú na základe vlastníctva tokenov a akonáhle je návrh schválený, je postúpený na Ak návrh zlyhá, je jednoducho zrušený. Governor Timelock V tejto sérii článkov budeme stavať DAO od začiatku pomocou V tejto časti ( , budeme sa sústrediť na písanie, nasadenie a testovanie ktoré budeme volať Tento token sa neskôr použije na umožnenie hlasovania v reťazci a rozhodovania v DAO. OpenZeppelin Part 1) governance token GovernanceToken Otvorenie Token kód Bez ďalšieho odkladu, tu je kód: // 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); } } V porovnaní s tradičným tokenom ERC20, Integruje dva ďalšie moduly OpenZeppelin: a . GovernanceToken ERC20Permit ERC20Votes ERC20Votes pridáva funkcie špecifické pre správu, predovšetkým getPastVotes (účet, blokNumber). Táto funkcia vráti hlasovaciu silu účtu v konkrétnom bloku, a nie jeho aktuálnu bilanciu.V kontexte DAO je tento mechanizmus snímky kritický: hlasovacia sila je fixovaná v okamihu, keď sa vytvorí návrh, čo zabraňuje používateľom manipulovať s hlasmi nákupom alebo prevodom žetónov po udalosti. ERC20Permit umožňuje bezplynové schvaľovanie prostredníctvom podpisov (EIP-2612), čo umožňuje používateľom delegovať alebo schvaľovať hlasovacie právomoci bez odoslania transakcie v reťazci. Najdôležitejšia logika spočíva v , ktorý inicializuje všetky zdedené moduly a mincuje jeden milión tokenov správy k nasadzovateľovi. funkcia, obmedzená na majiteľa zmluvy, aby umožnila kontrolovanú emisiu tokenov po nasadení (užitočné pre testovanie alebo budúce rozhodnutia o správe). constructor mint Na záver dve funkcie - a — musia byť výslovne preplatené. To je potrebné, pretože sú definované vo viacerých rodičovských zmluvách. zabezpečenie, že všetky dedičné správanie sú správne zložené a že dedičné konflikty kompilátora sú vyriešené čistým spôsobom. _update nonces super Vytvorenie tokenu Aby sme vytvorili token našej správy, použijeme Nasledujúce kroky predpokladajú prostredie Linux, ale pracovný postup je podobný na macOS. Foundry Začneme inštaláciou Foundry pomocou oficiálneho inštalačného skriptu: curl -L https://foundry.paradigm.xyz | bash Po inštalácii nás skript pokúša aktualizovať naše prostredie shell a nainštalovať binárne položky Foundry: source ~/.bashrc # path may vary depending on your system foundryup Toto nainštaluje kompletný Foundry toolchain: (budovanie a testovanie) (z hľadiska interakcií s klímou), (lokálny uzol) a (Súhlasí s tým forge cast anvil chisel Ďalej iniciujeme nový projekt Foundry v prázdnom adresári: mkdir DAO cd DAO forge init Týmto sa vytvorí kompletný projektový rámec vrátane , , , a predvolene, Foundry vytvorí príklad Pretože chceme len projektovú štruktúru, môžeme tieto príkladové súbory bezpečne odstrániť a nahradiť ich vlastnými zmluvami. src/ script/ test/ Kontrahovať Zatiaľ dodávame náš token riadenia pod : src/ src/ └── GovernanceToken.sol (Obsahuje sa v zmluvy definovanej v predchádzajúcom oddiele.) GovernanceToken Keďže náš token sa spolieha na moduly OpenZeppelin, musíme nainštalovať knižnicu OpenZeppelin Contracts: forge install OpenZeppelin/openzeppelin-contracts Tento príkaz dodáva OpenZeppelin do adresára a sprístupňuje svoje zmluvy na dovoz v rámci nášho projektu. lib/ Na záver zostavíme projekt: forge build Ak je všetko nastavené správne, kompilácia sa úspešne dokončí a vytvorí Tento priečinok obsahuje kompilované artefakty (ABIs a bytecode) pre ako aj všetky zdedené závislosti OpenZeppelin. out/ GovernanceToken V tomto bode je náš token pre správu plne zostavený a pripravený na nasadenie a testovanie - kroky, ktoré budeme pokrývať v nasledujúcich častiach. Využitie tokenu S tokenom riadenia zostaveným, môžeme ho teraz nasadiť do lokálnej blockchainu. . deployment scripts Začneme vytváraním nasadenia skript Pod týmto riaditeľom : 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(); } } Tento text definuje a funkcie, ktorú bude spúšťať Foundry. / s Pár povie Foundry, aby posielal transakcie do siete, namiesto simulácie. run vm.startBroadcast() vm.stopBroadcast() Ďalej spustíme lokálnu sieť Ethereum pomocou (v samostatnom termináli): Anvil anvil Anvil spúšťa lokálny uzol na a vytlačí zoznam predfinancovaných účtov spolu s ich súkromnými kľúčmi. Tieto účty sú určené len na vývoj a testovanie. http://127.0.0.1:8545 S Anvil beží, môžeme nasadiť zmluvu pomocou : forge script forge script script/DeployGovernanceToken.s.sol \ --rpc-url http://127.0.0.1:8545 \ --broadcast \ --private-key <ANVIL_PRIVATE_KEY> Po úspešnom príkaze Foundry vytlačí transakčný hash, nasadenú adresu zmluvy, použitie plynu a číslo bloku, v ktorom bola zmluva vytvorená. Ak chcete rýchlo overiť, že nasadenie fungovalo, môžeme vyhľadávať nasadenú zmluvu pomocou Napríklad volanie potvrdzuje, že počiatočná minca sa vyskytla tak, ako sa očakávalo: cast totalSupply() cast call <DEPLOYED_CONTRACT_ADDRESS> \ "totalSupply()(uint256)" \ --rpc-url http://127.0.0.1:8545 Vrátená hodnota zodpovedá Zhoduje sa s množstvom uvedeným v konštruktéri. 1,000,000 tokens with 18 decimals (1000000000000000000000000 [1e24] V tejto fáze je náš token riadenia naživo v lokálnej sieti a je pripravený na použitie na testovanie hlasovania, delegácie a - nakoniec - riadenia DAO. Vyskúšať token Ak chcete overiť správanie nášho tokenu správy, môžeme napísať jednotkové testy pomocou , testovací rámec Foundry. testy naživo v sú napísané v Solidity. forge-std test/ Nižšie je jednoduchý test, ktorý potvrdzuje Funkcia funguje podľa očakávania: 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); } } na funkcia sa vykonáva pred každým testom a nasadí novú inštanciu zabezpečenie izolácie medzi skúšobnými prípadmi. funkcia potom kontroluje, že volanie zvyšuje bilanciu príjemcu o očakávanú sumu. setUp GovernanceToken testMint mint Spustenie testovacej sady je také jednoduché ako: forge test Spoločnosť Foundry zostavuje zmluvy, vykonáva test a oznamuje výsledky.Poskytnutý test potvrdzuje, že mincovacia logika nášho tokenu sa správa správne. záver V tomto článku sme sa zaoberali prvým stavebným blokom DAO: Začali sme tým, že sme preskúmali samotnú tokenovú zmluvu, s osobitnou pozornosťou na moduly OpenZeppelin, ktoré zdedí, a ďalšie funkcie súvisiace s vládou, ktoré poskytujú. governance token Potom sme prešli celým vývojovým pracovným postupom pomocou - od inicializácie projektu až po nasadenie tokenu v lokálnej sieti Anvil a nakoniec overenie jeho správania pomocou testov jednotiek. Foundry V nasledujúcich častiach tejto série budeme stavať na ňom zavedením delegácie, hlasovacích mechanizmov a základných vládnych zmlúv, ktoré transformujú tento token do plne funkčného DAO na reťazci. Dúfam, že ste našli tento článok užitočný.Cíťte sa slobodne páčiť, zdieľať a prihlásiť sa na viac obsahu v sérii. Miscellaneous: Extra príkazy Všetky príkazy zobrazené v tomto článku boli vykonané vo vnútri kontajnera Docker vytvoreného nasledujúcim príkazom: docker run -it ubuntu:ubuntu@sha256:72297848456d5d37d1262630108ab308d3e9ec7ed1c3286a32fe09856619a782 Použitie pripevneného digestu obrazu zaisťuje , pretože prostredie bude vždy rovnaké bez ohľadu na to, kedy alebo kde je kontajner spustený. full reproducibility Bežať v samostatnom termináli sme jednoducho pripojili k rovnakému kontajneru: Anvil docker exec -it <CONTAINER_NAME> bash anvil Variabilný Môžete ho nájsť prostredníctvom príkazu: Názov konta - názov konta $ docker ps Foundry vám tiež umožňuje spustiť nasadenie skriptov Nasledujúci príkaz spúšťa skript v simulovanom prostredí a hlásí použitie plynu bez vysielania žiadnych transakcií: without forge script script/DeployGovernanceToken.s.sol --broadcast Tento režim je užitočný pre rýchle overenie logiky nasadenia a odhad nákladov na plyn. Ak chcete simulovať alebo vykonávať transakcie proti skutočnej sieti (miestnej alebo vzdialenej), jednoducho zadajte adresu URL RPC pomocou Vlajka → --rpc-url Miscellaneous: Varovanie Počas vývoja sa môžete stretnúť s upozornením týkajúcim sa závislostí namiesto vlastných zmlúv.V našom prípade kompilátor vydal upozornenia pochádzajúce z v knižnici: 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 Tieto výstrahy sú spôsobené a medzi Solidity kompilátorom a nainštalovanou verziou . novšie verzie Solidity deprecate NatSpec komentár v prospech blokové poznámky, zatiaľ čo staršie verzie knižnice môžu stále používať deprecovanú syntax. version mismatch forge-std @memory-safe-assembly memory-safe Keďže problém vznikol v závislosti, najjednoduchším riešením je aktualizácia Do najnovšej verzie: forge-std cd lib/forge-std git pull origin master git checkout master cd - Po aktualizácii knižnice zmiznú upozornenia a projekt sa opäť zostaví. Pri práci s rýchlo sa rozvíjajúcimi reťazcami nástrojov, ako sú Foundry a Solidity, je často potrebné aktualizovať závislosti, aby sa zabránilo hlučným alebo zavádzajúcim varovaniam.