# 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)展開更詳細的描述。