Chương mới của hệ sinh thái NEAR: Phân tích sâu về cơ chế đề xuất của Sputnik DAO

Nhật ký phát triển hợp đồng thông minh Rust (10-3): Khái niệm cốt lõi của Sputnik DAO - Đề xuất ( Phân tích )

Sputnik-DAO như một cơ sở hạ tầng được cung cấp bởi NEAR Protocol, đang mạnh mẽ thúc đẩy hệ sinh thái NEAR theo hướng "phi tập trung". Hiện tại, nền tảng này đã tạo điều kiện cho nhiều dự án NEAR thiết lập cộng đồng tự quản "phi tập trung", đồng thời cung cấp giải pháp quản trị quyết định cộng đồng hoàn chỉnh, linh hoạt và hiệu quả.

Sputnikdaov2 là hợp đồng thông minh được sử dụng cho việc bỏ phiếu quản trị cộng đồng Sputnik-DAO. Bài viết này sẽ giới thiệu về các khái niệm cốt lõi của hợp đồng: đề xuất (Proposal), các bài viết tiếp theo sẽ xoay quanh "đề xuất" để giới thiệu các mô hình quản trị cộng đồng DAO liên quan (Policy).

1. Khởi xướng đề xuất ( Thêm đề xuất )

Mỗi thành viên trong cộng đồng Sputnik-DAO đều có thể bày tỏ ý kiến hoặc đề xuất về việc quản lý hoặc quản trị dự án. Sau đó, mỗi thành viên trong cộng đồng nắm giữ cổ phần trong DAO đều có thể xem xét và bỏ phiếu cho đề xuất đó. Nói cách khác, mỗi thành viên trong Sputnik-DAO đều có thể ảnh hưởng đến hướng đi tương lai của dự án bằng cách bỏ phiếu cho đề xuất của người khác hoặc tự khởi xướng đề xuất quản lý mới.

Tại cấp hợp đồng, các thành viên trong cộng đồng DAO có thể gọi phương thức add_proposal() được cung cấp bởi hợp đồng sputnikdaov2 để khởi xướng đề xuất mới.

gỉ u64

Người đề xuất cần cung cấp thông tin chi tiết về đề xuất này ( ProposalInput ):

  • Mô tả văn bản đề xuất (Description). Thông tin này sẽ được công khai hiển thị trên giao diện chính của Sputnik-DAO, giúp các thành viên trong cộng đồng hiểu được mục đích và ý nghĩa của đề xuất.

  • Loại đề xuất(kind). Người đề xuất cần chọn theo loại ý kiến về quản lý dự án( như gọi hàm đặc quyền chính của hợp đồng cần chọn loại FunctionCall, chuyển tiền dự án hợp đồng cần chọn loại Transfer, thiết lập/thay đổi cấp độ kiểm soát quyền quản trị hợp đồng cần chọn loại ChangePolicyAddOrUpdateRole, v.v.)

Những thông tin ProposalInput này sẽ được truyền vào phương thức add_proposal(), phương thức này sẽ thực hiện kiểm tra và xử lý liên quan, và tạo ra một đề xuất (Proposal) với thông tin khởi tạo đầy đủ. Cuối cùng, đề xuất này sẽ được liên kết với một proposal_id duy nhất và được thêm vào bản đồ Contract.proposals được duy trì toàn cầu bởi hợp đồng Sputnik-DAO dưới dạng <key, value=""> trong hồ sơ đề xuất (.

Đề xuất được định nghĩa bởi Sputnik-DAO có các thông tin thuộc tính đầy đủ sau:

gỉ pub struct Đề xuất { pub id: u64, pub proposer: AccountId, pub description: String, pub kind: ProposalKind, pub status: ProposalStatus, pub vote_period_end: BlockHeight, pub vote_counts: HashMap<votepolicy, hashmap<accountid,="" balance="">>, pub votes: HashMap<accountid, vote="">, pub submission_time: Timestamp, }

Trong đề xuất này, nội dung của thuộc tính description và kind sẽ được trích xuất từ thông tin ProposalInput do proposer cung cấp khi tạo đề xuất. Cụ thể, hợp đồng này sử dụng trait From của ngôn ngữ Rust để thực hiện chuyển đổi kiểu từ ProposalInput sang Proposal.

Quá trình chuyển đổi này đã gắn liền với nhiều thông tin trạng thái đề xuất hơn:

  • Người đề xuất trong đề xuất mới được thêm vào )proposer( sẽ tự động được gán giá trị là người gọi phương thức add_proposal)(, tức là env::predecessor_account_id)(, thuộc tính này là thật và không bị người dùng kiểm soát;

  • Trạng thái đề xuất mới được thêm )status( được khởi tạo mặc định là ProposalStatus::InProgress, tức là vẫn đang trong giai đoạn bỏ phiếu;

  • Thời gian khởi xướng đề xuất mới được gán là dấu thời gian của khối này env::block_timestamp)(;

  • Do không có ai bỏ phiếu khi đề xuất mới được nộp, nên trạng thái bỏ phiếu )vote_counts, votes( đều được khởi tạo là HashMap::default)(.

Cần lưu ý rằng: trong Sputnik-DAO có khái niệm tiền đặt cọc đề xuất )proposal_bond(, tiền đặt cọc này sẽ được quản lý theo mô hình quản trị cộng đồng cụ thể của Sputnik-DAO )Policy(.

Đọc mã liên quan có thể thấy, hợp đồng yêu cầu người đề xuất phải đặt cọc một số lượng NEAR token nhất định làm tiền đặt cọc cho đề xuất mới khi gọi phương thức add_proposal)(. Khoản tiền đặt cọc này sẽ được hoàn trả cho người đề xuất thông qua việc gọi hàm nội bộ của hợp đồng internal_return_bonds)( khi đề xuất kết thúc bình thường) với phiếu bầu của cộng đồng đồng ý ProposalStatus::Approved | phiếu bầu của cộng đồng phản đối ProposalStatus::Rejected(.

Tuy nhiên, BlockSec đã phát hiện ra khi giải thích mã hợp đồng tại đây:

Sputnik-DAO không duy trì số tiền đặt cọc lịch sử đề xuất riêng cho từng người dùng khi xử lý đề xuất đặt cọc. Khi người dùng khởi xướng giao dịch và gọi phương thức hợp đồng add_proposal)( để thêm đề xuất mới, có thể sẽ gán cho giao dịch đó một số tiền NEAR token vượt quá chính sách policy.bounty_bond được định nghĩa bởi chiến lược quản trị DAO)Policy(. Điều này sẽ dẫn đến phần đặt cọc dư thừa, và sẽ không được hoàn trả cho người đề xuất khi thực hiện hàm internal_return_bonds sau đó.

Sau khi đội ngũ BlockSec kịp thời liên lạc với bên dự án, cuối cùng sự cố )160 đã được sửa chữa.

Thêm nhiều chiến lược kiểm tra và xử lý liên quan đến các đề xuất được thực hiện nội bộ của Sputnik-DAO sẽ được giải thích chi tiết trong cuốn sách sắp ra mắt "Nhật ký nuôi dưỡng hợp đồng thông minh Rust (10-4) Phân tích mô hình quản trị cộng đồng Sputnik DAO."

2. Trạng thái đề xuất ( Proposal Status )

Bất kỳ đề xuất tiêu chuẩn nào trong Sputnik-DAO có thể trải qua nhiều trạng thái khác nhau #158被确认并及时在PR# trạng thái đề xuất mới được khởi tạo là: InProgress (

gỉ pub enum ProposalStatus { Đang tiến hành, Đã phê duyệt, Bị từ chối, Đã gỡ bỏ, Hết hạn, Di chuyển, Thất bại, }

Sự thay đổi trạng thái của các đề xuất trong hồ sơ đề xuất được điều khiển bởi một phương thức khác của hợp đồng act_proposal)(.

Các thành viên Sputnik-DAO có thể gọi phương thức act_proposal)( để thực hiện các thao tác cụ thể đối với đề xuất ) được chỉ định bằng id (:

gỉ pub enum Action { AddProposal, RemoveProposal, VoteApprove, VoteReject, VoteRemove, Hoàn tất, MoveToHub, }

Điển hình, đối với các đề xuất trong trạng thái InProgress, các thành viên của cộng đồng DAO có thể gọi act_proposal)( để thực hiện các thao tác bỏ phiếu cụ thể:

  • Action::VoteApprove:表赞成;
  • Action::VoteReject: biểu phản đối;
  • Action::VoteRemove: cho rằng đề xuất này không có ý nghĩa thực tế, cần phải loại bỏ;

Theo cách thực hiện trên, sau khi gọi hàm update_votes)(, chương trình sẽ chủ động gọi policy.proposal_status)( để thực hiện công việc bỏ phiếu. Đối với các đề xuất đạt ngưỡng bỏ phiếu, trạng thái của đề xuất sẽ được thay đổi tương ứng.

Thay đổi sau:

  • Nếu trạng thái đề xuất là Approved, thì đề xuất đó sẽ được thực hiện bằng cách gọi internal_execute_proposal)(;

  • Nếu trạng thái đề xuất là Rejected hoặc Removed, thì đề xuất đó sẽ được thực hiện các thao tác hoàn tất tiếp theo bằng cách gọi internal_reject_proposal)(.

Đáng chú ý là, trạng thái Rejected khác với trạng thái Removed ở chỗ: các đề xuất cuối cùng được xác định là trạng thái Removed sẽ bị loại bỏ trực tiếp khỏi hồ sơ đề xuất, ) như một hình phạt ( sẽ không hoàn lại khoản tiền đặt cọc ban đầu cho người đề xuất. Còn đối với các đề xuất ở trạng thái Rejected, đề xuất sẽ tiếp tục được giữ lại trong hồ sơ đề xuất và hoàn lại khoản tiền đặt cọc tương ứng.

![])https://img-cdn.gateio.im/webp-social/moments-84ee9ca630a4cdcdb0d2eb63450a7cf4.webp(

3. Thực hiện đề xuất ) Thực hiện đề xuất (

Nếu một đề xuất có trạng thái là Approved sau khi bỏ phiếu kết thúc, lúc này phương thức hợp đồng act_proposal)( sẽ tiếp tục gọi hàm internal_execute_proposal)( để thực hiện nội dung quyết định của đề xuất.

Các loại đề xuất được hỗ trợ bởi Sputnik-DAO được liệt kê như sau ) Hầu hết các loại đề xuất liên quan đến việc cập nhật cấu hình của mô hình quản trị DAO (:

  • ProposalKind::ThayĐổiCấuHình
  • ProposalKind::ChangePolicy
  • ProposalKind::ThêmThànhViênVàoVaiTrò
  • ProposalKind::RemoveMemberFromRole
  • ProposalKind::FunctionCall
  • ProposalKind::UpgradeSelf
  • ProposalKind::UpgradeRemote
  • ProposalKind::Chuyển nhượng
  • ProposalKind::SetStakingContract
  • ProposalKind::Thêm phần thưởng
  • ProposalKind::BountyDone
  • ProposalKind::Vote
  • ProposalKind::Cập nhậtThôngTinNhàMáy
  • ProposalKind::ThayĐổiChínhSáchThêmHoặcCậpNhậtVaiTrò
  • ProposalKind::ThayĐổiChínhSáchGỡBỏVaiTrò
  • ProposalKind::Thay đổi chính sách cập nhật chính sách bỏ phiếu mặc định
  • ProposalKind::ThayĐổiThamSốCậpNhậtChínhSách

Mỗi loại đề xuất ở trên đều được thực hiện xử lý tương ứng trong hàm internal_execute_proposal)(. Phần này sẽ giới thiệu sâu sắc cho mọi người về hai loại quy trình xử lý đề xuất điển hình:

  • ProposalKind::FunctionCall
  • ProposalKind::Chuyển nhượng

) 3.1 Đề xuất thực hiện hàm hợp đồng (ProposalKind::FunctionCall)

Hàm internal_execute_proposal() đã thực hiện các điểm vào xử lý như sau cho các đề xuất có ProposalKind là FunctionCall:

gỉ ProposalKind::FunctionCall { receiver_id, actions } => { let mut promise = Promise::new###receiver_id.clone()(; cho hành động trong các hành động { promise = promise.function_call) action.method_name, action.args, action.deposit, action.gas, ( } promise.into() }

Đề xuất loại FunctionCall đã được truyền vào tham số ProposalInput cụ thể chức năng mà đề xuất này sẽ thực hiện khi người đề xuất gọi phương thức add_proposal)()actions(.

Hợp đồng NEAR cho phép liên kết nhiều function_call liên tiếp trong một Promise. Do đó, bên trong các actions mà người đề xuất ban đầu đã thiết lập có thể có nhiều đối tượng ActionCall như sau:

gỉ pub struct ActionCall { pub method_name: String, pub args: Vec, pub deposit: Balance, pub gas: Gas, }

Mỗi ActionCall có thể chỉ định tên phương thức hợp đồng tương ứng cũng như các tham số phương thức khác.

Tóm lại, Sputnik-DAO đã thực hiện việc thi hành các đề xuất loại hàm hợp đồng dưới hình thức Hành động Lô Hứa.

![])https://img-cdn.gateio.im/webp-social/moments-427716593b21fa32b47855ceb5e101fc.webp(

) 3.2 Thực hiện đề xuất chuyển tiền hợp đồng (ProposalKind::Transfer)

Khi dự án hợp đồng thông minh NEAR được triển khai và hoạt động trong một khoảng thời gian dài, tài khoản hợp đồng có thể đã tích lũy được nhiều Fungible Token(, bao gồm cả token NEAR gốc, hoặc các token khác đáp ứng tiêu chuẩn NEP-141).

Lúc này, các thành viên cộng đồng Sputnik-DAO có thể tập hợp các token này vào tài khoản receiver_id đã chỉ định bằng cách nộp đề xuất chuyển tiền hợp đồng.

Cổng xử lý tương ứng cũng được thực hiện cho các đề xuất có ProposalKind là Transfer: internal_execute_proposal###(.

gỉ ProposalKind::Transfer { token_id, receiver_id, amount } => { self.internal_payout)token_id, receiver_id, amount( .into)( }

Nền tảng xử lý nhánh này sẽ gọi hàm internal_payout)(, thực hiện các thao tác chuyển tiền cho các loại Token Fungible khác nhau và các loại receiver_id)EOA hoặc tài khoản hợp đồng(.

![])https://img-cdn.gateio.im/webp-social/moments-ef0b959c42e1f5fc6263cd4a86fd078e.webp(

4. Tóm tắt và Dự báo

Bài viết này đã giới thiệu cho mọi người về khái niệm cốt lõi của hợp đồng thông minh Sputnik DAO - đề xuất )Proposal(, đồng thời cũng giải thích ngắn gọn cách tạo đề xuất mới trong Sputnik DAO và cách bỏ phiếu thực hiện, cũng như quy tắc thay đổi trạng thái cơ bản liên quan đến đề xuất )Status(.

Nhật ký phát triển hợp đồng thông minh Rust tiếp theo sẽ dựa trên những đề xuất để triển khai và cấu hình mô hình quản trị trong Sputnik-DAO )Policy(, xin hãy chờ đợi!

![])https://img-cdn.gateio.im/webp-social/moments-eb73d5e15f6161f0a4b442cd4b99a91e.webp(<accountid,><votepolicy,><key,>

Xem bản gốc
Trang này có thể chứa nội dung của bên thứ ba, được cung cấp chỉ nhằm mục đích thông tin (không phải là tuyên bố/bảo đảm) và không được coi là sự chứng thực cho quan điểm của Gate hoặc là lời khuyên về tài chính hoặc chuyên môn. Xem Tuyên bố từ chối trách nhiệm để biết chi tiết.
  • Phần thưởng
  • 6
  • Đăng lại
  • Chia sẻ
Bình luận
0/400
GraphGuruvip
· 08-12 20:42
bull à lại đang thực hiện cơ chế đề xuất rồi
Xem bản gốcTrả lời0
HashBrowniesvip
· 08-12 19:04
Hợp đồng này thật khó xử lý...
Xem bản gốcTrả lời0
AirdropHunter007vip
· 08-12 19:04
gần như tôi đã hiểu câu hỏi này
Xem bản gốcTrả lời0
TokenTaxonomistvip
· 08-12 19:01
hmm... nói một cách thống kê, cơ chế đề xuất của sputnik hiển thị sự hỗn loạn thấp hơn 47.3% so với các khung dao tối ưu. tôi đã lập bản đồ toàn bộ cây phân loại trong bảng tính của mình
Xem bản gốcTrả lời0
BTCBeliefStationvip
· 08-12 18:59
người chơi dao thật sự không chịu nổi nữa
Xem bản gốcTrả lời0
BrokenYieldvip
· 08-12 18:55
một dao khác sẽ không khắc phục được các rủi ro hệ thống... đã xem bộ phim này trước đây smh
Xem bản gốcTrả lời0
  • Ghim
Giao dịch tiền điện tử mọi lúc mọi nơi
qrCode
Quét để tải xuống ứng dụng Gate
Cộng đồng
Tiếng Việt
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)