Prática de atualização de contratos inteligentes Rust
Os contratos inteligentes são essencialmente programas, e inevitavelmente existem falhas. Mesmo após muitos testes e auditorias, ainda podem existir vulnerabilidades. As vulnerabilidades dos contratos podem ser atacadas, resultando em perdas de ativos para os usuários, com consequências graves. A correção de vulnerabilidades e a adição de novas funcionalidades exigem a atualização dos contratos. Portanto, a atualizabilidade dos contratos é extremamente necessária. Este artigo apresentará as maneiras de atualizar contratos em Rust.
Método de atualização de contratos inteligentes NEAR
Usando o projeto StatusMessage como exemplo, apresentamos os métodos comuns de atualização de contratos NEAR.
1. Estrutura de dados do contrato não modificada
Se apenas modificar a lógica do contrato, sem envolver alterações na estrutura de dados, pode usar diretamente o near deploy para reimplantar o novo código. Os dados no contrato original podem ser lidos normalmente.
2. A estrutura de dados do contrato foi modificada
Se a estrutura de dados do contrato for modificada, a reimplementação direta resultará em incompatibilidade entre a nova e a antiga estrutura de dados, impossibilitando a leitura dos dados originais.
3. Usar Migrate para atualizar contratos inteligentes
NEAR fornece o método Migrate para ajudar na atualização de contratos. Adicione o método migrate no novo contrato:
Considerações de segurança na atualização de contratos
A função de atualização deve ser uma função only owner, garantindo que só possa ser chamada pelo owner.
Recomenda-se definir o proprietário do contrato como DAO, gerindo-o em conjunto através de propostas e votações.
Adicione #[init(ignore_state)] antes da função de migração
Após a migração, eliminar a função de migração
A nova estrutura de dados é inicializada durante a migração
A atualização de contratos é um meio importante para garantir a segurança dos contratos, os desenvolvedores precisam tratar isso com cautela, assegurando a segurança do processo de atualização.
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.
Guia completo para a atualização de contratos inteligentes Rust: das considerações de segurança NEAR
Prática de atualização de contratos inteligentes Rust
Os contratos inteligentes são essencialmente programas, e inevitavelmente existem falhas. Mesmo após muitos testes e auditorias, ainda podem existir vulnerabilidades. As vulnerabilidades dos contratos podem ser atacadas, resultando em perdas de ativos para os usuários, com consequências graves. A correção de vulnerabilidades e a adição de novas funcionalidades exigem a atualização dos contratos. Portanto, a atualizabilidade dos contratos é extremamente necessária. Este artigo apresentará as maneiras de atualizar contratos em Rust.
Método de atualização de contratos inteligentes NEAR
Usando o projeto StatusMessage como exemplo, apresentamos os métodos comuns de atualização de contratos NEAR.
1. Estrutura de dados do contrato não modificada
Se apenas modificar a lógica do contrato, sem envolver alterações na estrutura de dados, pode usar diretamente o near deploy para reimplantar o novo código. Os dados no contrato original podem ser lidos normalmente.
2. A estrutura de dados do contrato foi modificada
Se a estrutura de dados do contrato for modificada, a reimplementação direta resultará em incompatibilidade entre a nova e a antiga estrutura de dados, impossibilitando a leitura dos dados originais.
3. Usar Migrate para atualizar contratos inteligentes
NEAR fornece o método Migrate para ajudar na atualização de contratos. Adicione o método 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)((, } }
Chame o método migrate ao reimplantar:
perto de implantar
--wasmFile target/wasm32-unknown-unknown/release/status_message.wasm
--initFunction 'migrate'
--initArgs '{}'
--accountId statusmessage.blocksec_upgrade.testnet
Desta forma, é possível migrar com sucesso os dados do contrato antigo para o novo contrato.
![])https://img-cdn.gateio.im/webp-social/moments-73f5e5195fa71f1f25f5d35ba1e8b8ec.webp)
Considerações de segurança na atualização de contratos
A função de atualização deve ser uma função only owner, garantindo que só possa ser chamada pelo owner.
Recomenda-se definir o proprietário do contrato como DAO, gerindo-o em conjunto através de propostas e votações.
Adicione #[init(ignore_state)] antes da função de migração
Após a migração, eliminar a função de migração
A nova estrutura de dados é inicializada durante a migração
A atualização de contratos é um meio importante para garantir a segurança dos contratos, os desenvolvedores precisam tratar isso com cautela, assegurando a segurança do processo de atualização.