Guia de Atualização de Contratos Inteligentes em Rust
Os contratos inteligentes, como um tipo de programa, inevitavelmente terão defeitos e vulnerabilidades. Mesmo após muitos testes e auditorias, ainda podem existir problemas não descobertos. Uma vez que uma vulnerabilidade do contrato seja explorada por atacantes, pode resultar em perdas de ativos dos usuários, com consequências graves. Portanto, a capacidade de atualização do contrato é crucial, podendo ser utilizada tanto para corrigir vulnerabilidades quanto para adicionar novas funcionalidades. Este artigo apresentará os métodos de atualização de contratos Rust na plataforma NEAR.
Método de atualização do contrato NEAR
Usando o projeto StatusMessage como exemplo, apresentamos os métodos comuns de atualização dos contratos NEAR.
1. 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. Por exemplo, vamos adicionar uma nova função ao contrato original:
Depois de compilar, use near deploy para reimplantar. Os dados no contrato original ainda podem ser lidos normalmente.
( 2. A estrutura de dados do contrato foi modificada
Se a estrutura de dados do contrato for modificada, a reimplantação direta resultará em falha na desserialização do estado. Por exemplo, modificamos a estrutura do contrato da seguinte forma:
Considerações de segurança sobre a atualização de contratos
Controle de permissões: a função de atualização deve ser definida como função only owner, garantindo que só possa ser chamada pelo owner.
Recomenda-se definir o owner do contrato como DAO, gerindo o contrato através de propostas e votações.
Adicione #[init)ignore_state)] antes da função de migração, garantindo que o estado não seja carregado antes da execução.
Após a migração ser concluída, exclua a função de migração, garantindo que seja chamada apenas uma vez.
A nova estrutura de dados é inicializada durante a migração.
A atualização de contratos é um processo complexo que deve ser tratado com cautela. Com um design razoável e testes rigorosos, é possível realizar uma atualização de contratos segura e confiável.
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.
Guia de atualização de contratos inteligentes Rust: Detalhes sobre o método de atualização de segurança da plataforma NEAR
Guia de Atualização de Contratos Inteligentes em Rust
Os contratos inteligentes, como um tipo de programa, inevitavelmente terão defeitos e vulnerabilidades. Mesmo após muitos testes e auditorias, ainda podem existir problemas não descobertos. Uma vez que uma vulnerabilidade do contrato seja explorada por atacantes, pode resultar em perdas de ativos dos usuários, com consequências graves. Portanto, a capacidade de atualização do contrato é crucial, podendo ser utilizada tanto para corrigir vulnerabilidades quanto para adicionar novas funcionalidades. Este artigo apresentará os métodos de atualização de contratos Rust na plataforma NEAR.
Método de atualização do contrato NEAR
Usando o projeto StatusMessage como exemplo, apresentamos os métodos comuns de atualização dos contratos NEAR.
1. 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. Por exemplo, vamos adicionar uma nova função ao contrato original:
ferrugem #[near_bindgen] impl StatusMessage { Option { let account_id = env::signer_account_id(); self.records.insert(&account_id, &message); return self.records.get(&account_id); } }
Depois de compilar, use near deploy para reimplantar. Os dados no contrato original ainda podem ser lidos normalmente.
( 2. A estrutura de dados do contrato foi modificada
Se a estrutura de dados do contrato for modificada, a reimplantação direta resultará em falha na desserialização do estado. Por exemplo, modificamos a estrutura do contrato da seguinte forma:
ferrugem #[near_bindgen] #[derive)BorshDeserialize, BorshSerialize###] pub struct StatusMessage { taglines: LookupMap<string, string="">, bios: LookupMap<string, string="">, }
Neste caso, é necessário usar o método Migrate para realizar a atualização. Adicione o método migrate no novo contrato:
ferrugem #( #[init)ignore_state[private]] Self { let old_state: OldStatusMessage = env::state_read().expect("failed"); Self { taglines: old_state.records, bios: LookupMap::new(b"b".to_vec)(), } }
Então, chame 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, é possível atualizar o contrato com sucesso e migrar os dados antigos.
ignore_state)] antes da função de migração, garantindo que o estado não seja carregado antes da execução.
Após a migração ser concluída, exclua a função de migração, garantindo que seja chamada apenas uma vez.
A nova estrutura de dados é inicializada durante a migração.
A atualização de contratos é um processo complexo que deve ser tratado com cautela. Com um design razoável e testes rigorosos, é possível realizar uma atualização de contratos segura e confiável.