📢 Gate广场 #NERO发帖挑战# 秀观点赢大奖活动火热开启!
Gate NERO生态周来袭!发帖秀出NERO项目洞察和活动实用攻略,瓜分30,000NERO!
💰️ 15位优质发帖用户 * 2,000枚NERO每人
如何参与:
1️⃣ 调研NERO项目
对NERO的基本面、社区治理、发展目标、代币经济模型等方面进行研究,分享你对项目的深度研究。
2️⃣ 参与并分享真实体验
参与NERO生态周相关活动,并晒出你的参与截图、收益图或实用教程。可以是收益展示、简明易懂的新手攻略、小窍门,也可以是行情点位分析,内容详实优先。
3️⃣ 鼓励带新互动
如果你的帖子吸引到他人参与活动,或者有好友评论“已参与/已交易”,将大幅提升你的获奖概率!
NERO热门活动(帖文需附以下活动链接):
NERO Chain (NERO) 生态周:Gate 已上线 NERO 现货交易,为回馈平台用户,HODLer Airdrop、Launchpool、CandyDrop、余币宝已上线 NERO,邀您体验。参与攻略见公告:https://www.gate.com/announcements/article/46284
高质量帖子Tips:
教程越详细、图片越直观、互动量越高,获奖几率越大!
市场见解独到、真实参与经历、有带新互动者,评选将优先考虑。
帖子需原创,字数不少于250字,且需获得至少3条有效互动
Sputnik DAO提案机制详解:从发起到执行的全流程剖析
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):
提案池中的提案状态变化由合约的act_proposal()方法驱动。Sputnik-DAO成员可调用act_proposal()方法对具体的提案(通过id指定)执行操作。
对于处于InProgress状态的提案,DAO社区成员可调用act_proposal()执行具体的投票操作:
根据实现,在内部调用update_votes()函数后,程序会主动调用policy.proposal_status()进行计票工作。对于满足投票阈值的提案,提案的状态将进行相应的变更。
变更后:
值得一提的是,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)的变化规则。