Profundidade da análise do contrato de fábrica da plataforma Sputnik DAO: implementação de design e mecanismos de segurança

robot
Geração do resumo em andamento

Diário de Desenvolvimento de Contratos Inteligentes Rust (10-2): Análise do Contrato da Fábrica Sputnik DAO

Este artigo irá analisar detalhadamente a implementação do modelo de fábrica da plataforma Sputnik DAO (sputnikdao-factory).

1. Contrato de fábrica Sputnik-DAO

Sputnik-DAO adotou o padrão de design de fábrica criativa para implementar a criação e gestão unificada da organização autônoma descentralizada (DAO) na plataforma.

O repositório de código-fonte correspondente ao contrato está localizado em:

2. Introdução às funções do módulo DAPP

A página DAPP da plataforma Sputnik DAO exibe a instância de objeto DAO criada ( contrato Sputnikdaov2 ). Até março de 2022, o DAO mais ativo na plataforma era news.sputnik-dao.near, com 3051 propostas em votação ou já concluídas.

Todos os contratos de instância de DAO criados na plataforma Sputnik DAO são implantados uniformemente sob suas subcontas pela conta sputnik-dao.near ( contrato sputnikdao-factory ), por exemplo:

  • pcp.sputnik-dao.near
  • test-dao-bro.sputnik-dao.near
  • blaqkstereo.sputnik-dao.near

As organizações podem chamar publicamente o método create() do contrato sputnikdao-factory na mainnet NEAR para criar novas instâncias de DAO.

3. Interpretação do código do contrato sputnikdao-factory

3.1 Criar DAO

O estado do contrato sputnikdao-factory é composto principalmente por duas partes:

ferrugem pub struct SputnikDAOFactory { factory_manager: FactoryManager, daos: UnorderedSet, }

  • factory_manager: fornece métodos para criar/excluir/atualizar instâncias de DAO
  • daos: registar o endereço da conta NEAR que criou a instância DAO

create() definição de método:

ferrugem #[payable] pub fn create(&mut self, name: AccountId, args: Base64VecU8) { let account_id: AccountId = format!('{}.{}', name, env::current_account_id()) .parse() .unwrap(); let callback_args = serde_json::to_vec(&json!({ 'account_id': account_id, 'attached_deposit': U128(env::attached_deposit()), 'predecessor_account_id': env::predecessor_account_id() })) .expect('Falha ao serializar'); self.factory_manager.create_contract( self.get_default_code_hash(), account_id, 'novo', &args.0, 'on_create', &callback_args, ); }

implementação específica de factory_manager.create_contract:

ferrugem pub fn create_contract( &self, code_hash: Base58CryptoHash, account_id: AccountId, new_method: &str, args: &[u8], callback_method: &str, callback_args: &[u8], ) { // Carregar código do contrato // Criar Promise // Criar conta // Transferência // Implantar contrato // Chamada da função de inicialização // Definir callback }

função de callback on_create:

ferrugem #[private] pub fn on_create( &mut self, account_id: AccountId, attached_deposit: U128, predecessor_account_id: AccountId, bool { se near_sdk::is_promise_success)( { self.daos.insert)&account_id(; verdadeiro } else { Promise::new)predecessor_account_id(.transfer)attached_deposit.0(; falso } }

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

) 3.2 Atualização DAO

update###( método:

ferrugem pub fn update)&self, account_id: AccountId, code_hash: Base58CryptoHash( { let caller_id = env::predecessor_account_id)(; assert!) caller_id == self.get_owner(( || caller_id == account_id, 'Deve ser atualizado pelo proprietário da fábrica ou pelo próprio DAO' ); assert!) self.daos.contains(&account_id(, 'Deve ser um contrato criado pela fábrica' ); self.factory_manager .atualizar_contrato)id_conta, hash_codigo, 'atualizar'(; }

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

4. Análise de segurança do contrato da fábrica Sputnik-DAO

Garantir a segurança principalmente a partir dos seguintes aspectos:

  • Controle de permissões: o método view não modifica variáveis de estado
  • A função de privilégio só pode ser executada pelo owner
  • Mecanismo de tratamento de erros razoável

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

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

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

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

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

Ver original
Esta página pode conter conteúdo de terceiros, que é fornecido apenas para fins informativos (não para representações/garantias) e não deve ser considerada como um endosso de suas opiniões pela Gate nem como aconselhamento financeiro ou profissional. Consulte a Isenção de responsabilidade para obter detalhes.
  • Recompensa
  • 7
  • Compartilhar
Comentário
0/400
AltcoinOraclevip
· 22h atrás
degens a dormir no sputnik... o modelo de fábrica deles é literalmente governança web3 2.0
Ver originalResponder0
not_your_keysvip
· 22h atrás
Este design é bastante hardcore, uau
Ver originalResponder0
ImpermanentPhilosophervip
· 22h atrás
Desenvolvimento modular sem pensar, amei
Ver originalResponder0
PensionDestroyervip
· 23h atrás
O contrato de fábrica parece confiável.
Ver originalResponder0
ImaginaryWhalevip
· 23h atrás
Este contrato tem algo de especial.
Ver originalResponder0
InfraVibesvip
· 23h atrás
Produção nacional também consegue fazer esta armadilha.
Ver originalResponder0
BanklessAtHeartvip
· 23h atrás
A segurança dos contratos de fábrica é realmente crucial.
Ver originalResponder0
  • Marcar
Faça trade de criptomoedas em qualquer lugar e a qualquer hora
qrCode
Escaneie o código para baixar o app da Gate
Comunidade
Português (Brasil)
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)