I-A isistimu esikwazi ukulawula ukulawula kwamakhasimende ngokusebenzisa ikhowudi, ngaphandle kokufikelela kwama-hierarchies ezivamile zezinhlangano zokusebenza, njenge-boards of directors, CEOs, noma CTOs. Ngaphandle kokufikelela kumadivayisi noma izakhiwo, ama-DAO zihlanganisa Ukusebenza ku-blockchain DAO (Decentralized Autonomous Organization) smart contracts Ngokwemvelo, i-DAO ivumela abalandeli Ngena ngemva , futhi ngokuphathelene futhi ngokuvumelana. I-voting power is typically derived from Imininingwane ze-Token ye-Token ye-Token ye-Token ye-Token ye-Unity ye-Voting Weight. propose vote execute decisions tokens A typical on-chain DAO is composed of three main smart contracts: I-Token Contract: I-Token ye-Governance ne-Track ye-Voting Power. I-Governor Contract: Ukulawula ama-proposals kanye ne-voting logic: umuntu angakwazi ukufakelwa, indlela yokubala ama-votes, izidingo ze-quorum, kanye neziphumo ze-proposal. I-Timelock Contract: Isebenza njenge-security layer ngokuvumela i-delay phakathi kwe-approval ye-proposal ne-execution, enikeza abalandeli isikhathi yokusabela izixazululo ezithakazelisayo. I-living cycle ye-proposition iyimpendulo enhle kodwa enhle: umphumela isetshenziselwa , ama-votes zithunyelwe ngokusekelwe ku-token ownership, futhi uma umphumela wabanjwa, iyathunyelwa ku-Token umphumela wokugqibela. Uma umphumela wahlukaniswa, kuhlukaniswa kuphela. Governor Timelock Kule uchungechunge lensha, siza ukwakha i-DAO ukusuka kwelanga ukusetshenziswa Model. Kulesi isigaba ( , siza kubhalwe ku-writing, ukusetshenziselwa, nokuvamile Ukulandelana nathi . Lesi token iyasetyenziswa ngokushesha ukuze kusebenza ukubuyekeza on-chain futhi ukulawula ukhetho ku-DAO. Ukuhlobisa Part 1) governance token GovernanceToken Ukuhlobisa I-Token Code Ngaphandle kokubili, lapha ikhodi: // 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); } } Uma kuqhathaniswa ne-Traditional ERC20 Token, I-OpenZeppelin ye-OpenZeppelin ye-OpenZeppelin ye-OpenZeppelin: Waze . GovernanceToken ERC20Permit ERC20Votes I-ERC20Votes inikeza umsebenzi elilodwa yokulawula, ikakhulukazi i-getPastVotes(akhawunti, blockNumber). Lolu hlelo luhlobo luhlobo luhlobo luhlobo luhlobo luhlobo luhlobo luhlobo luhlobo luhlobo luhlobo luhlobo luhlobo luhlobo luhlobo luhlobo luhlobo luhlobo luhlobo luhlobo luhlobo luhlobo luhlobo luhlobo luhlobo luhlobo luhlobo luhlobo luhlobo luhlobo luhlobo luhlobo luhlobo luhlobo luhlobo luhlobo. I-ERC20Permit ivumela ukulungiswa okuzenzakalelayo nge-signatures (EIP-2612), okuvumela abasebenzisi ukunikezela noma ukulungiselela umthamo wokuphefumula ngaphandle kokuthumela i-transaction ku-chain. I-logic enhle kakhulu etholakala ku- , okuyinto i-initializes zonke amamoduli abalandeli futhi ibonise i-million governance tokens ku-deployer. Sinikeza futhi i-optional Umsebenzi, okungenani nomthengisi we-contract owner, ukuvumela ukulethwa kwe-token ngemuva kokusungulwa (ukudlulisa ukuhlolwa noma izixazululo zokusungula zokusungula). constructor mint Okokuqala, imisebenzi ezimbili - Waze —umlinganiselo ngokuphathelene. Lokhu kubalulekile ngoba zihlanganiswa eminyakeni amabili. Umlinganiselo ngokuphathelene ngokuphathelene ngokuphathelene Ukubuyekeza ukuthi zonke izindlela ezijwayelekile zihlanganiswa ngokufanelekileyo futhi ukuthi izimo ezijwayelekile ze-conflict ze-compiler zihlanganiswa ngokushesha. _update nonces super Ukwakhiwa kweToken Ukuze ukwakha token yethu yokulawula, siza kusebenzisa Ukusebenza okuqhubekayo ku-Ethereum Development Toolkit, i-Ethereum Development Toolkit, i-Ethereum Development Toolkit, i-Ethereum Development Toolkit, i-Ethereum Development Toolkit, i-Ethereum Development Toolkit, i-Ethereum Development Toolkit, i-Ethereum Development Toolkit, i-Ethereum Development Toolkit, i-Ethereum Development Toolkit, i-Ethereum Development Toolkit, i-Ethereum Development Toolkit, i-Ethereum Development Toolkit. Foundry Sishayele ngokufaka i-Foundry ngokusebenzisa isicelo sokufaka esemthethweni: curl -L https://foundry.paradigm.xyz | bash Ngemva kokufaka, le script ibhalisele ukuguqulwa kwe-shell yethu nokufaka i-Foundry binaries: source ~/.bashrc # path may vary depending on your system foundryup Lokhu kusetshenziselwa ukuphepha yonke Foundry toolchain: (Ukulungiselela & Ukuhlolwa) (Ukuhlukaniswa kwe-CLI) (I-node ye-local) futhi (Ukuhlukaniswa) forge cast anvil chisel Okulandelayo, sinikeza inkqubo entsha ye-Foundry ku-directory emnyama: mkdir DAO cd DAO forge init Ngokwenza lokhu, kuvela inkqubo ephelele, kuhlanganise Ngena ngemva , futhi umbhalo. Ngokuvamile, Foundry ukwakha isibonelo izivumelwano kanye nezifundo. Njengoba siphinde kuphela isakhiwo seprojekthi, singathola ngempumelelo ngezifayile ze-sample futhi ukuguqulwa nge-contracts yethu. src/ script/ test/ Ukuhlobisa Okwangoku, sinikeza idokhumenti yethu yokulawula ngaphansi : src/ src/ └── GovernanceToken.sol (Ukuqukethe i inkampani efakwe ku-section edlule.) GovernanceToken Njengoba i-token yethu inikeza amamoduli e-OpenZeppelin, sicela usuvele i-OpenZeppelin Contracts library: forge install OpenZeppelin/openzeppelin-contracts Kulesi isicelo se-OpenZeppelin isixhumanisi futhi inikeza i-contracts yayo ukuze ifakwe ku-import ku-project yethu. lib/ Okokuqala, sincoma inkqubo: forge build Uma konke kusetshenziswe ngokushesha, ukuphrinta isakhelwe ngempumelelo futhi ikhiqiza isikhwama. Le isikhwama ifakwe i-artefacts (ABIs kanye ne-bytecode) ezivamile kanye zonke izidakamizwa ze-OpenZeppelin. out/ GovernanceToken Kulesi sikhathi, i-governance token yethu iyatholakala ngokuphelele futhi iyatholakala ukusetshenziswe nokuvamile - iminyango etholakalayo ezilandelayo. Ukukhishwa kwe-Token Nge-governance token eyakhelwe, sishayele sishayele ku-blockchain yendawo. I-Foundry inikeza lokhu inqubo ngokushesha ngokusebenzisa . deployment scripts Thola ukusungula nge-deployment script Phakathi Umhlahlandlela 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(); } } Okuzenzakalelayo: A umsebenzi ukuthi Foundry iyahambisana. The / ukunakekelwa I-pair inikeza i-Foundry ukunikela i-transactions ku-network, ngaphandle kokufaka. run vm.startBroadcast() vm.stopBroadcast() Okulandelayo, sinikeza inethiwekhi yendawo ye-Ethereum usebenzisa (kuye ku-terminal eyahlukile): Anvil anvil I-Anvil uqala i-node yendawo ku- Ukulandelela i-akhawunti ze-pre-financed kanye ne-private keys zabo. Lezi zokusebenza kuphela yokuthuthukiswa nokuVavanyelwa. http://127.0.0.1:8545 Ngokusebenza kwe-Anvil, singakwazi ukuqhuba i-contract usebenzisa : forge script forge script script/DeployGovernanceToken.s.sol \ --rpc-url http://127.0.0.1:8545 \ --broadcast \ --private-key <ANVIL_PRIVATE_KEY> I-URL ye-RPC ne-private key etholakala ngqo ukusuka ku-Anvil. Uma isivumelwano kusebenza, i-Foundry ithipha i-transaction hash, idilesi ye-contract eyenziwe, ukusetshenziswa kwe-gas, kanye ne-block number lapho i-contract yasungulwa. Ukubuyekeza ngokushesha ukuthi ukulethwa kusebenza, singathola i-contract eyenziwe usebenzisa Umzekelo: Ukusebenzisa Ukubonisa ukuthi i-minte yokuqala ifakwe njengezimfuneko: cast totalSupply() cast call <DEPLOYED_CONTRACT_ADDRESS> \ "totalSupply()(uint256)" \ --rpc-url http://127.0.0.1:8545 Imininingwane efanelekayo ), ukuhlangabezana ne-monted amount ku-constructor. 1,000,000 tokens with 18 decimals (1000000000000000000000000 [1e24] Kulesi isigaba, i-governance token yethu iyatholakala ku-network ye-local futhi iyatholakala ukusetshenziswa ukulayishwa kwe-voting, i-delegation, futhi - ekugcineni - i-DAO governance. Ukubuyekeza i-Token Ukubhalisa ukusebenza kwe-token yethu ye-governance, singathole izifundo ze-unity usebenzisa , I-Foundry's test framework. Ukuhlolwa kwebhizinisi I-directory futhi ibhalwe ku-Solidity. forge-std test/ Ngezansi kuyinto uchungechunge elula okuqinisekisa ukuthi Function isebenza njengezimfuneko: 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); } } Waze isicelo esekelwe ngaphambi kwe-test kanye nokuthumela isicelo esitsha se- , ukuqinisekisa ukujabulela phakathi izikhwama. I-The isicelo esifundeni esifundeni esifundeni Ukwandisa isilinganiso se-receiver ngentengo esithathwe. setUp GovernanceToken testMint mint Ukusebenza kwe-test suite kuyinto elula njenge: forge test I-Foundry ivela i-contracts, ivumela i-test, futhi ivumela imiphumela. Ukubuyekezwa kwe-test ibonise ukuthi isakhiwo se-token yethu isebenza ngokufanele. Ukuphakama Kule nqaku, sincoma isakhiwo yokuqala se-DAO: . Sishayele ngokuvakashela i-token contract ngokuvakashela ngokuvakashela ngokuvakashela ku-OpenZeppelin amamoduli futhi izici ezengeziwe zokuvakashela ezihlobene ne-government. governance token Ngemuva kwalokho, siphila nge-workflow ephelele yokukhiqiza usebenzisa - ukusuka kuqala inkqubo, ukusungula i-token ku-Anvil network yendawo, futhi ekupheleni kokuqinisekisa ingozi yayo nge-unity tests. Foundry Kulandelayo nesigaba se-series, siza kuhlolwa ku-delegation, i-voting mechanics, ne-core governance contracts ezivela le token ku-ON-Chain DAO enhle. Ngingathanda ukuthi ungathanda le ncwadi enhle. Ungathanda ngempumelelo ukujabulela, ukujabulela, nokubhalisa izinto ezininzi ku-series. Miscellaneous: Amadivayisi ezengeziwe Zonke izivakashi ezibonakalayo kulesi sihloko ziye zithunyelwe ngaphakathi kwe-Docker container eyenziwe nge-command elandelayo: docker run -it ubuntu:ubuntu@sha256:72297848456d5d37d1262630108ab308d3e9ec7ed1c3286a32fe09856619a782 Ukusetshenziswa kwe-imaging digest eyakhelwe , njengoba izimo izindandatho izindandatho nezidingo lapho noma lapho i-container iyasungulwa. full reproducibility Ukusuka e-terminal eyahlukile, sinikeza kuphela ku-containers efanayo: Anvil docker exec -it <CONTAINER_NAME> bash anvil Ukuhlobisa Kutholwe ngokusebenzisa isicelo: <CONTAINER_INFO> $ docker ps Foundry inikeza ukuguqulwa kwe-scripts yokusebenza I-command elandelayo isebenza i-script ku-environment e-simulated futhi inikeza ukusetshenziswa kwegesi, ngaphandle kokudlala ngezinsizakalo: without forge script script/DeployGovernanceToken.s.sol --broadcast Uhlobo olusebenzayo yokubhalisa ngokushesha i-logic ye-deployment kanye nokuqinisekisa izindleko ze-gas. Uma ufuna ukuguqulwa noma ukulethwa kwezimali phakathi kwenethiwekhi enhle (i-local noma e-remote), kulula ukunikeza i-URL ye-RPC usebenzisa i-URL ye-RPC. Umbhali --rpc-url Miscellaneous: Izinzuzo Phakathi nenkqubo yokukhiqiza, ungakwazi ukujabulela izixazululo ezihlobene nezinhlangano kunoma izivumelwano zakho. Kulesi isibonelo, i-compiler ikhiqiza izixazululo ezivela kumadivayisi Ikheli : 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 Lezi zihlanganisa zihlanganisa a phakathi kwe-Solidity compiler ne-version eyakhiwe . Izinhlelo ezintsha Solidity deprecate the NatSpec ukubuyekeza ekwakheni ukucaciswa kwe-block annotation, ngenkathi izinguquko ze-library ezidlulileyo ingasebenzisa i-syntax eyenziwe. version mismatch forge-std @memory-safe-assembly memory-safe Njengoba inkinga isekelwe ku-dependence, isixazululo elula kuyinto ukuguqulwa Kusukela ku-version entsha: forge-std cd lib/forge-std git pull origin master git checkout master cd - Ngemva kokufaka i-library, izibuyekezo zithunyelwe futhi le nkqubo iyahlolwa ngokushesha. Ngokusebenza nge-foundry kanye ne-solidity, ukugcina imibuzo ezingenalutho ngokushesha kubalulekile ukunceda imibuzo emangalisayo noma ezingenalutho.