Serie de desarrollo de contratos inteligentes en Rust: Métodos de actualización de contratos
Los contratos inteligentes, como un tipo de código de programa, inevitablemente pueden tener defectos y áreas que necesitan mejoras. Incluso después de muchas pruebas y auditorías, los contratos aún pueden tener vulnerabilidades. Una vez que estas vulnerabilidades son explotadas por los atacantes, pueden causar graves consecuencias, como la pérdida de activos de los usuarios. Por lo tanto, la capacidad de actualizar los contratos es muy importante, ya que se puede utilizar tanto para corregir vulnerabilidades como para agregar nuevas funciones. Este artículo presentará varias formas de actualizar contratos inteligentes en Rust.
Método de actualización de contratos inteligentes de 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 en la actualización
Si solo se modifica la lógica del contrato, sin involucrar cambios en la estructura de datos, se puede usar directamente el comando near deploy para volver a desplegar el nuevo código.
cerca de desplegar
--wasmFile target/wasm32-unknown-unknown/release/status_message.wasm
--initFunction 'migrate' \
--initArgs '{}' \
--accountId statusmessage.blocksec_upgrade.testnet
Esto permitirá migrar con éxito los datos antiguos a la nueva estructura de datos.
Consideraciones de seguridad para la actualización de contratos
Control de permisos - La función de actualización debe ser exclusiva del owner, se recomienda establecer el owner como DAO
Añadir #[init(ignore_state)] antes de la función de migración.
Eliminar la función de migración después de que se complete la migración.
La nueva estructura de datos se inicializa durante la migración.
A través de un diseño razonable del mecanismo de actualización, se puede lograr la capacidad de actualización del contrato, garantizando la seguridad y sentando las bases para el mantenimiento y la optimización a largo plazo.
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.
17 me gusta
Recompensa
17
4
Compartir
Comentar
0/400
PretendingToReadDocs
· 07-23 12:26
Los contratos de agencia son un poco más seguros.
Ver originalesResponder0
ArbitrageBot
· 07-23 12:19
Actualización por miedo a ser engañados
Ver originalesResponder0
LiquidityNinja
· 07-23 12:10
La actualización del contrato es difícil.
Ver originalesResponder0
EthMaximalist
· 07-23 12:04
Las actualizaciones también pueden tener vulnerabilidades
Actualización práctica de contratos inteligentes en Rust: tres métodos y consideraciones de seguridad en el ecosistema NEAR
Serie de desarrollo de contratos inteligentes en Rust: Métodos de actualización de contratos
Los contratos inteligentes, como un tipo de código de programa, inevitablemente pueden tener defectos y áreas que necesitan mejoras. Incluso después de muchas pruebas y auditorías, los contratos aún pueden tener vulnerabilidades. Una vez que estas vulnerabilidades son explotadas por los atacantes, pueden causar graves consecuencias, como la pérdida de activos de los usuarios. Por lo tanto, la capacidad de actualizar los contratos es muy importante, ya que se puede utilizar tanto para corregir vulnerabilidades como para agregar nuevas funciones. Este artículo presentará varias formas de actualizar contratos inteligentes en Rust.
Método de actualización de contratos inteligentes de NEAR
Tomando como ejemplo el proyecto StatusMessage, se presentan los métodos comunes de actualización de contratos en NEAR.
Ejemplo de código de contrato StatusMessage:
óxido #[near_bindgen] #[derive(BorshDeserialize, BorshSerialize)] pub struct StatusMessage { records: LookupMap<string, string="">, }
impl Default para StatusMessage { Self { Auto { 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(\u0026account_id, \u0026message); }
Option { return self.records.get(\u0026account_id); } }
( 1. La estructura de datos del contrato no ha sido modificada en la actualización
Si solo se modifica la lógica del contrato, sin involucrar cambios en la estructura de datos, se puede usar directamente el comando near deploy para volver a desplegar el nuevo código.
Por ejemplo, agregar una nueva función:
óxido Option { let account_id = env::signer_account_id)(; self.records.insert)\u0026account_id, \u0026message###; return self.records.get(&account_id); }
Después de la reimplementación, los datos originales aún se pueden leer normalmente.
( 2. Actualización de la modificación de la estructura de datos de contratos inteligentes
Si se modifica la estructura de datos del contrato, volver a desplegar directamente provocará un fallo en la deserialización del estado.
Por ejemplo, modificar la estructura de datos:
óxido pub struct StatusMessage { taglines: LookupMap<string, string="">, bios: LookupMap<string, string="">, }
En este caso, es necesario utilizar el método Migrate para la actualización.
) 3. Usar el método Migrate para la actualización
Agregar el método migrate en el nuevo contrato:
óxido #( #[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)(), } }
Llama al método migrate al desplegar:
cerca de desplegar
--wasmFile target/wasm32-unknown-unknown/release/status_message.wasm
--initFunction 'migrate' \ --initArgs '{}' \ --accountId statusmessage.blocksec_upgrade.testnet
Esto permitirá migrar con éxito los datos antiguos a la nueva estructura de datos.
Consideraciones de seguridad para la actualización de contratos
Control de permisos - La función de actualización debe ser exclusiva del owner, se recomienda establecer el owner como DAO
Añadir #[init(ignore_state)] antes de la función de migración.
Eliminar la función de migración después de que se complete la migración.
La nueva estructura de datos se inicializa durante la migración.
A través de un diseño razonable del mecanismo de actualización, se puede lograr la capacidad de actualización del contrato, garantizando la seguridad y sentando las bases para el mantenimiento y la optimización a largo plazo.
![](https://img-cdn.gateio.im/webp-social/moments-af3fe22c1999da5db0e2853b8a271276.webp(</string,></string,></string,>