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:
Considerações de segurança na atualização de contratos
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.
Recomenda-se definir o proprietário do contrato como DAO, gerido em conjunto através de propostas e votos.
Adicione #[init)ignore_state)] antes da função de migração, para garantir que o estado não seja carregado antes da execução.
Após a migração, remova a função de migração, garantindo que seja chamada apenas uma vez.
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.
8 gostos
Recompensa
8
5
Republicar
Partilhar
Comentar
0/400
GweiWatcher
· 23h atrás
O jogador do contrato gritou: Sobe ou não, depende de você!
Ver originalResponder0
ContractHunter
· 23h atrás
Ah ah ah, estou novamente a cair num buraco familiar de atualização do rust.
Ver originalResponder0
NFTRegretter
· 23h atrás
Caramba, mais uma atualização, que irritante!
Ver originalResponder0
TokenVelocity
· 23h atrás
Com tantas vulnerabilidades, quem se atreve a tocar?
Ver originalResponder0
DuskSurfer
· 23h atrás
Vulnerabilidades de contratos aparecem todos os dias, realmente deixa as pessoas irritadas.
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.
ignore_state)] antes da função de migração, para garantir que o estado não seja carregado antes da execução.
Após a migração, remova a função de migração, garantindo que seja chamada apenas uma vez.
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.