# Rust智能合約養成日記(11) - Sputnik DAO 提案機制詳解Sputnik-DAO 作爲 NEAR Protocol 的重要基礎設施,正在推動 NEAR 生態向去中心化方向發展。目前該平台已促成多個 NEAR 項目建立去中心化自治社區,提供了完整靈活的社區決策治理方案。Sputnikdaov2 是用於 Sputnik-DAO 社區治理投票的智能合約。本文將介紹該合約的核心概念:提案(Proposal),後續文章將圍繞提案介紹相關的 DAO 社區治理模式(Policy)。## 1. 提案發起Sputnik-DAO 社區成員可以就項目治理或管理發表意見或提交提案。每個持股成員都可以對提案進行審議和投票,從而影響項目未來走向。在合約層面,成員可調用 sputnikdaov2 合約的 add_proposal() 方法發起新提案:rustpub fn add_proposal(&mut self, proposal: ProposalInput) -> u64提案者需提供以下詳細信息:- 提案的文字描述(Description)- 提案的類型(kind)這些信息將作爲參數傳入 add_proposal() 方法,經過處理後生成一個完整的提案(Proposal),並與唯一的 proposal_id 綁定,添加到合約全局維護的提案池中。完整的提案屬性包括:提案者、狀態、發起時間、投票狀態等。需要注意的是,Sputnik-DAO 要求提案者質押一定數額的 NEAR 代幣作爲保證金。這筆押金在提案正常結束時會退還給提案者。## 2. 提案狀態Sputnik-DAO 中的提案可能經歷多種狀態,初始狀態爲 InProgress。狀態變化由 act_proposal() 方法驅動。成員可調用 act_proposal() 對提案執行以下操作:- VoteApprove:表示贊成 - VoteReject:表示反對- VoteRemove:認爲該提案無意義,需移除投票後,合約會調用 policy.proposal_status() 進行計票,滿足條件的提案狀態會相應變更。- Approved 狀態的提案將被執行- Rejected 或 Removed 狀態的提案將執行收尾操作Removed 狀態的提案會直接從提案池移除,不退還押金。Rejected 狀態的提案會保留在池中並退還押金。## 3. 提案執行 Approved 狀態的提案將調用 internal_execute_proposal() 函數執行決策內容。Sputnik-DAO 支持多種提案類型,本文重點介紹兩種典型類型:### 3.1 合約函數執行提案FunctionCall 類型提案可執行指定的合約方法。提案者在創建時通過 ProposalInput 傳入要執行的函數操作(actions)。每個 action 可指定合約方法名和參數。Sputnik-DAO 採用 Promise Batch Actions 的形式完成函數執行。### 3.2 合約資金轉移提案 Transfer 類型提案可將合約帳戶積累的代幣(NEAR或NEP-141標準代幣)轉移到指定帳戶。internal_execute_proposal() 會調用 internal_payout() 函數,實現對不同類型代幣和接收帳戶的轉帳操作。## 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 社區成員可以就項目治理或管理發表意見或提交提案。每個持股成員都可以對提案進行審議和投票,從而影響項目未來走向。
在合約層面,成員可調用 sputnikdaov2 合約的 add_proposal() 方法發起新提案:
rust pub fn add_proposal(&mut self, proposal: ProposalInput) -> u64
提案者需提供以下詳細信息:
這些信息將作爲參數傳入 add_proposal() 方法,經過處理後生成一個完整的提案(Proposal),並與唯一的 proposal_id 綁定,添加到合約全局維護的提案池中。
完整的提案屬性包括:提案者、狀態、發起時間、投票狀態等。
需要注意的是,Sputnik-DAO 要求提案者質押一定數額的 NEAR 代幣作爲保證金。這筆押金在提案正常結束時會退還給提案者。
2. 提案狀態
Sputnik-DAO 中的提案可能經歷多種狀態,初始狀態爲 InProgress。狀態變化由 act_proposal() 方法驅動。
成員可調用 act_proposal() 對提案執行以下操作:
投票後,合約會調用 policy.proposal_status() 進行計票,滿足條件的提案狀態會相應變更。
Removed 狀態的提案會直接從提案池移除,不退還押金。Rejected 狀態的提案會保留在池中並退還押金。
3. 提案執行
Approved 狀態的提案將調用 internal_execute_proposal() 函數執行決策內容。
Sputnik-DAO 支持多種提案類型,本文重點介紹兩種典型類型:
3.1 合約函數執行提案
FunctionCall 類型提案可執行指定的合約方法。提案者在創建時通過 ProposalInput 傳入要執行的函數操作(actions)。
每個 action 可指定合約方法名和參數。Sputnik-DAO 採用 Promise Batch Actions 的形式完成函數執行。
3.2 合約資金轉移提案
Transfer 類型提案可將合約帳戶積累的代幣(NEAR或NEP-141標準代幣)轉移到指定帳戶。
internal_execute_proposal() 會調用 internal_payout() 函數,實現對不同類型代幣和接收帳戶的轉帳操作。
4. 總結
本文介紹了 Sputnik DAO 合約的核心概念提案(Proposal),包括提案的創建、投票、狀態變化和執行流程。後續文章將基於提案詳細描述 Sputnik-DAO 的治理模式(Policy)實現與配置。