Guia de atualização de contratos inteligentes Rust: Atualizações de segurança e migração de dados para contratos NEAR

Guia de atualização de contratos inteligentes Rust

Os contratos inteligentes, como uma forma de programa, inevitavelmente apresentam falhas. Mesmo após extensos testes e auditorias, ainda podem existir vulnerabilidades. Se exploradas por atacantes, isso pode resultar na perda de ativos dos usuários, com consequências graves. A correção de vulnerabilidades geralmente requer a atualização do contrato. Além disso, a adição de novas funcionalidades também necessita da atualização do contrato. Portanto, a capacidade de atualização do contrato é extremamente necessária. Este artigo apresentará os métodos de atualização dos contratos Rust.

Método de atualização de contratos NEAR

Usando o projeto StatusMessage como exemplo, apresentamos os métodos comuns de atualização de contratos NEAR.

1. A estrutura de dados do contrato não foi modificada

Se apenas modificar a lógica do contrato, sem alterar a estrutura de dados, pode usar diretamente o comando near deploy para reimplantar o novo código. Por exemplo, adicionar uma nova função:

ferrugem #[near_bindgen] impl StatusMessage { Option { let account_id = env::signer_account_id(); self.records.insert(\u0026account_id, \u0026message); return self.records.get(&account_id); } }

Após a reimplementação, os dados do contrato original ainda podem ser lidos com sucesso.

( 2. A estrutura de dados do contrato foi modificada

Se a estrutura de dados original for modificada, por exemplo:

ferrugem #[near_bindgen] #[derive)BorshDeserialize, BorshSerialize###] pub struct StatusMessage { taglines: LookupMap<string, string="">, bios: LookupMap<string, string="">, }

A reimplantação direta resultará em um erro ao desserializar o estado do contrato.

( 3. Usar o método Migrate para atualizar

A NEAR fornece o método Migrate para ajudar na atualização de contratos. Adicione o método migrate no novo contrato:

ferrugem #) #[init###ignore_state[private]] Self { let old_state: OldStatusMessage = env::state_read().expect('falhou'); 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

Desta forma, é possível atualizar o contrato com sucesso e migrar os dados antigos.

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

Considerações de segurança na atualização de contratos

  1. Controle de permissões: a função de atualização deve ser uma função only owner, garantindo que só possa ser chamada pelo owner.

  2. Recomenda-se definir o proprietário do contrato como DAO, gerido em conjunto através de propostas e votos.

  3. Adicione #[init)ignore_state)] antes da função de migração, para garantir que o estado não seja carregado antes da execução.

  4. Após a migração, remova a função de migração, garantindo que seja chamada apenas uma vez.

  5. A nova estrutura de dados é inicializada durante a migração.

Seguindo os princípios acima, é possível atualizar e manter contratos inteligentes com segurança.

</string,></string,>

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
  • Republicar
  • Partilhar
Comentar
0/400
GweiWatchervip
· 23h atrás
O jogador do contrato gritou: Sobe ou não, depende de você!
Ver originalResponder0
ContractHuntervip
· 23h atrás
Ah ah ah, estou novamente a cair num buraco familiar de atualização do rust.
Ver originalResponder0
NFTRegrettervip
· 23h atrás
Caramba, mais uma atualização, que irritante!
Ver originalResponder0
TokenVelocityvip
· 23h atrás
Com tantas vulnerabilidades, quem se atreve a tocar?
Ver originalResponder0
DuskSurfervip
· 23h atrás
Vulnerabilidades de contratos aparecem todos os dias, realmente deixa as pessoas irritadas.
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)