Prática de atualização de contratos inteligentes Rust: Três métodos e considerações de segurança no ecossistema NEAR

Série de desenvolvimento de contratos inteligentes em Rust: Métodos de atualização de contratos

Os contratos inteligentes, como um código de programa, inevitavelmente terão defeitos e áreas que precisam de melhoria. Mesmo após muitos testes e auditorias, os contratos ainda podem ter vulnerabilidades. Uma vez que essas vulnerabilidades sejam exploradas por atacantes, podem causar sérias consequências, como a perda de ativos dos usuários. Portanto, a capacidade de atualizar os contratos é muito importante, pois pode ser usada tanto para corrigir vulnerabilidades quanto para adicionar novas funcionalidades. Este artigo irá apresentar várias maneiras de atualizar contratos inteligentes em 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.

Exemplo de código de contrato StatusMessage:

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

impl Default para StatusMessage { Self { Self { records: LookupMap::new(b'r'.to_vec)((, } } }

#[near_bindgen] impl StatusMessage { pub fn set_status)&mut self, message: String) { let account_id = env::signer_account_id(); self.records.insert(&account_id, &message); }

Option { return self.records.get(&account_id); } }

( 1. Atualização da estrutura de dados do contrato não modificada

Se apenas modificar a lógica do contrato, sem alterações na estrutura de dados, pode usar diretamente o comando near deploy para reimplantar o novo código.

Por exemplo, adicionar uma nova função:

ferrugem Option { let account_id = env::signer_account_id)(; self.records.insert)&account_id, &message###; return self.records.get(&account_id); }

Após o redesdobramento, os dados originais ainda podem ser lidos normalmente.

( 2. Atualização da estrutura de dados dos contratos

Se a estrutura de dados do contrato for alterada, a implantação direta resultará em falha na desserialização do estado.

Por exemplo, modificar a estrutura de dados:

rust pub struct StatusMessage { taglines: LookupMap<string, string="">, bios: LookupMap<string, string="">, }

Neste caso, é necessário usar o método Migrate para a atualização.

) 3. Usar o método Migrate para atualizar

Adicionar o método migrate no novo contrato:

ferrugem #( #[init)ignore_state(] Self { let old_state: OldStatusMessage = env::state_read)###.expect###'failed'[private]; Self { taglines: old_state.records, bios: LookupMap::new(b'b'.to_vec)(), } }

Chame o método migrate ao implantar:

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 antigos para a nova estrutura de dados.

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

  1. Controle de permissões - A função de atualização deve ser exclusiva do owner, recomenda-se que o owner seja definido como DAO

  2. Adicione #[init(ignore_state)] antes da função de migração

  3. Após a migração, delete a função de migração.

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

Através de um design de mecanismo de atualização razoável, é possível alcançar a capacidade de atualização dos contratos, garantindo a segurança e estabelecendo uma base para manutenção e otimização a longo prazo.

![](https://img-cdn.gateio.im/webp-social/moments-af3fe22c1999da5db0e2853b8a271276.webp(</string,></string,></string,>

GET-0.08%
Ver original
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.
  • Recompensa
  • 4
  • Compartilhar
Comentário
0/400
PretendingToReadDocsvip
· 07-23 12:26
Os contratos de代理 são mais seguros.
Ver originalResponder0
ArbitrageBotvip
· 07-23 12:19
Atualizar com medo de ser enganado por idiotas
Ver originalResponder0
LiquidityNinjavip
· 07-23 12:10
A atualização do contrato é difícil.
Ver originalResponder0
EthMaximalistvip
· 07-23 12:04
As atualizações também podem ter vulnerabilidades
Ver originalResponder0
  • Marcar
Faça trade de criptomoedas em qualquer lugar e a qualquer hora
qrCode
Escaneie o código para baixar o app da Gate
Comunidade
Português (Brasil)
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)