Diário de Desenvolvimento de Contratos Inteligentes Rust (10-2): Análise do Contrato da Fábrica Sputnik DAO
Este artigo irá analisar em profundidade a implementação do código do contrato de fábrica da plataforma Sputnik DAO. O Sputnik DAO utiliza o padrão de design de fábrica de criação para implementar a criação e gestão unificada da organização autónoma descentralizada (DAO).
1. Contratos inteligentes da fábrica Sputnik-DAO
O estado principal do contrato da fábrica Sputnik-DAO é composto por duas partes:
factory_manager: fornece lógica de função interna para criar/excluir/atualizar instâncias de DAO
daos: regista o endereço da conta NEAR de todas as instâncias DAO criadas nesta plataforma
2. Criar DAO
Os contratos inteligentes de fábrica oferecem o método create() para criar novas instâncias de DAO:
ferrugem
#[payable]
pub fn create(&mut self, name: AccountId, args: Base64VecU8) {
// Construir conta de implantação de contratos inteligentes DAO
let account_id: AccountId = format!("{}.{}", name, env::current_account_id())
.parse()
.unwrap();
// Construir parâmetros de callback
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");
// Chamar factory_manager para criar contratos inteligentes
self.factory_manager.create_contract(
self.get_default_code_hash(),
account_id,
"novo",
&args.0,
"on_create",
&callback_args,
);
}
Os principais passos do método create_contract() incluem:
Carregar o código do modelo de contrato DAO
Criar conta de implantação
Transferência de fundos iniciais
Implantar o código do contrato
Chamar a função de inicialização do contrato
Chamada de função on_create()
3. Atualizar DAO
O contrato da fábrica fornece o método update() para atualizar o contrato 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(&account_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
A segurança do contrato da fábrica Sputnik-DAO é garantida principalmente pelos seguintes aspectos:
Controle de permissões: o método view não modifica o estado, funções privilegiadas só podem ser chamadas pelo owner
Tratamento de erros: implementar um mecanismo de tratamento de erros razoável para situações excepcionais.
Verificação de asserção: adicionar verificações de asserção necessárias nas operações chave
O contrato da fábrica tinha uma grave vulnerabilidade de segurança, que poderia permitir a qualquer usuário atualizar o contrato DAO. Esta vulnerabilidade foi corrigida através da adição de um mecanismo razoável de verificação de lista branca.
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.
15 gostos
Recompensa
15
4
Partilhar
Comentar
0/400
BearMarketMonk
· 2h atrás
Tem um pouco de bull, aprendendo Rust e fazendo contratos.
Ver originalResponder0
AirdropChaser
· 2h atrás
Mais uma análise de código, estou tonto.
Ver originalResponder0
ProbablyNothing
· 2h atrás
Estou completamente confuso com o código do contrato. O que está escrito aqui?
Análise do código do contrato da fábrica Sputnik DAO: lógica central para criar e atualizar DAO
Diário de Desenvolvimento de Contratos Inteligentes Rust (10-2): Análise do Contrato da Fábrica Sputnik DAO
Este artigo irá analisar em profundidade a implementação do código do contrato de fábrica da plataforma Sputnik DAO. O Sputnik DAO utiliza o padrão de design de fábrica de criação para implementar a criação e gestão unificada da organização autónoma descentralizada (DAO).
1. Contratos inteligentes da fábrica Sputnik-DAO
O estado principal do contrato da fábrica Sputnik-DAO é composto por duas partes:
ferrugem pub struct SputnikDAOFactory { factory_manager: FactoryManager, daos: UnorderedSet\u003caccountid\u003e, }
2. Criar DAO
Os contratos inteligentes de fábrica oferecem o método create() para criar novas instâncias de DAO:
ferrugem #[payable] pub fn create(&mut self, name: AccountId, args: Base64VecU8) { // Construir conta de implantação de contratos inteligentes DAO let account_id: AccountId = format!("{}.{}", name, env::current_account_id()) .parse() .unwrap();
}
Os principais passos do método create_contract() incluem:
3. Atualizar DAO
O contrato da fábrica fornece o método update() para atualizar o contrato 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(&account_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
A segurança do contrato da fábrica Sputnik-DAO é garantida principalmente pelos seguintes aspectos:
O contrato da fábrica tinha uma grave vulnerabilidade de segurança, que poderia permitir a qualquer usuário atualizar o contrato DAO. Esta vulnerabilidade foi corrigida através da adição de um mecanismo razoável de verificação de lista branca.