前言过往分享内容中,DAO相关板块涉猎较少。本文将系统梳理DAO的核心理论体系,明确DAO的定义、功能价值、解决的核心问题与行业落地场景,并对其未来发展进行展望;同时完整拆解DAO相关智能合约开发、测试、部署的全流程实操,补齐DAO领域理论知识与工程实践的内容短板。概述D
过往分享内容中,DAO 相关板块涉猎较少。本文将系统梳理 DAO 的核心理论体系,明确 DAO 的定义、功能价值、解决的核心问题与行业落地场景,并对其未来发展进行展望;同时完整拆解 DAO 相关智能合约开发、测试、部署的全流程实操,补齐 DAO 领域理论知识与工程实践的内容短板。
DAO(去中心化自治组织) 是一种基于区块链技术的组织形式。它通过智能合约将组织的规则编码在链上,不依赖中心化管理层(如 CEO 或董事会),而是由社区成员共同管理和决策。
我们可以将 DAO 理解为 “运行在互联网上的、拥有共同金库的自动化公司” :
在 2026 年的背景下,DAO 的功能已经极度成熟:
| 传统组织 (Web2/实体公司) | DAO (Web3 模式) | 解决的问题 |
|---|---|---|
| 黑箱操作:高层决策不透明,资金去向不明。 | 全流程透明:所有投票、资金流向在区块链上清晰可查。 | 信任成本:无需信任个人,只需信任代码。 |
| 官僚低效:层层审批,跨境协作极其困难。 | 代码即执行:投票通过即自动拨款,无缝跨国协作。 | 效率与边界:打破地理限制,实现全球即时响应。 |
| 利益分配不均:大股东获利,基层员工贡献被忽视。 | 贡献证明:按贡献(Token/NFT)分配收益,实现公平治理。 | 激励不对等:将参与者从“打工人”变为“所有者”。 |
| 中心化审查:平台可随意封禁账户或没收资产。 | 抗审查性:规则由社区决定,不受单一中心控制。 | 自主权:保护参与者的资产和发言权。 |
A. DeFi(去中心化金融)
B. DeSci(去中心化科学)
C. 创作者与媒体 (Media DAO)
D. 物理资产与生活 (Network States)
E. AI 治理 (AI DAO)
到 2026 年,DAO 不再是极客的实验,它成为了 “数字原生组织” 的标准。它不仅解决了信任问题,还通过 AI 代理 提升了治理速度,通过 法律合规化(如 MiCA 法案)实现了与现实世界的接轨。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol"; // 必须显式导入
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol";
import "@openzeppelin/contracts/governance/Governor.sol";
import "@openzeppelin/contracts/governance/extensions/GovernorSettings.sol";
import "@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol";
import "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol";
import "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol";
// 1. 投票代币合约
contract MyToken is ERC20, ERC20Permit, ERC20Votes {
constructor() ERC20("MyDAO", "MDAO") ERC20Permit("MyDAO") {
_mint(msg.sender, 1000000 * 10 ** decimals());
}
// OpenZeppelin V5 要求的重写
function _update(address from, address to, uint256 value) internal override(ERC20, ERC20Votes) {
super._update(from, to, value);
}
function nonces(address owner) public view override(ERC20Permit, Nonces) returns (uint256) {
return super.nonces(owner);
}
}
// 2. 治理合约
contract MyGovernor is Governor, GovernorSettings, GovernorCountingSimple, GovernorVotes, GovernorVotesQuorumFraction {
constructor(IVotes _token)
Governor("MyGovernor")
GovernorSettings(1, /* 1 block voting delay */ 7200, /* ~1 day voting period */ 0)
GovernorVotes(_token)
GovernorVotesQuorumFraction(4) // 4% 法定人数
{}
// 以下为 OpenZeppelin 插件组合所需的样板代码
function votingDelay() public view override(Governor, GovernorSettings) returns (uint256) {
return super.votingDelay();
}
function votingPeriod() public view override(Governor, GovernorSettings) returns (uint256) {
return super.votingPeriod();
}
function quorum(uint256 blockNumber) public view override(Governor, GovernorVotesQuorumFraction) returns (uint256) {
return super.quorum(blockNumber);
}
function proposalThreshold() public view override(Governor, GovernorSettings) returns (uint256) {
return super.proposalThreshold();
}
}
测试用例说明:
import assert from "node:assert/strict";
import { describe, it, beforeEach } from "node:test";
import { network } from "hardhat";
import { keccak256, encodePacked, encodeFunctionData, decodeEventLog } from 'viem';
describe("MyDAO Governance (OZ V5 + Viem)", function () {
let token: any;
let governor: any;
let publicClient: any;
let testClient: any;
let deployer: any, voter: any, proposer: any;
beforeEach(async function () {
// 1. 获取客户端
const { viem } = await (network as any).connect();
publicClient = await viem.getPublicClient();
testClient = await viem.getTestClient();
[deployer, voter, proposer] = await viem.getWalletClients();
// 2. 部署合约 (使用完全限定名解决 HHE1001)
token = await viem.deployContract("contracts/DAO.sol:MyToken", []);
governor = await viem.deployContract("contracts/DAO.sol:MyGovernor", [token.address]);
// 3. 初始资金准备
const amount = 50000n * 10n ** 18n;
// 给投票者代币并委托(激活票权)
await token.write.transfer([voter.account.address, amount]);
await token.write.delegate([voter.account.address], { account: voter.account });
// --- 重要:给 DAO 金库(Governor 合约)注资,否则 execute 会失败 ---
await token.write.transfer([governor.address, amount]);
// 4. 推进区块确保委托快照生效
await testClient.mine({ blocks: 5 });
});
describe("Proposal Lifecycle", function () {
it("应该完成从提案到执行的完整生命周期", async function () {
// --- 1. 准备提案数据 ---
const calldata = encodeFunctionData({
abi: token.abi,
functionName: 'transfer',
args: [proposer.account.address, 100n]
});
const description = "Proposal #1: Support AI Research";
const descHash = keccak256(encodePacked(['string'], [description]));
// --- 2. 发起提案 ---
const txHash = await governor.write.propose([
[token.address], [0n], [calldata], description
], { account: proposer.account });
const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash });
// 健壮地从 logs 中提取 ProposalCreated 事件
const event = decodeEventLog({
abi: governor.abi,
eventName: 'ProposalCreated',
data: receipt.logs[0].data,
topics: receipt.logs[0].topics,
});
const proposalId = (event.args as any).proposalId;
// --- 3. 进入投票期 ---
// 修复点:mine 2 个区块确保跨越 votingDelay 并进入 Active 状态
await testClient.mine({ blocks: 5 });
let state = await governor.read.state([proposalId]);
assert.equal(Number(state), 1, "提案应处于 Active (1) 状态");
// --- 4. 投票 (1 = For) ---
await governor.write.castVote([proposalId, 1], { account: voter.account });
// --- 5. 推进时间直到投票结束 ---
// 超过 votingPeriod (7200 blocks)
await testClient.mine({ blocks: 7205 });
state = await governor.read.state([proposalId]);
assert.equal(Number(state), 4, "提案应处于 Succeeded (4) 状态");
// --- 6. 执行提案 ---
await governor.write.execute([
[token.address], [0n], [calldata], descHash
], { account: deployer.account });
// --- 7. 最终验证 ---
state = await governor.read.state([proposalId]);
assert.equal(Number(state), 7, "提案应处于 Executed (7) 状态");
const balance = await token.read.balanceOf([proposer.account.address]);
assert.ok(balance >= 100n, "Proposer 应该收到了金库转账");
console.log(`✅ 提案 ${proposalId.toString().slice(0,10)} 执行成功`);
});
it("如果赞成票不足,提案应当失败", async function () {
const calldata = '0x';
const description = "Fail Proposal";
const tx = await governor.write.propose([[token.address], [0n], [calldata], description]);
const receipt = await publicClient.waitForTransactionReceipt({ hash: tx });
const event = decodeEventLog({
abi: governor.abi, eventName: 'ProposalCreated',
data: receipt.logs[0].data, topics: receipt.logs[0].topics
});
const proposalId = (event.args as any).proposalId;
await testClient.mine({ blocks: 2 });
// 投反对票 (0 = Against)
await governor.write.castVote([proposalId, 0], { account: voter.account });
await testClient.mine({ blocks: 7205 });
const state = await governor.read.state([proposalId]);
assert.equal(Number(state), 3, "提案应处于 Defeated (3) 状态");
});
});
});
// scripts/deploy.js
import { network, artifacts } from "hardhat";
async function main() {
// 连接网络
const { viem } = await network.connect({ network: network.name });//指定网络进行链接
// 获取客户端
const [deployer] = await viem.getWalletClients();
const publicClient = await viem.getPublicClient();
const deployerAddress = deployer.account.address;
console.log("部署者的地址:", deployerAddress);
// 加载合约
const TokenArtifact = await artifacts.readArtifact("contracts/DAO.sol:MyToken");
const GovernorArtifact = await artifacts.readArtifact("contracts/DAO.sol:MyGovernor");
const TokenHash = await deployer.deployContract({
abi: TokenArtifact.abi,//获取abi
bytecode: TokenArtifact.bytecode,//硬编码
args: [],
});
const TokenReceipt = await publicClient.waitForTransactionReceipt({ hash: TokenHash });
console.log("Token合约地址:", TokenReceipt.contractAddress);
// 部署
const GovernorHash = await deployer.deployContract({
abi: GovernorArtifact.abi,//获取abi
bytecode: GovernorArtifact.bytecode,//硬编码
args: [TokenReceipt.contractAddress],
});
const GovernorReceipt = await publicClient.waitForTransactionReceipt({ hash: GovernorHash });
console.log("Governor合约地址:", GovernorReceipt.contractAddress);
}
main().catch(console.error);
至此,关于 DAO 从理论知识梳理到相关智能合约落地的全流程内容已全部完成。本文完整打通 DAO 理论体系与工程实践,补齐该领域知识与实操短板,为后续深入研究与落地开发奠定基础。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!
作者暂未设置收款二维码