📢 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)的變化規則。