Sputnik DAO提案机制详解:从发起到执行的全流程剖析

robot
摘要生成中

Rust智能合约养成日记(11):Sputnik DAO提案机制剖析

Sputnik-DAO作为NEAR Protocol的基础设施,正在推动NEAR生态向去中心化方向发展。目前该平台已促成了众多NEAR项目的自治社区,同时也提供了完整灵活且高效的社区决策治理解决方案。

Sputnikdaov2是用于Sputnik-DAO社区治理投票的智能合约。本文将介绍该合约的核心概念:提案(Proposal),并围绕提案讲解相关的DAO社区治理模式(Policy)。

1. 提案发起

Sputnik-DAO社区中的每位成员都可以就项目的治理或管理发表意见或提交提案。随后每个在DAO中持股的社区成员都可以对该提案进行审议和投票。换言之,Sputnik-DAO中的每个成员都可以通过对他人提案投票或自己发起新的管理提案来影响项目的未来走向。

从合约层面看,DAO社区成员可调用sputnikdaov2合约的add_proposal()方法来发起一个新的提案。

此时提案者需提供该提案的详细信息(ProposalInput):

  • 提案的文字描述(Description)。此信息将公开展示在Sputnik-DAO主页前端,帮助社区成员理解该提案的目的与意义。

  • 提案的类型(kind)。提案者需根据对项目管理所提的意见类型进行相应的选择(如合约关键特权函数的调用需选择FunctionCall类型,合约项目资金的转移需选择Transfer类型等)。

这些ProposalInput信息将作为参数传入add_proposal()方法,该方法会进行相关校验与处理,并生成一个带有完整初始化信息的提案(Proposal)。最终该提案会与唯一的proposal_id绑定,以<key, value="">的形式被添加到Sputnik-DAO合约全局维护的Contract.proposals映射中(提案池)。

需要注意的是,Sputnik-DAO中存在提案押金(proposal_bond)的概念,该押金将根据具体的Sputnik-DAO社区治理模式(Policy)进行管理。合约要求提案者在调用add_proposal()方法时质押一定数额的NEAR代币作为新提案的保证金。该笔押金将在提案正常结束(社区投票赞成或反对)时通过调用合约的内部函数internal_return_bonds()退还给提案人。

2. 提案状态

Sputnik-DAO中的任何一个标准提案都可能经历多种状态(新的提案状态被初始化为InProgress):

  • InProgress:投票进行中
  • Approved:提案已通过
  • Rejected:提案被否决
  • Removed:提案被移除
  • Failed:提案执行失败
  • Expired:提案已过期

提案池中的提案状态变化由合约的act_proposal()方法驱动。Sputnik-DAO成员可调用act_proposal()方法对具体的提案(通过id指定)执行操作。

对于处于InProgress状态的提案,DAO社区成员可调用act_proposal()执行具体的投票操作:

  • Action::VoteApprove:表赞成
  • Action::VoteReject:表反对
  • Action::VoteRemove:认为该提案没有实际意义,需移除

根据实现,在内部调用update_votes()函数后,程序会主动调用policy.proposal_status()进行计票工作。对于满足投票阈值的提案,提案的状态将进行相应的变更。

变更后:

  • 若提案状态为Approved,则该提案将通过调用internal_execute_proposal()被执行;
  • 若提案状态为Rejected或Removed,则该提案将通过调用internal_reject_proposal()执行后续的收尾操作。

值得一提的是,Rejected与Removed状态的不同之处在于:被确定为Removed状态的提案将直接从提案池中移除,且不会退还当初所质押的押金给提案者。而对于Rejected状态的提案,该提案将继续保留在提案池中,并退还相应的押金。

3. 提案执行

若某一提案在投票结束后状态为Approved,此时合约方法act_proposal()内部将继续调用internal_execute_proposal()函数执行提案所包含的决策内容。

Sputnik-DAO所支持的提案类型包括:ChangeConfig、ChangePolicy、AddMemberToRole、RemoveMemberFromRole、FunctionCall、UpgradeSelf、UpgradeRemote、Transfer、SetStakingContract、AddBounty、BountyDone、Vote、FactoryInfoUpdate、ChangePolicyAddOrUpdateRole、ChangePolicyRemoveRole、ChangePolicyUpdateDefaultVotePolicy、ChangePolicyUpdateParameters等。

以下重点介绍两种典型的提案类型处理流程:

3.1 合约函数执行提案(ProposalKind::FunctionCall)

FunctionCall类型的提案在提案者调用add_proposal()方法时,已通过ProposalInput参数传入了具体该提案所要执行的函数操作(actions)。NEAR合约允许在一个Promise中绑定多个连续的function_call。因此最初提案者设定的actions内部可以有多个ActionCall对象,每个ActionCall可指定相应的合约方法名以及方法参数等。

Sputnik-DAO采用Promise Batch Actions的形式完成了合约函数执行类型提案的执行。

3.2 合约资金转移提案(ProposalKind::Transfer)

当NEAR智能合约项目运行一段时间后,合约账户本身可能已积累了较多的Fungible Token(包括原生NEAR代币,或其它符合NEP-141标准的代币)。

此时Sputnik-DAO社区成员可通过提交合约资金转移提案将这些代币归集到指定的receiver_id账户。internal_execute_proposal()对于匹配ProposalKind为Transfer的提案也实现了相应的处理入口。

该处理分支底层将调用internal_payout()函数,实现对于不同类型Fungible Token以及不同类型receiver_id(EOA或者合约账户)的转账操作。

4. 总结

本文介绍了Sputnik DAO合约的核心概念——提案(Proposal),同时也简要说明了如何在Sputnik DAO中创建新的提案并投票执行,及其相关提案基本状态(Status)的变化规则。

</key,>

ACT2.98%
此页面可能包含第三方内容,仅供参考(非陈述/保证),不应被视为 Gate 认可其观点表述,也不得被视为财务或专业建议。详见声明
  • 赞赏
  • 7
  • 分享
评论
0/400
ThatsNotARugPullvip
· 07-26 11:04
太官方了吧 直接说人话
回复0
BlockDetectivevip
· 07-26 08:11
Near好像挺香
回复0
DeFiVeteranvip
· 07-23 11:35
投个提案试试水!
回复0
fren_with_benefitsvip
· 07-23 11:17
靠靠靠 卧槽 这个Sputnik好用的
回复0
倒霉的矿工vip
· 07-23 11:06
真投票 假治理咯
回复0
LayerHoppervip
· 07-23 11:06
感觉还行吧 就是太复杂了
回复0
SerumSquirtervip
· 07-23 11:06
啊这还要看那么多啊
回复0
交易,随时随地
qrCode
扫码下载 Gate APP
社群列表
简体中文
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)