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ú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.
20 Curtidas
Recompensa
20
8
Compartilhar
Comentário
0/400
SchrodingerGas
· 1h atrás
gás收益线性回归又shorting去了
Ver originalResponder0
HappyMinerUncle
· 22h atrás
Quem me ensina a escrever código rust
Ver originalResponder0
RektButAlive
· 08-05 05:37
Estava a pensar quem teria tanto tempo livre para descompilar o código-fonte.
Ver originalResponder0
LayerHopper
· 08-05 04:06
Este código é um pouco obscuro.
Ver originalResponder0
BearMarketMonk
· 08-03 19:38
Tem um pouco de bull, aprendendo Rust e fazendo contratos.
Ver originalResponder0
AirdropChaser
· 08-03 19:28
Mais uma análise de código, estou tonto.
Ver originalResponder0
ProbablyNothing
· 08-03 19:24
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.