Buku Harian Pengembangan Kontrak Pintar Rust (10-3): Konsep Inti DAO Sputnik - Proposal ( Analisis
Sputnik-DAO sebagai infrastruktur yang disediakan oleh NEAR Protocol, sedang mendorong ekosistem NEAR menuju arah "decentralized". Saat ini, platform tersebut telah memfasilitasi banyak proyek NEAR untuk membangun komunitas otonom "decentralized", sambil menyediakan solusi tata kelola keputusan komunitas yang lengkap, fleksibel, dan efisien.
Sputnikdaov2 adalah kontrak pintar yang digunakan untuk pemungutan suara dalam tata kelola komunitas Sputnik-DAO. Artikel ini akan memperkenalkan konsep inti dari kontrak tersebut: Proposal), artikel selanjutnya akan membahas tentang "proposal" yang berkaitan dengan pola tata kelola komunitas DAO(Policy).
1. Pengajuan ( Tambah Usulan )
Setiap anggota komunitas Sputnik-DAO dapat memberikan pendapat atau mengajukan proposal mengenai tata kelola atau manajemen proyek. Kemudian, setiap anggota komunitas yang memiliki saham di DAO dapat meninjau dan memberikan suara pada proposal tersebut. Dengan kata lain, setiap anggota di Sputnik-DAO dapat mempengaruhi arah masa depan proyek dengan memberikan suara pada proposal orang lain atau mengajukan proposal manajemen baru.
Pada tingkat kontrak, anggota komunitas DAO dapat memanggil metode add_proposal() yang disediakan oleh kontrak sputnikdaov2 untuk mengajukan proposal baru.
karat
u64
Pengusul harus memberikan rincian lengkap tentang proposal tersebut (ProposalInput):
Deskripsi teks proposal (Description). Informasi ini akan ditampilkan secara publik di halaman depan Sputnik-DAO, membantu anggota komunitas memahami tujuan dan makna proposal.
Jenis proposal (kind). Pengusul harus memilih berdasarkan jenis saran yang diberikan untuk manajemen proyek ( seperti jika pemanggilan fungsi hak istimewa kunci kontrak diperlukan, pilih jenis FunctionCall, untuk transfer dana proyek kontrak, pilih jenis Transfer, untuk pengaturan/perubahan tingkat kontrol hak pemerintahan kontrak, pilih jenis ChangePolicyAddOrUpdateRole, dan lain-lain ).
Informasi ProposalInput ini akan digunakan sebagai parameter yang diteruskan ke metode add_proposal(), yang akan melakukan pemeriksaan dan pemrosesan terkait, serta menghasilkan proposal(Proposal) dengan informasi inisialisasi lengkap. Akhirnya, proposal ini akan terikat dengan proposal_id yang unik dan ditambahkan ke peta Contract.proposals yang dikelola secara global oleh kontrak Sputnik-DAO dalam bentuk <key, value=""> di dalam kolam proposal(.
Proposal yang didefinisikan oleh Sputnik-DAO memiliki informasi atribut lengkap berikut:
Dalam proposal ini, konten atribut description dan kind akan diambil dari informasi ProposalInput yang diberikan oleh proposer saat membuat proposal. Secara khusus, kontrak ini menggunakan trait From dari bahasa Rust untuk mengimplementasikan konversi tipe dari ProposalInput ke Proposal.
Proses konversi ini mengikat lebih banyak informasi status proposal:
Penyerang pada proposal yang baru ditambahkan )proposer( akan secara otomatis diberikan nilai sebagai pemanggil metode add_proposal)(, yaitu env::predecessor_account_id)(, atribut ini nyata dan tidak dapat dikendalikan oleh pengguna;
Status proposal yang baru ditambahkan )status( secara default diinisialisasi sebagai ProposalStatus::InProgress, yaitu masih dalam tahap pemungutan suara;
Waktu pengajuan proposal yang baru ditambahkan )submission_time( diberikan nilai sebagai timestamp blok ini env::block_timestamp)(;
Karena tidak ada yang memberikan suara saat proposal baru diajukan, status suara )vote_counts, votes( semuanya diinisialisasi sebagai kosong HashMap::default)(.
Perlu dicatat bahwa dalam Sputnik-DAO terdapat konsep setoran proposal )proposal_bond(, yang akan dikelola sesuai dengan model tata kelola komunitas Sputnik-DAO yang spesifik )Policy(.
Membaca kode terkait menunjukkan bahwa kontrak mengharuskan pengusul untuk menyetor sejumlah token NEAR sebagai jaminan untuk proposal baru saat memanggil metode add_proposal)(. Deposit ini akan dikembalikan kepada pengusul dengan memanggil fungsi internal kontrak internal_return_bonds)( setelah proposal berakhir secara normal) dengan suara dukungan ProposalStatus::Approved | suara penolakan ProposalStatus::Rejected(.
Namun, BlockSec sebelumnya menemukan saat menafsirkan kode kontrak di tempat itu:
Sputnik-DAO tidak memelihara jumlah deposit proposal sejarah secara terpisah untuk setiap pengguna saat memproses deposit proposal. Dan ketika pengguna memulai transaksi, memanggil metode kontrak add_proposal)( untuk menambahkan proposal baru, mungkin akan melampirkan lebih dari jumlah NEAR token policy.bounty_bond yang ditentukan oleh strategi pemerintahan DAO )Policy(. Ini akan menyebabkan bagian deposit yang berlebihan, dan tidak akan dikembalikan kepada pengusul saat fungsi internal_return_bonds dijalankan.
Setelah tim BlockSec segera menghubungi pihak proyek, akhirnya masalah )160 dapat diperbaiki.
Lebih banyak strategi verifikasi dan pemrosesan terkait proposal yang dilaksanakan di dalam Sputnik-DAO akan dijelaskan secara rinci dalam buku "Diari Pengembangan Kontrak Pintar Rust (10-4) Sputnik DAO::Analisis Mode Tata Kelola Komunitas" yang akan diluncurkan di kemudian hari.
2. Status Proposal(Proposal Status)
Setiap proposal standar dalam Sputnik-DAO dapat mengalami berbagai status berikut #158被确认并及时在PR# status proposal baru diinisialisasi sebagai: InProgress (
Tipikal, untuk proposal yang berada dalam status InProgress, anggota komunitas DAO dapat memanggil act_proposal() untuk melakukan tindakan pemungutan suara tertentu:
Action::VoteApprove:表赞成;
Action::VoteReject:menyatakan menolak;
Action::VoteRemove: menganggap bahwa proposal ini tidak memiliki arti praktis, perlu dihapus;
Berdasarkan implementasi di atas, setelah memanggil fungsi update_votes(), program akan secara aktif memanggil policy.proposal_status() untuk melakukan penghitungan suara. Untuk proposal yang memenuhi ambang batas suara, status proposal akan diubah sesuai.
Setelah diubah:
Jika status proposal adalah Disetujui, maka proposal tersebut akan dieksekusi dengan memanggil internal_execute_proposal();
Jika status proposal adalah Rejected atau Removed, proposal tersebut akan melanjutkan operasi penutupan setelah memanggil internal_reject_proposal().
Perlu dicatat bahwa perbedaan antara status Rejected dan Removed adalah: proposal yang akhirnya ditetapkan sebagai status Removed akan langsung dihapus dari kolam proposal, ( sebagai hukuman ) tidak akan mengembalikan deposit yang awalnya dipertaruhkan kepada pengusul proposal. Sementara untuk proposal dengan status Rejected, proposal tersebut akan tetap ada di kolam proposal, dan deposit yang sesuai akan dikembalikan.
3. Eksekusi Proposal(Execute Proposal)
Jika status suatu proposal setelah pemungutan suara berakhir adalah Disetujui, pada saat itu metode kontrak act_proposal() akan terus memanggil fungsi internal_execute_proposal() untuk melaksanakan konten keputusan yang terkandung dalam proposal.
Jenis proposal yang didukung oleh Sputnik-DAO tercantum di bawah ini ( Sebagian besar jenis proposal melibatkan pembaruan konfigurasi mode tata kelola DAO ):
Setiap jenis proposal di atas memiliki cabang pemrosesan yang sesuai di dalam fungsi internal_execute_proposal().
Bagian ini akan memperkenalkan secara mendalam dua jenis alur proses penanganan proposal yang khas:
ProposalKind::FunctionCall
ProposalKind::Transfer
( 3.1 Eksekusi fungsi kontrak usulan eksekusi )ProposalKind::FunctionCall(
Fungsi internal_execute_proposal)( telah mengimplementasikan titik masuk berikut untuk menangani proposal dengan ProposalKind berupa FunctionCall:
karat
ProposalKind::FunctionCall { receiver_id, actions } => {
let mut promise = Promise::new)receiver_id.clone###();
untuk aksi dalam tindakan {
janji = janji.function_call(
action.method_name,
action.args,
action.deposit,
action.gas,
)
}
promise.into((
}
Proposal tipe FunctionCall telah melewati parameter ProposalInput yang berisi fungsi operasi yang akan dieksekusi oleh proposal tersebut pada saat pengusul memanggil metode add_proposal)) actions(.
Kontrak NEAR memungkinkan mengikat beberapa function_call berturut-turut dalam satu Promise. Oleh karena itu, di dalam actions yang ditetapkan oleh pengusul awal, dapat terdapat berbagai objek ActionCall seperti berikut:
) 3.2 Eksekusi Proposal Transfer Dana Kontrak(ProposalKind::Transfer)
Ketika proyek kontrak pintar NEAR yang telah dikerahkan dan diluncurkan telah berjalan untuk waktu yang cukup lama, akun kontrak itu sendiri mungkin telah mengumpulkan sejumlah besar Fungible Token( termasuk token NEAR asli, atau token lain yang sesuai dengan standar NEP-141).
Saat ini, anggota komunitas Sputnik-DAO dapat mengumpulkan token ini ke akun receiver_id tertentu dengan mengajukan proposal pemindahan dana kontrak.
Internal_execute_proposal() yang sama juga mengimplementasikan titik masuk pemrosesan yang sesuai untuk proposal dengan ProposalKind adalah Transfer:
Pengolahan cabang ini akan memanggil fungsi internal_payout)(, untuk melakukan transfer untuk berbagai jenis Token Fungible serta berbagai jenis receiver_id) EOA atau akun kontrak(.
Artikel ini telah memperkenalkan kepada semua orang tentang konsep inti dari kontrak Sputnik DAO - Proposal ), sekaligus menjelaskan secara singkat bagaimana cara membuat proposal baru dalam Sputnik DAO dan melakukan voting, serta aturan perubahan status dasar terkait proposal (.
Diari pengembangan kontrak pintar Rust selanjutnya akan memberikan deskripsi yang lebih rinci mengenai implementasi dan konfigurasi dari model pemerintahan di Sputnik-DAO berdasarkan proposal )Policy(, mohon ditunggu!
Halaman ini mungkin berisi konten pihak ketiga, yang disediakan untuk tujuan informasi saja (bukan pernyataan/jaminan) dan tidak boleh dianggap sebagai dukungan terhadap pandangannya oleh Gate, atau sebagai nasihat keuangan atau profesional. Lihat Penafian untuk detailnya.
14 Suka
Hadiah
14
6
Posting ulang
Bagikan
Komentar
0/400
GraphGuru
· 08-12 20:42
Bull lagi mengadakan mekanisme proposal
Lihat AsliBalas0
HashBrownies
· 08-12 19:04
Kontrak ini sangat sulit untuk diatur...
Lihat AsliBalas0
AirdropHunter007
· 08-12 19:04
nearSaya mengerti soal ini
Lihat AsliBalas0
TokenTaxonomist
· 08-12 19:01
hmm... secara statistik, mekanisme proposal sputnik menunjukkan entropi 47,3% lebih rendah daripada kerangka dao yang optimal. saya telah memetakan seluruh pohon taksonomi di spreadsheet saya
Lihat AsliBalas0
BTCBeliefStation
· 08-12 18:59
Pemain dao benar-benar tidak tahan lagi.
Lihat AsliBalas0
BrokenYield
· 08-12 18:55
daos lain tidak akan memperbaiki risiko sistemik... sudah pernah melihat film ini sebelumnya smh
Babak baru ekosistem NEAR: Analisis mendalam tentang mekanisme proposal Sputnik DAO
Buku Harian Pengembangan Kontrak Pintar Rust (10-3): Konsep Inti DAO Sputnik - Proposal ( Analisis
Sputnik-DAO sebagai infrastruktur yang disediakan oleh NEAR Protocol, sedang mendorong ekosistem NEAR menuju arah "decentralized". Saat ini, platform tersebut telah memfasilitasi banyak proyek NEAR untuk membangun komunitas otonom "decentralized", sambil menyediakan solusi tata kelola keputusan komunitas yang lengkap, fleksibel, dan efisien.
Sputnikdaov2 adalah kontrak pintar yang digunakan untuk pemungutan suara dalam tata kelola komunitas Sputnik-DAO. Artikel ini akan memperkenalkan konsep inti dari kontrak tersebut: Proposal), artikel selanjutnya akan membahas tentang "proposal" yang berkaitan dengan pola tata kelola komunitas DAO(Policy).
1. Pengajuan ( Tambah Usulan )
Setiap anggota komunitas Sputnik-DAO dapat memberikan pendapat atau mengajukan proposal mengenai tata kelola atau manajemen proyek. Kemudian, setiap anggota komunitas yang memiliki saham di DAO dapat meninjau dan memberikan suara pada proposal tersebut. Dengan kata lain, setiap anggota di Sputnik-DAO dapat mempengaruhi arah masa depan proyek dengan memberikan suara pada proposal orang lain atau mengajukan proposal manajemen baru.
Pada tingkat kontrak, anggota komunitas DAO dapat memanggil metode add_proposal() yang disediakan oleh kontrak sputnikdaov2 untuk mengajukan proposal baru.
karat u64
Pengusul harus memberikan rincian lengkap tentang proposal tersebut (ProposalInput):
Deskripsi teks proposal (Description). Informasi ini akan ditampilkan secara publik di halaman depan Sputnik-DAO, membantu anggota komunitas memahami tujuan dan makna proposal.
Jenis proposal (kind). Pengusul harus memilih berdasarkan jenis saran yang diberikan untuk manajemen proyek ( seperti jika pemanggilan fungsi hak istimewa kunci kontrak diperlukan, pilih jenis FunctionCall, untuk transfer dana proyek kontrak, pilih jenis Transfer, untuk pengaturan/perubahan tingkat kontrol hak pemerintahan kontrak, pilih jenis ChangePolicyAddOrUpdateRole, dan lain-lain ).
Informasi ProposalInput ini akan digunakan sebagai parameter yang diteruskan ke metode add_proposal(), yang akan melakukan pemeriksaan dan pemrosesan terkait, serta menghasilkan proposal(Proposal) dengan informasi inisialisasi lengkap. Akhirnya, proposal ini akan terikat dengan proposal_id yang unik dan ditambahkan ke peta Contract.proposals yang dikelola secara global oleh kontrak Sputnik-DAO dalam bentuk <key, value=""> di dalam kolam proposal(.
Proposal yang didefinisikan oleh Sputnik-DAO memiliki informasi atribut lengkap berikut:
karat pub struct Proposal { 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, }
Dalam proposal ini, konten atribut description dan kind akan diambil dari informasi ProposalInput yang diberikan oleh proposer saat membuat proposal. Secara khusus, kontrak ini menggunakan trait From dari bahasa Rust untuk mengimplementasikan konversi tipe dari ProposalInput ke Proposal.
Proses konversi ini mengikat lebih banyak informasi status proposal:
Penyerang pada proposal yang baru ditambahkan )proposer( akan secara otomatis diberikan nilai sebagai pemanggil metode add_proposal)(, yaitu env::predecessor_account_id)(, atribut ini nyata dan tidak dapat dikendalikan oleh pengguna;
Status proposal yang baru ditambahkan )status( secara default diinisialisasi sebagai ProposalStatus::InProgress, yaitu masih dalam tahap pemungutan suara;
Waktu pengajuan proposal yang baru ditambahkan )submission_time( diberikan nilai sebagai timestamp blok ini env::block_timestamp)(;
Karena tidak ada yang memberikan suara saat proposal baru diajukan, status suara )vote_counts, votes( semuanya diinisialisasi sebagai kosong HashMap::default)(.
Perlu dicatat bahwa dalam Sputnik-DAO terdapat konsep setoran proposal )proposal_bond(, yang akan dikelola sesuai dengan model tata kelola komunitas Sputnik-DAO yang spesifik )Policy(.
Membaca kode terkait menunjukkan bahwa kontrak mengharuskan pengusul untuk menyetor sejumlah token NEAR sebagai jaminan untuk proposal baru saat memanggil metode add_proposal)(. Deposit ini akan dikembalikan kepada pengusul dengan memanggil fungsi internal kontrak internal_return_bonds)( setelah proposal berakhir secara normal) dengan suara dukungan ProposalStatus::Approved | suara penolakan ProposalStatus::Rejected(.
Namun, BlockSec sebelumnya menemukan saat menafsirkan kode kontrak di tempat itu:
Sputnik-DAO tidak memelihara jumlah deposit proposal sejarah secara terpisah untuk setiap pengguna saat memproses deposit proposal. Dan ketika pengguna memulai transaksi, memanggil metode kontrak add_proposal)( untuk menambahkan proposal baru, mungkin akan melampirkan lebih dari jumlah NEAR token policy.bounty_bond yang ditentukan oleh strategi pemerintahan DAO )Policy(. Ini akan menyebabkan bagian deposit yang berlebihan, dan tidak akan dikembalikan kepada pengusul saat fungsi internal_return_bonds dijalankan.
Setelah tim BlockSec segera menghubungi pihak proyek, akhirnya masalah )160 dapat diperbaiki.
Lebih banyak strategi verifikasi dan pemrosesan terkait proposal yang dilaksanakan di dalam Sputnik-DAO akan dijelaskan secara rinci dalam buku "Diari Pengembangan Kontrak Pintar Rust (10-4) Sputnik DAO::Analisis Mode Tata Kelola Komunitas" yang akan diluncurkan di kemudian hari.
2. Status Proposal(Proposal Status)
Setiap proposal standar dalam Sputnik-DAO dapat mengalami berbagai status berikut #158被确认并及时在PR# status proposal baru diinisialisasi sebagai: InProgress (
karat pub enum ProposalStatus { Dalam Proses, Disetujui, Ditolak, Dihapus, Kedaluwarsa, Dipindahkan, Gagal, }
Perubahan status proposal dalam kolam proposal didorong oleh metode lain dari kontrak act_proposal)(.
Anggota Sputnik-DAO dapat memanggil metode act_proposal)( untuk melaksanakan operasi berikut pada proposal tertentu yang ditentukan oleh id ):
karat pub enum Tindakan { TambahProposal, RemoveProposal, VoteApprove, VoteReject, VoteRemove, Finalisasi, MoveToHub, }
Tipikal, untuk proposal yang berada dalam status InProgress, anggota komunitas DAO dapat memanggil act_proposal() untuk melakukan tindakan pemungutan suara tertentu:
Berdasarkan implementasi di atas, setelah memanggil fungsi update_votes(), program akan secara aktif memanggil policy.proposal_status() untuk melakukan penghitungan suara. Untuk proposal yang memenuhi ambang batas suara, status proposal akan diubah sesuai.
Setelah diubah:
Jika status proposal adalah Disetujui, maka proposal tersebut akan dieksekusi dengan memanggil internal_execute_proposal();
Jika status proposal adalah Rejected atau Removed, proposal tersebut akan melanjutkan operasi penutupan setelah memanggil internal_reject_proposal().
Perlu dicatat bahwa perbedaan antara status Rejected dan Removed adalah: proposal yang akhirnya ditetapkan sebagai status Removed akan langsung dihapus dari kolam proposal, ( sebagai hukuman ) tidak akan mengembalikan deposit yang awalnya dipertaruhkan kepada pengusul proposal. Sementara untuk proposal dengan status Rejected, proposal tersebut akan tetap ada di kolam proposal, dan deposit yang sesuai akan dikembalikan.
3. Eksekusi Proposal(Execute Proposal)
Jika status suatu proposal setelah pemungutan suara berakhir adalah Disetujui, pada saat itu metode kontrak act_proposal() akan terus memanggil fungsi internal_execute_proposal() untuk melaksanakan konten keputusan yang terkandung dalam proposal.
Jenis proposal yang didukung oleh Sputnik-DAO tercantum di bawah ini ( Sebagian besar jenis proposal melibatkan pembaruan konfigurasi mode tata kelola DAO ):
Setiap jenis proposal di atas memiliki cabang pemrosesan yang sesuai di dalam fungsi internal_execute_proposal(). Bagian ini akan memperkenalkan secara mendalam dua jenis alur proses penanganan proposal yang khas:
( 3.1 Eksekusi fungsi kontrak usulan eksekusi )ProposalKind::FunctionCall(
Fungsi internal_execute_proposal)( telah mengimplementasikan titik masuk berikut untuk menangani proposal dengan ProposalKind berupa FunctionCall:
karat ProposalKind::FunctionCall { receiver_id, actions } => { let mut promise = Promise::new)receiver_id.clone###(); untuk aksi dalam tindakan { janji = janji.function_call( action.method_name, action.args, action.deposit, action.gas, ) } promise.into(( }
Proposal tipe FunctionCall telah melewati parameter ProposalInput yang berisi fungsi operasi yang akan dieksekusi oleh proposal tersebut pada saat pengusul memanggil metode add_proposal)) actions(.
Kontrak NEAR memungkinkan mengikat beberapa function_call berturut-turut dalam satu Promise. Oleh karena itu, di dalam actions yang ditetapkan oleh pengusul awal, dapat terdapat berbagai objek ActionCall seperti berikut:
karat pub struct ActionCall { pub method_name: String, pub args: Vec, pub deposit: Saldo, pub gas: Gas, }
Setiap ActionCall dapat menentukan nama metode kontrak yang sesuai dan parameter metode, dll.
Dengan demikian, Sputnik-DAO menggunakan bentuk Tindakan Batch Janji untuk menyelesaikan pelaksanaan proposal jenis eksekusi fungsi kontrak.
![])https://img-cdn.gateio.im/webp-social/moments-427716593b21fa32b47855ceb5e101fc.webp(
) 3.2 Eksekusi Proposal Transfer Dana Kontrak(ProposalKind::Transfer)
Ketika proyek kontrak pintar NEAR yang telah dikerahkan dan diluncurkan telah berjalan untuk waktu yang cukup lama, akun kontrak itu sendiri mungkin telah mengumpulkan sejumlah besar Fungible Token( termasuk token NEAR asli, atau token lain yang sesuai dengan standar NEP-141).
Saat ini, anggota komunitas Sputnik-DAO dapat mengumpulkan token ini ke akun receiver_id tertentu dengan mengajukan proposal pemindahan dana kontrak.
Internal_execute_proposal() yang sama juga mengimplementasikan titik masuk pemrosesan yang sesuai untuk proposal dengan ProposalKind adalah Transfer:
karat ProposalKind::Transfer { token_id, receiver_id, amount } => { self.internal_payout###token_id, receiver_id, amount( .into)( }
Pengolahan cabang ini akan memanggil fungsi internal_payout)(, untuk melakukan transfer untuk berbagai jenis Token Fungible serta berbagai jenis receiver_id) EOA atau akun kontrak(.
![])https://img-cdn.gateio.im/webp-social/moments-ef0b959c42e1f5fc6263cd4a86fd078e.webp(
4. Ringkasan dan Prakiraan
Artikel ini telah memperkenalkan kepada semua orang tentang konsep inti dari kontrak Sputnik DAO - Proposal ), sekaligus menjelaskan secara singkat bagaimana cara membuat proposal baru dalam Sputnik DAO dan melakukan voting, serta aturan perubahan status dasar terkait proposal (.
Diari pengembangan kontrak pintar Rust selanjutnya akan memberikan deskripsi yang lebih rinci mengenai implementasi dan konfigurasi dari model pemerintahan di Sputnik-DAO berdasarkan proposal )Policy(, mohon ditunggu!
![])https://img-cdn.gateio.im/webp-social/moments-eb73d5e15f6161f0a4b442cd4b99a91e.webp(</accountid,></votepolicy,></key,>