Diário de Desenvolvimento de Contratos Inteligentes Rust (9): Segurança de Contratos na Atualização de Contratos
Os contratos inteligentes, como uma forma de código de programa, inevitavelmente podem apresentar falhas e vulnerabilidades. Mesmo contratos que foram amplamente testados e auditados podem ter problemas não detectados. Uma vez que esses problemas potenciais sejam explorados, podem causar sérias consequências, como a perda de ativos dos usuários. Portanto, a capacidade de atualização dos contratos é extremamente importante para corrigir vulnerabilidades e adicionar novas funcionalidades. Este artigo irá apresentar os métodos de atualização de contratos Rust na plataforma NEAR.
1. A necessidade de atualização dos contratos
Os contratos inteligentes são essencialmente código de programa e, inevitavelmente, podem conter falhas. Mesmo após extensos testes e auditorias, ainda podem existir vulnerabilidades. Se essas vulnerabilidades forem exploradas por atacantes, podem causar sérias consequências, como a perda de ativos dos usuários. A correção de falhas geralmente requer uma atualização do contrato. Além disso, a adição de novas funcionalidades também exige a atualização do contrato. Portanto, a capacidade de atualização do contrato é extremamente necessária.
2. Formas comuns de atualização de contratos Ethereum
Os contratos inteligentes na Ethereum têm imutabilidade, uma vez implantados não podem ser modificados. Para resolver esse problema, normalmente se utiliza a abordagem de contratos proxy (Proxy Contract):
Os contratos de delegação são usados para armazenar dados e chamar contratos lógicos usando deleGatecall.
contratos inteligentes contêm lógica de negócios específica
Durante a atualização, basta implementar um novo contrato lógico e atualizar o contrato de proxy para que aponte.
Dessa forma, os dados originais podem ser mantidos, atualizando apenas a parte lógica.
3. Método de atualização dos contratos inteligentes NEAR
Segue-se um exemplo do projeto StatusMessage para apresentar o método de atualização de contratos NEAR:
3.1 A estrutura de dados do contrato não foi modificada
Se apenas modificar a lógica do contrato, sem envolver alterações na estrutura de dados, pode usar diretamente o comando near deploy para reimplantar o novo código. Os dados originais serão mantidos.
3.2 A estrutura de dados do contrato foi modificada
Se a estrutura de dados do contrato for alterada, a reimplementação direta resultará em uma incompatibilidade entre as estruturas de dados antiga e nova, impossibilitando a leitura normal dos dados existentes.
3.3 Usar o método Migrate para atualizar
A NEAR oferece o método Migrate para atualização de contratos. Adicione a função migrate no novo contrato:
Dessa forma, a migração de dados pode ser concluída, mesmo que a estrutura de dados dos contratos antigos e novos seja inconsistente, a atualização pode ocorrer normalmente.
4. Considerações de segurança sobre a atualização de contratos
A atualização do contrato precisa considerar os seguintes fatores de segurança:
Controle rigoroso das permissões de atualização, permitindo apenas que desenvolvedores ou DAO realizem atualizações.
Recomenda-se definir o proprietário do contrato como DAO, gerindo através de propostas e votações.
Adicione #[init)ignore_state)] antes da função migrate
Após a migração, remova a função migrate, garantindo que seja chamada apenas uma vez
Nova estrutura de dados concluída a inicialização durante a migração
Com essas medidas, é possível garantir a segurança da atualização dos contratos, reduzindo os riscos durante o processo de atualização.
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
10 gostos
Recompensa
10
5
Partilhar
Comentar
0/400
liquiditea_sipper
· 20h atrás
Parece tão forte, mas ainda tenho medo de tentar.
Ver originalResponder0
NeverVoteOnDAO
· 20h atrás
A atualização é confiável? Sempre sinto que não fica limpo.
Ver originalResponder0
BrokenDAO
· 20h atrás
Permissão é igual a uma porta dos fundos, como podemos falar de segurança?
Ver originalResponder0
LayerZeroHero
· 20h atrás
Uma vez que a atualização esteja concluída, não há deus que possa controlar.
Dicas de atualização de contratos inteligentes Rust: melhores práticas de Ethereum para NEAR
Diário de Desenvolvimento de Contratos Inteligentes Rust (9): Segurança de Contratos na Atualização de Contratos
Os contratos inteligentes, como uma forma de código de programa, inevitavelmente podem apresentar falhas e vulnerabilidades. Mesmo contratos que foram amplamente testados e auditados podem ter problemas não detectados. Uma vez que esses problemas potenciais sejam explorados, podem causar sérias consequências, como a perda de ativos dos usuários. Portanto, a capacidade de atualização dos contratos é extremamente importante para corrigir vulnerabilidades e adicionar novas funcionalidades. Este artigo irá apresentar os métodos de atualização de contratos Rust na plataforma NEAR.
1. A necessidade de atualização dos contratos
Os contratos inteligentes são essencialmente código de programa e, inevitavelmente, podem conter falhas. Mesmo após extensos testes e auditorias, ainda podem existir vulnerabilidades. Se essas vulnerabilidades forem exploradas por atacantes, podem causar sérias consequências, como a perda de ativos dos usuários. A correção de falhas geralmente requer uma atualização do contrato. Além disso, a adição de novas funcionalidades também exige a atualização do contrato. Portanto, a capacidade de atualização do contrato é extremamente necessária.
2. Formas comuns de atualização de contratos Ethereum
Os contratos inteligentes na Ethereum têm imutabilidade, uma vez implantados não podem ser modificados. Para resolver esse problema, normalmente se utiliza a abordagem de contratos proxy (Proxy Contract):
Dessa forma, os dados originais podem ser mantidos, atualizando apenas a parte lógica.
3. Método de atualização dos contratos inteligentes NEAR
Segue-se um exemplo do projeto StatusMessage para apresentar o método de atualização de contratos NEAR:
3.1 A estrutura de dados do contrato não foi modificada
Se apenas modificar a lógica do contrato, sem envolver alterações na estrutura de dados, pode usar diretamente o comando near deploy para reimplantar o novo código. Os dados originais serão mantidos.
3.2 A estrutura de dados do contrato foi modificada
Se a estrutura de dados do contrato for alterada, a reimplementação direta resultará em uma incompatibilidade entre as estruturas de dados antiga e nova, impossibilitando a leitura normal dos dados existentes.
3.3 Usar o método Migrate para atualizar
A NEAR oferece o método Migrate para atualização de contratos. Adicione a função migrate no novo contrato:
ferrugem #[private] #[init(ignore_state)] Self { let old_state: OldStatusMessage = env::state_read().expect("failed"); Self { taglines: old_state.records, bios: LookupMap::new(b"b".to_vec)((, } }
Chamar o método migrate durante a implantação:
perto de implantar
--wasmFile target/wasm32-unknown-unknown/release/status_message.wasm
--initFunction "migrate"
--initArgs "{}"
--accountId statusmessage.blocksec_upgrade.testnet
Dessa forma, a migração de dados pode ser concluída, mesmo que a estrutura de dados dos contratos antigos e novos seja inconsistente, a atualização pode ocorrer normalmente.
4. Considerações de segurança sobre a atualização de contratos
A atualização do contrato precisa considerar os seguintes fatores de segurança:
Com essas medidas, é possível garantir a segurança da atualização dos contratos, reduzindo os riscos durante o processo de atualização.