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