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,>

ACT-2.82%
查看原文
此頁面可能包含第三方內容,僅供參考(非陳述或保證),不應被視為 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)