Guía de actualización de contratos inteligentes Rust
Los contratos inteligentes, como una forma de programa, inevitablemente pueden tener defectos y vulnerabilidades. Incluso después de numerosas pruebas y auditorías, aún pueden existir problemas no detectados. Una vez que un atacante aprovecha una vulnerabilidad del contrato, puede causar pérdidas de activos para los usuarios, con consecuencias graves. Por lo tanto, la capacidad de actualización del contrato es crucial, ya que se puede utilizar tanto para corregir vulnerabilidades como para añadir nuevas funciones. Este artículo presentará el método de actualización de contratos Rust en la plataforma NEAR.
Método de actualización de contratos inteligentes NEAR
Tomando como ejemplo el proyecto StatusMessage, se presentan los métodos comunes de actualización de contratos en NEAR.
1. La estructura de datos del contrato no ha sido modificada
Si solo se modifica la lógica del contrato y no se involucran cambios en la estructura de datos, se puede utilizar directamente el comando near deploy para redeplegar el nuevo código. Por ejemplo, añadimos una nueva función sobre la base del contrato original:
Después de compilar, simplemente usa near deploy para redeplegar. Los datos en el contrato original aún se pueden leer con normalidad.
( 2. La estructura de datos del contrato ha sido modificada
Si se modifica la estructura de datos del contrato, volver a desplegarlo directamente provocará un fallo en la deserialización del estado. Por ejemplo, modificamos la estructura del contrato de la siguiente manera:
Consideraciones de seguridad en la actualización de contratos
Control de acceso: la función de actualización debe establecerse como una función only owner, asegurando que solo pueda ser llamada por el owner.
Se recomienda establecer el propietario del contrato como DAO, gestionando el contrato a través de propuestas y votaciones.
Añadir #[init)ignore_state)] antes de la función de migración, asegurando que no se cargue el estado antes de la ejecución.
Después de completar la migración, elimina la función de migración para asegurarte de que solo se llame una vez.
La nueva estructura de datos se inicializa durante la migración.
La actualización de contratos es un proceso complejo que debe ser tratado con precaución. A través de un diseño razonable y pruebas rigurosas, se puede lograr una actualización de contratos segura y confiable.
Esta página puede contener contenido de terceros, que se proporciona únicamente con fines informativos (sin garantías ni declaraciones) y no debe considerarse como un respaldo por parte de Gate a las opiniones expresadas ni como asesoramiento financiero o profesional. Consulte el Descargo de responsabilidad para obtener más detalles.
13 me gusta
Recompensa
13
2
Compartir
Comentar
0/400
WalletDetective
· 07-20 23:00
Es bastante hardcore
Ver originalesResponder0
MetaverseVagrant
· 07-20 22:55
Otra vez están involucrados en contratos inteligentes.
Guía de actualización de contratos inteligentes Rust: explicación detallada de los métodos de actualización de seguridad de la plataforma NEAR
Guía de actualización de contratos inteligentes Rust
Los contratos inteligentes, como una forma de programa, inevitablemente pueden tener defectos y vulnerabilidades. Incluso después de numerosas pruebas y auditorías, aún pueden existir problemas no detectados. Una vez que un atacante aprovecha una vulnerabilidad del contrato, puede causar pérdidas de activos para los usuarios, con consecuencias graves. Por lo tanto, la capacidad de actualización del contrato es crucial, ya que se puede utilizar tanto para corregir vulnerabilidades como para añadir nuevas funciones. Este artículo presentará el método de actualización de contratos Rust en la plataforma NEAR.
Método de actualización de contratos inteligentes NEAR
Tomando como ejemplo el proyecto StatusMessage, se presentan los métodos comunes de actualización de contratos en NEAR.
1. La estructura de datos del contrato no ha sido modificada
Si solo se modifica la lógica del contrato y no se involucran cambios en la estructura de datos, se puede utilizar directamente el comando near deploy para redeplegar el nuevo código. Por ejemplo, añadimos una nueva función sobre la base del contrato original:
óxido #[near_bindgen] impl StatusMessage { Option { let account_id = env::signer_account_id(); self.records.insert(\u0026account_id, \u0026message); return self.records.get(&account_id); } }
Después de compilar, simplemente usa near deploy para redeplegar. Los datos en el contrato original aún se pueden leer con normalidad.
( 2. La estructura de datos del contrato ha sido modificada
Si se modifica la estructura de datos del contrato, volver a desplegarlo directamente provocará un fallo en la deserialización del estado. Por ejemplo, modificamos la estructura del contrato de la siguiente manera:
óxido #[near_bindgen] #[derive)BorshDeserialize, BorshSerialize###] pub struct StatusMessage { eslóganes: LookupMap<string, string="">, bios: LookupMap<string, string="">, }
En este caso, es necesario utilizar el método Migrate para realizar la actualización. Agregue el método migrate en el nuevo contrato:
óxido #( #[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)(), } }
Luego, llama al método migrate al desplegar:
near desplegar \ --wasmFile target/wasm32-unknown-unknown/release/status_message.wasm
--initFunction "migrate"
--initArgs "{}"
--accountId statusmessage.blocksec_upgrade.testnet
De esta manera, se puede actualizar con éxito el contrato y migrar los datos antiguos.
ignore_state)] antes de la función de migración, asegurando que no se cargue el estado antes de la ejecución.
Después de completar la migración, elimina la función de migración para asegurarte de que solo se llame una vez.
La nueva estructura de datos se inicializa durante la migración.
La actualización de contratos es un proceso complejo que debe ser tratado con precaución. A través de un diseño razonable y pruebas rigurosas, se puede lograr una actualización de contratos segura y confiable.