Rust смартконтракти养成日记(11): Аналіз механізму пропозицій DAO Sputnik
Sputnik-DAO як інфраструктура NEAR Protocol, сприяє розвитку екосистеми NEAR у децентралізованому напрямку. Наразі ця платформа вже сприяла створенню численних автономних спільнот NEAR, а також надає повний, гнучкий та ефективний розв'язок для управління рішеннями спільноти.
Sputnikdaov2 є смартконтрактом для голосування з управління спільнотою Sputnik-DAO. У цій статті буде представлено основні концепції цього контракту: пропозиція (Proposal) та навколо пропозиції буде розглянуто пов'язані моделі управління спільнотою DAO (Policy).
1. Ініціювання пропозиції
Кожен учасник спільноти Sputnik-DAO може висловлювати свою думку або подавати пропозиції щодо управління або адміністрування проекту. Потім кожен учасник спільноти, який має акції в DAO, може розглядати й голосувати за цю пропозицію. Іншими словами, кожен учасник Sputnik-DAO може впливати на майбутній напрямок проекту, голосуючи за пропозиції інших або ініціюючи нові управлінські пропозиції.
З точки зору контракту, члени спільноти DAO можуть викликати метод add_proposal() смартконтракту sputnikdaov2 для ініціювання нової пропозиції.
У цей час пропонент має надати детальну інформацію про цю пропозицію (ProposalInput):
Текстовий опис пропозиції (Description). Ця інформація буде відкрито показана на фронтенді головної сторінки Sputnik-DAO, щоб допомогти членам спільноти зрозуміти мету та значення цієї пропозиції.
Тип пропозиції ( kind ). Пропонент повинен відповідно обрати тип пропозиції в залежності від висловлених думок щодо управління проектом (, наприклад, для виклику ключових привілейованих функцій контракту потрібно вибрати тип FunctionCall, для передачі коштів проекту контракту потрібно вибрати тип Transfer тощо ).
Ця інформація ProposalInput буде передана як параметри до методу add_proposal(), який виконає відповідну перевірку та обробку, а також створить пропозицію з повною інформацією про ініціалізацію (Proposal). В результаті ця пропозиція буде прив'язана до унікального proposal_id і буде додана до загального збереженого в Contract.proposals мапи Sputnik-DAO за формою <key, value=""> в пул пропозицій (.
Слід зазначити, що в Sputnik-DAO існує концепція депозиту за пропозицію )proposal_bond(, який буде управлятися відповідно до конкретної моделі управління спільнотою Sputnik-DAO )Policy(. Контракт вимагає, щоб пропоненти при виклику методу add_proposal)( внесли певну кількість токенів NEAR в якості забезпечення нової пропозиції. Цей депозит буде повернутий пропонентові через виклик внутрішньої функції контракту internal_return_bonds)(, коли пропозиція закінчиться нормально ) з голосуванням громади за чи проти (.
Будь-яка стандартна пропозиція в Sputnik-DAO може проходити через кілька станів ) новий стан пропозиції ініціюється як InProgress (:
InProgress:Голосування триває
Approved:Пропозиція була схвалена
Відхилено:提案被否决
Видалено: пропозицію було видалено
Не вдалося: виконання пропозиції не вдалося
Expired: Пропозиція вже завершилася
Зміна статусу пропозицій у пулі пропозицій керується методом контракту act_proposal)(. Члени Sputnik-DAO можуть викликати метод act_proposal)( для виконання операцій щодо конкретної пропозиції ), вказуючи її id (.
Для пропозицій у стані InProgress, члени спільноти DAO можуть викликати act_proposal)( для виконання конкретних голосувань:
Action::VoteApprove:голосування за
Action::VoteReject:висловити незгоду
Action::VoteRemove: вважає, що ця пропозиція не має практичного значення, її слід видалити
Згідно з реалізацією, після внутрішнього виклику функції update_votes)( програма активує виклик policy.proposal_status)( для проведення голосування. Для пропозицій, які відповідають порогу голосування, статус пропозиції буде відповідно змінено.
Зміни після:
Якщо статус пропозиції Approved, то ця пропозиція буде виконана шляхом виклику internal_execute_proposal)(;
Якщо статус пропозиції є Rejected або Removed, то ця пропозиція буде виконана шляхом виклику internal_reject_proposal)( для подальших завершальних дій.
Слід зазначити, що різниця між станами Rejected та Removed полягає в тому, що пропозиції, які були визнані в стані Removed, будуть безпосередньо видалені з пулу пропозицій, і застава, що була внесена спочатку, не буде повернена пропоненту. У той же час пропозиції в стані Rejected залишаться в пулі пропозицій і застава буде повернена.
Якщо певна пропозиція після закінчення голосування має статус Approved, у цей час метод контракту act_proposal)( внутрішньо продовжить викликати функцію internal_execute_proposal)( для виконання рішень, що містяться в пропозиції.
Sputnik-DAO підтримує такі типи пропозицій: ChangeConfig, ChangePolicy, AddMemberToRole, RemoveMemberFromRole, FunctionCall, UpgradeSelf, UpgradeRemote, Transfer, SetStakingContract, AddBounty, BountyDone, Vote, FactoryInfoUpdate, ChangePolicyAddOrUpdateRole, ChangePolicyRemoveRole, ChangePolicyUpdateDefaultVotePolicy, ChangePolicyUpdateParameters тощо.
Далі коротко представлені два типи обробки пропозицій:
) 3.1 Виконання функції контракту пропозиції ### ProposalKind::FunctionCall (
Пропозиції типу FunctionCall передаються через параметр ProposalInput, коли ініціатор пропозиції викликає метод add_proposal)(, де конкретно передаються функціональні дії, що мають бути виконані )actions(. Контракт NEAR дозволяє прив'язувати кілька послідовних function_call в одному Promise. Таким чином, всередині дій, визначених ініціатором пропозиції, може бути кілька об'єктів ActionCall, кожен з яких може вказувати відповідну назву методу контракту та параметри методу тощо.
Sputnik-DAO використовує форму Promise Batch Actions для виконання пропозицій типу виконання функцій смартконтрактів.
) 3.2 Пропозиція про переміщення коштів за смартконтрактом###ProposalKind::Transfer(
Коли проект смартконтрактів NEAR працює протягом певного часу, обліковий запис контракту сам по собі може накопичити значну кількість Fungible Token), включаючи рідний токен NEAR або інші токени, що відповідають стандарту NEP-141(.
У цей час члени спільноти Sputnik-DAO можуть об'єднати ці токени на зазначений рахунок receiver_id, подавши пропозицію про переміщення коштів контракту. internal_execute_proposal)( також реалізував відповідний вхід для обробки пропозицій з ProposalKind, які є Transfer.
Ця обробка гілки в основі викликатиме функцію internal_payout)(, щоб реалізувати операції з переказу для різних типів Fungible Token та різних типів receiver_id)EOA або контрактних рахунків(.
Ця стаття описує основні концепції контракту Sputnik DAO — пропозицію )Proposal(, а також коротко пояснює, як створювати нові пропозиції в Sputnik DAO та голосувати за їх виконання, а також правила зміни основного статусу пропозицій )Status(.
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
Детальний аналіз механізму пропозицій Sputnik DAO: від ініціації до виконання.
Rust смартконтракти养成日记(11): Аналіз механізму пропозицій DAO Sputnik
Sputnik-DAO як інфраструктура NEAR Protocol, сприяє розвитку екосистеми NEAR у децентралізованому напрямку. Наразі ця платформа вже сприяла створенню численних автономних спільнот NEAR, а також надає повний, гнучкий та ефективний розв'язок для управління рішеннями спільноти.
Sputnikdaov2 є смартконтрактом для голосування з управління спільнотою Sputnik-DAO. У цій статті буде представлено основні концепції цього контракту: пропозиція (Proposal) та навколо пропозиції буде розглянуто пов'язані моделі управління спільнотою DAO (Policy).
1. Ініціювання пропозиції
Кожен учасник спільноти Sputnik-DAO може висловлювати свою думку або подавати пропозиції щодо управління або адміністрування проекту. Потім кожен учасник спільноти, який має акції в DAO, може розглядати й голосувати за цю пропозицію. Іншими словами, кожен учасник Sputnik-DAO може впливати на майбутній напрямок проекту, голосуючи за пропозиції інших або ініціюючи нові управлінські пропозиції.
З точки зору контракту, члени спільноти DAO можуть викликати метод add_proposal() смартконтракту sputnikdaov2 для ініціювання нової пропозиції.
У цей час пропонент має надати детальну інформацію про цю пропозицію (ProposalInput):
Текстовий опис пропозиції (Description). Ця інформація буде відкрито показана на фронтенді головної сторінки Sputnik-DAO, щоб допомогти членам спільноти зрозуміти мету та значення цієї пропозиції.
Тип пропозиції ( kind ). Пропонент повинен відповідно обрати тип пропозиції в залежності від висловлених думок щодо управління проектом (, наприклад, для виклику ключових привілейованих функцій контракту потрібно вибрати тип FunctionCall, для передачі коштів проекту контракту потрібно вибрати тип Transfer тощо ).
Ця інформація ProposalInput буде передана як параметри до методу add_proposal(), який виконає відповідну перевірку та обробку, а також створить пропозицію з повною інформацією про ініціалізацію (Proposal). В результаті ця пропозиція буде прив'язана до унікального proposal_id і буде додана до загального збереженого в Contract.proposals мапи Sputnik-DAO за формою <key, value=""> в пул пропозицій (.
Слід зазначити, що в Sputnik-DAO існує концепція депозиту за пропозицію )proposal_bond(, який буде управлятися відповідно до конкретної моделі управління спільнотою Sputnik-DAO )Policy(. Контракт вимагає, щоб пропоненти при виклику методу add_proposal)( внесли певну кількість токенів NEAR в якості забезпечення нової пропозиції. Цей депозит буде повернутий пропонентові через виклик внутрішньої функції контракту internal_return_bonds)(, коли пропозиція закінчиться нормально ) з голосуванням громади за чи проти (.
! [])https://img-cdn.gateio.im/webp-social/moments-84ee9ca630a4cdcdb0d2eb63450a7cf4.webp(
2. Стан пропозиції
Будь-яка стандартна пропозиція в Sputnik-DAO може проходити через кілька станів ) новий стан пропозиції ініціюється як InProgress (:
Зміна статусу пропозицій у пулі пропозицій керується методом контракту act_proposal)(. Члени Sputnik-DAO можуть викликати метод act_proposal)( для виконання операцій щодо конкретної пропозиції ), вказуючи її id (.
Для пропозицій у стані InProgress, члени спільноти DAO можуть викликати act_proposal)( для виконання конкретних голосувань:
Згідно з реалізацією, після внутрішнього виклику функції update_votes)( програма активує виклик policy.proposal_status)( для проведення голосування. Для пропозицій, які відповідають порогу голосування, статус пропозиції буде відповідно змінено.
Зміни після:
Слід зазначити, що різниця між станами Rejected та Removed полягає в тому, що пропозиції, які були визнані в стані Removed, будуть безпосередньо видалені з пулу пропозицій, і застава, що була внесена спочатку, не буде повернена пропоненту. У той же час пропозиції в стані Rejected залишаться в пулі пропозицій і застава буде повернена.
! [])https://img-cdn.gateio.im/webp-social/moments-427716593b21fa32b47855ceb5e101fc.webp(
3. Виконання пропозицій
Якщо певна пропозиція після закінчення голосування має статус Approved, у цей час метод контракту act_proposal)( внутрішньо продовжить викликати функцію internal_execute_proposal)( для виконання рішень, що містяться в пропозиції.
Sputnik-DAO підтримує такі типи пропозицій: ChangeConfig, ChangePolicy, AddMemberToRole, RemoveMemberFromRole, FunctionCall, UpgradeSelf, UpgradeRemote, Transfer, SetStakingContract, AddBounty, BountyDone, Vote, FactoryInfoUpdate, ChangePolicyAddOrUpdateRole, ChangePolicyRemoveRole, ChangePolicyUpdateDefaultVotePolicy, ChangePolicyUpdateParameters тощо.
Далі коротко представлені два типи обробки пропозицій:
) 3.1 Виконання функції контракту пропозиції ### ProposalKind::FunctionCall (
Пропозиції типу FunctionCall передаються через параметр ProposalInput, коли ініціатор пропозиції викликає метод add_proposal)(, де конкретно передаються функціональні дії, що мають бути виконані )actions(. Контракт NEAR дозволяє прив'язувати кілька послідовних function_call в одному Promise. Таким чином, всередині дій, визначених ініціатором пропозиції, може бути кілька об'єктів ActionCall, кожен з яких може вказувати відповідну назву методу контракту та параметри методу тощо.
Sputnik-DAO використовує форму Promise Batch Actions для виконання пропозицій типу виконання функцій смартконтрактів.
) 3.2 Пропозиція про переміщення коштів за смартконтрактом###ProposalKind::Transfer(
Коли проект смартконтрактів NEAR працює протягом певного часу, обліковий запис контракту сам по собі може накопичити значну кількість Fungible Token), включаючи рідний токен NEAR або інші токени, що відповідають стандарту NEP-141(.
У цей час члени спільноти Sputnik-DAO можуть об'єднати ці токени на зазначений рахунок receiver_id, подавши пропозицію про переміщення коштів контракту. internal_execute_proposal)( також реалізував відповідний вхід для обробки пропозицій з ProposalKind, які є Transfer.
Ця обробка гілки в основі викликатиме функцію internal_payout)(, щоб реалізувати операції з переказу для різних типів Fungible Token та різних типів receiver_id)EOA або контрактних рахунків(.
! [])https://img-cdn.gateio.im/webp-social/moments-ef0b959c42e1f5fc6263cd4a86fd078e.webp(
4. Підсумок
Ця стаття описує основні концепції контракту Sputnik DAO — пропозицію )Proposal(, а також коротко пояснює, як створювати нові пропозиції в Sputnik DAO та голосувати за їх виконання, а також правила зміни основного статусу пропозицій )Status(.
! [])https://img-cdn.gateio.im/webp-social/moments-eb73d5e15f6161f0a4b442cd4b99a91e.webp(</key,>