Guía de actualización de contratos inteligentes de Rust
Los contratos inteligentes, como una forma de programa, inevitablemente pueden tener defectos. Incluso después de numerosas pruebas y auditorías, aún pueden existir vulnerabilidades. Una vez que sean explotadas por un atacante, pueden causar pérdidas en los activos de los usuarios, con graves consecuencias. Por lo tanto, la capacidad de actualización de los contratos es muy necesaria, principalmente para corregir vulnerabilidades y agregar nuevas características. Este artículo presentará las formas de actualizar los contratos en Rust.
Método de actualización del contrato NEAR
Tomando como ejemplo el proyecto StatusMessage, se introducen los métodos comunes de actualización de contratos en NEAR.
1. Estructura de datos del contrato no modificada
Si solo se modifica la lógica del contrato, sin cambios en la estructura de datos, se puede usar directamente near deploy para desplegar el nuevo código:
bash
despliegue cerca
--accountId status_message.example.testnet
--wasmFile target/wasm32-unknown-unknown/release/status_message.wasm
Los datos del contrato original se pueden leer normalmente.
2. Modificación de la estructura de datos del contrato
Si se modifica la estructura de datos del contrato, volver a desplegarlo directamente provocará un fallo en la deserialización del estado. En este caso, es necesario utilizar el método migrate para realizar la actualización:
Sugerencias de seguridad para la actualización de contratos
Se añadió control de permisos a la función de actualización, solo se permite la llamada al owner.
Establecer el propietario como DAO, gestionado a través de propuestas y votaciones.
Función de migración agregada #[init(ignore_state)]
Eliminar la función de migración después de completar la migración
La nueva estructura de datos se inicializa durante la migración.
Una actualización razonable puede mantener la seguridad y escalabilidad del contrato, siendo una parte importante del desarrollo de contratos inteligentes.
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
6 me gusta
Recompensa
6
3
Compartir
Comentar
0/400
PumpBeforeRug
· hace10h
Si no puedes prevenir vulnerabilidades básicas, ¿para qué jugar a correr desnudo?
Mejores prácticas de actualización de contratos inteligentes en Rust: aprendiendo del caso del contrato de NEAR
Guía de actualización de contratos inteligentes de Rust
Los contratos inteligentes, como una forma de programa, inevitablemente pueden tener defectos. Incluso después de numerosas pruebas y auditorías, aún pueden existir vulnerabilidades. Una vez que sean explotadas por un atacante, pueden causar pérdidas en los activos de los usuarios, con graves consecuencias. Por lo tanto, la capacidad de actualización de los contratos es muy necesaria, principalmente para corregir vulnerabilidades y agregar nuevas características. Este artículo presentará las formas de actualizar los contratos en Rust.
Método de actualización del contrato NEAR
Tomando como ejemplo el proyecto StatusMessage, se introducen los métodos comunes de actualización de contratos en NEAR.
1. Estructura de datos del contrato no modificada
Si solo se modifica la lógica del contrato, sin cambios en la estructura de datos, se puede usar directamente near deploy para desplegar el nuevo código:
bash despliegue cerca
--accountId status_message.example.testnet
--wasmFile target/wasm32-unknown-unknown/release/status_message.wasm
Los datos del contrato original se pueden leer normalmente.
2. Modificación de la estructura de datos del contrato
Si se modifica la estructura de datos del contrato, volver a desplegarlo directamente provocará un fallo en la deserialización del estado. En este caso, es necesario utilizar el método migrate para realizar la actualización:
óxido #[private] #[init(ignore_state)] Self { let old_state: OldStatusMessage = env::state_read().expect("failed"); Self { new_field: LookupMap::new(b"n".to_vec)((, old_field: old_state.old_field, } }
Llamar al método migrate al desplegar:
bash
cerca de desplegar
--wasmFile target/wasm32-unknown-unknown/release/status_message.wasm
--initFunction "migrate"
--initArgs "{}"
--accountId status_message.example.testnet
De esta manera, se puede migrar el estado antiguo al nuevo contrato.
![])https://img-cdn.gateio.im/webp-social/moments-73f5e5195fa71f1f25f5d35ba1e8b8ec.webp)
Sugerencias de seguridad para la actualización de contratos
Una actualización razonable puede mantener la seguridad y escalabilidad del contrato, siendo una parte importante del desarrollo de contratos inteligentes.