# Rust智能合约养成日记(11) Sputnik DAO提案机制剖析Sputnik-DAO 作为 NEAR Protocol 的基础设施,正推动 NEAR 生态向去中心化方向发展。目前该平台已促成多个 NEAR 项目建立去中心化自治社区,提供了完整灵活高效的社区决策治理方案。Sputnikdaov2 是用于 Sputnik-DAO 社区治理投票的智能合约。本文将介绍该合约的核心概念:提案(Proposal),后续文章将围绕提案介绍相关的 DAO 社区治理模式(Policy)。## 1. 提案发起Sputnik-DAO 社区成员可以就项目治理或管理发表意见或提交提案。持股成员可以对提案进行审议和投票,从而影响项目未来走向。在合约层面,DAO 成员可调用 sputnikdaov2 合约的 add_proposal() 方法发起新提案:rustpub fn add_proposal(&mut self, proposal: ProposalInput) -> u64提案者需提供提案的详细信息(ProposalInput):- 提案的文字描述(Description)- 提案的类型(kind)add_proposal() 方法会进行校验处理,生成完整初始化的提案(Proposal),并与唯一的 proposal_id 绑定,添加到合约全局维护的 Contract.proposals 映射中。提案包含以下完整属性信息:- description: 提案描述- kind: 提案类型 - proposer: 提案人- status: 提案状态- submission_time: 提交时间- vote_counts: 投票计数- votes: 投票详情需要注意的是,Sputnik-DAO 存在提案押金(proposal_bond)的概念,由具体的社区治理模式(Policy)管理。提案者在调用 add_proposal() 时需质押一定数额的 NEAR 代币作为保证金。该押金将在提案正常结束时退还。## 2. 提案状态Sputnik-DAO 中的提案可能经历多种状态:- InProgress: 初始状态,投票进行中- Approved: 投票通过 - Rejected: 投票未通过- Removed: 被移除- Expired: 过期- Moved: 已迁移- Failed: 执行失败提案状态变化由 act_proposal() 方法驱动。DAO 成员可调用该方法对提案执行投票等操作:- VoteApprove: 赞成- VoteReject: 反对 - VoteRemove: 移除投票后会调用 policy.proposal_status() 进行计票,满足条件时更新提案状态。## 3. 提案执行投票通过的提案(Approved状态)将调用 internal_execute_proposal() 函数执行决策内容。Sputnik-DAO 支持多种提案类型,主要涉及 DAO 治理模式的配置更新。这里介绍两种典型提案类型的处理:### 3.1 合约函数执行提案FunctionCall 类型提案允许执行指定的合约函数。提案中包含了要执行的函数操作(actions),可以指定多个连续的 function_call。Sputnik-DAO 采用 Promise Batch Actions 的形式完成合约函数执行。### 3.2 合约资金转移提案 Transfer 类型提案用于将合约账户积累的代币转移到指定账户。internal_execute_proposal() 会调用 internal_payout() 函数,实现对不同类型 Fungible Token 和接收账户的转账操作。## 4. 总结本文介绍了 Sputnik DAO 合约的核心概念 - 提案(Proposal),包括提案的创建、投票、状态变化和执行过程。后续将基于提案机制,对 Sputnik-DAO 的治理模式(Policy)展开更详细的描述。
Sputnik DAO智能合约剖析:提案机制的设计与实现
Rust智能合约养成日记(11) Sputnik DAO提案机制剖析
Sputnik-DAO 作为 NEAR Protocol 的基础设施,正推动 NEAR 生态向去中心化方向发展。目前该平台已促成多个 NEAR 项目建立去中心化自治社区,提供了完整灵活高效的社区决策治理方案。
Sputnikdaov2 是用于 Sputnik-DAO 社区治理投票的智能合约。本文将介绍该合约的核心概念:提案(Proposal),后续文章将围绕提案介绍相关的 DAO 社区治理模式(Policy)。
1. 提案发起
Sputnik-DAO 社区成员可以就项目治理或管理发表意见或提交提案。持股成员可以对提案进行审议和投票,从而影响项目未来走向。
在合约层面,DAO 成员可调用 sputnikdaov2 合约的 add_proposal() 方法发起新提案:
rust pub fn add_proposal(&mut self, proposal: ProposalInput) -> u64
提案者需提供提案的详细信息(ProposalInput):
add_proposal() 方法会进行校验处理,生成完整初始化的提案(Proposal),并与唯一的 proposal_id 绑定,添加到合约全局维护的 Contract.proposals 映射中。
提案包含以下完整属性信息:
需要注意的是,Sputnik-DAO 存在提案押金(proposal_bond)的概念,由具体的社区治理模式(Policy)管理。提案者在调用 add_proposal() 时需质押一定数额的 NEAR 代币作为保证金。该押金将在提案正常结束时退还。
2. 提案状态
Sputnik-DAO 中的提案可能经历多种状态:
提案状态变化由 act_proposal() 方法驱动。DAO 成员可调用该方法对提案执行投票等操作:
投票后会调用 policy.proposal_status() 进行计票,满足条件时更新提案状态。
3. 提案执行
投票通过的提案(Approved状态)将调用 internal_execute_proposal() 函数执行决策内容。
Sputnik-DAO 支持多种提案类型,主要涉及 DAO 治理模式的配置更新。这里介绍两种典型提案类型的处理:
3.1 合约函数执行提案
FunctionCall 类型提案允许执行指定的合约函数。提案中包含了要执行的函数操作(actions),可以指定多个连续的 function_call。
Sputnik-DAO 采用 Promise Batch Actions 的形式完成合约函数执行。
3.2 合约资金转移提案
Transfer 类型提案用于将合约账户积累的代币转移到指定账户。
internal_execute_proposal() 会调用 internal_payout() 函数,实现对不同类型 Fungible Token 和接收账户的转账操作。
4. 总结
本文介绍了 Sputnik DAO 合约的核心概念 - 提案(Proposal),包括提案的创建、投票、状态变化和执行过程。后续将基于提案机制,对 Sputnik-DAO 的治理模式(Policy)展开更详细的描述。