Guía de actualización de contratos inteligentes Rust: actualizaciones de seguridad y migración de datos de contratos NEAR

Guía de actualización de contratos inteligentes Rust

Los contratos inteligentes, como una forma de programas, inevitablemente pueden tener defectos. A pesar de numerosas pruebas y auditorías, aún pueden existir vulnerabilidades. Si son explotadas por atacantes, pueden causar la pérdida de activos de los usuarios, lo que puede tener graves consecuencias. La reparación de vulnerabilidades a menudo requiere una actualización del contrato. Además, la adición de nuevas funciones también requiere la actualización del contrato. Por lo tanto, la capacidad de actualización del contrato es muy necesaria. Este artículo presentará los métodos de actualización de contratos en Rust.

Método de actualización de contratos en NEAR

Tomando como ejemplo el proyecto StatusMessage, se presentan los métodos comunes de actualización de contratos NEAR.

1. La estructura de datos del contrato no ha sido modificada

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 implementar el nuevo código. Por ejemplo, agregar una nueva función:

ó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 la reimplementación, los datos en el contrato original aún se pueden leer con éxito.

( 2. La estructura de datos del contrato ha sido modificada

Si se modifica la estructura de datos original, por ejemplo:

óxido #[near_bindgen] #[derive)BorshDeserialize, BorshSerialize###] pub struct StatusMessage { eslóganes: LookupMap<string, string="">, bios: LookupMap<string, string="">, }

La reimplementación directa provocará un error al deserializar el estado del contrato.

( 3. Usar el método Migrate para actualizar

NEAR proporciona el método Migrate para ayudar a la actualización de contratos. Agrega 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)(), } }

Llamar al método migrate durante el despliegue:

cerca de implementar
--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.

![](https://img-cdn.gateio.im/webp-social/moments-73f5e5195fa71f1f25f5d35ba1e8b8ec.webp(

Consideraciones de seguridad para la actualización de contratos

  1. Control de acceso: la función de actualización debe ser una función only owner, asegurando que solo pueda ser llamada por el owner.

  2. Se recomienda establecer el propietario del contrato como DAO, gestionado conjuntamente a través de propuestas y votaciones.

  3. Agregar #[init)ignore_state)] antes de la función de migración, asegurando que no se cargue el estado antes de la ejecución.

  4. Eliminar la función de migración después de que se complete la migración, asegurando que solo se llame una vez.

  5. La nueva estructura de datos se inicializa al migrar.

Siguiendo los principios anteriores, se puede actualizar y mantener contratos inteligentes de forma segura.

</string,></string,>

Ver originales
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.
  • Recompensa
  • 5
  • Republicar
  • Compartir
Comentar
0/400
GweiWatchervip
· 08-12 18:54
¡Los jugadores de contratos gritan con fuerza: ¡Suba o no, depende de ti!
Ver originalesResponder0
ContractHuntervip
· 08-12 18:54
¡Ah, ah, ah! Otra vez me encuentro con el agujero de actualización de Rust que ya conozco.
Ver originalesResponder0
NFTRegrettervip
· 08-12 18:35
¡Maldita sea! Otra vez hay que actualizar, es un fastidio.
Ver originalesResponder0
TokenVelocityvip
· 08-12 18:31
Con tantos fallos, ¿quién se atreve a tocarlos?
Ver originalesResponder0
DuskSurfervip
· 08-12 18:31
Los defectos de los contratos ocurren todos los días, realmente me pone de los nervios.
Ver originalesResponder0
  • Anclado
Opere con criptomonedas en cualquier momento y lugar
qrCode
Escanee para descargar la aplicación Gate
Comunidad
Español
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)