Análise do contrato da fábrica SputnikDAO: Criação e gestão em massa de DAOs na cadeia Near

robot
Geração de resumo em curso

Diário de desenvolvimento de contratos inteligentes Rust (10-2): Análise do código do contrato da fábrica SputnikDAO

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

1. Contrato de Fábrica Sputnik-DAO

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

2. Introdução às funcionalidades do módulo DAPP

Na página DAPP da plataforma Sputnik DAO, é visível que já existem várias DAOs que criaram instâncias nesta plataforma. Até março de 2022, a DAO mais ativa é a news.sputnik-dao.near, que já tem 3051 propostas em votação pública ou já concluídas.

Todos os contratos de instância de DAO criados na plataforma Sputnik DAO são implantados sob a subconta da conta sputnik-dao.near, como:

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

As organizações podem chamar 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\u003caccountid\u003e, }

  • factory_manager: fornece métodos para criar/remover/atualizar instâncias DAO
  • daos: regista todos os endereços de conta NEAR dos DAO criados

A definição do método create() para criar uma instância de DAO é a seguinte:

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, 'new', &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], ) { // 1. Carregar o código do modelo de contrato // 2. Construir uma Promise // 3. Criar conta de implantação // 4. Transferir NEAR // 5. Implantar contratos inteligentes // 6. Chamar a função de inicialização new() // 7. callback on_create() }

Lógica de tratamento da função de callback on_create:

  • Se a execução dos passos 3-6 falhar, devolva NEAR
  • Se a execução for bem-sucedida, registe o novo endereço da conta da instância DAO

3.2 atualização DAO

O contrato da fábrica fornece a interface update() para atualizar a DAO:

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(\u0026account_id), 'Deve ser um contrato criado pela fábrica' ); self.factory_manager .atualizar_contrato(id_conta, hash_codigo, 'atualizar'); }

4. Análise de segurança do contrato Sputnik-DAO Factory

  • Controle de permissões: métodos do tipo view não modificam variáveis de estado
  • Controle de permissões: funções privilegiadas só podem ser executadas pelo owner do contrato ou contas DAO
  • Tratamento de erros: implementar um mecanismo de tratamento de erros razoável para situações excepcionais

Ver original
Esta página pode conter conteúdos de terceiros, que são fornecidos apenas para fins informativos (sem representações/garantias) e não devem ser considerados como uma aprovação dos seus pontos de vista pela Gate, nem como aconselhamento financeiro ou profissional. Consulte a Declaração de exoneração de responsabilidade para obter mais informações.
  • Recompensa
  • 5
  • Partilhar
Comentar
0/400
ChainSpyvip
· 10h atrás
O padrão de fábrica merece ser estudado
Ver originalResponder0
AirdropSweaterFanvip
· 10h atrás
Novato novato必看教程
Ver originalResponder0
SandwichVictimvip
· 10h atrás
O padrão de fábrica é realmente bom
Ver originalResponder0
RuntimeErrorvip
· 10h atrás
O padrão de fábrica é muito clássico.
Ver originalResponder0
Web3ExplorerLinvip
· 10h atrás
Interesse DAOfactory design
Ver originalResponder0
  • Pino
Negocie cripto em qualquer lugar e a qualquer hora
qrCode
Digitalizar para transferir a aplicação Gate
Novidades
Português (Portugal)
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)