Skip to content
Guía de Migración PQC · Solidity · 2025

Cómo migrar tus contratos Solidity a criptografía post-cuántica

QuantumScan detectó la vulnerabilidad. Aquí está el camino concreto de migración para cada patrón — desde la auditoría de hoy hasta la arquitectura quantum-safe a largo plazo.

← Volver al escáner Solidity
Prueba real: contratos core de OpenZeppelin100/100 Crítico
$ npx quantumscan ./openzeppelin-contracts/contracts/token/ERC20/extensions/
QuantumScan v1.5.0 · Post-Quantum Cryptography Scanner
🟠 HIGH18 findings
ECDSA.sol:190 · ecrecover(
EIP712.sol:109 · _hashTypedDataV4(
ERC20Permit.sol:57 · _hashTypedDataV4(
... 15 more findings
Risk Score 100/100 Critical 🚨

Estos son los contratos que hereda el 80%+ de los protocolos DeFi. Cada token que usa ERC20Permit está afectado.

Línea de tiempo de migración

Ahora — Auditoría

Ejecuta QuantumScan. Documenta cada ecrecover(), EIP-712 y permit(). Agrega los hallazgos a tu informe de auditoría.

2025-2027 — Híbrido

Despliega wrappers Account Abstraction (ERC-4337) con soporte ML-DSA junto al ECDSA existente. Firma dual en operaciones críticas.

2028-2030 — Migrar

Deadline NIST/CNSA 2.0. Reemplaza firmantes ECDSA con ML-DSA (FIPS 204). Se espera que Ethereum tenga precompile PQC para entonces.

Ruta de migración por patrón

ecrecover() / ECDSA.recover()Mediano plazo@noble/post-quantum
1. Freezar

Deja de agregar nuevas llamadas ecrecover(). Documenta todas las existentes.

2. Envolver con ERC-4337

Despliega una Smart Account (ERC-4337) con validador de firma personalizado que soporte ML-DSA (CRYSTALS-Dilithium).

// ERC-4337 validador personalizado
function validateUserOp(UserOperation calldata op, bytes32 hash, uint256 missingFunds)
  external returns (uint256) {
    require(mlDsaVerify(hash, op.signature, ownerPubKey), "Firma PQC inválida");
    return 0;
}
3. Usar @noble/post-quantum

Genera pares de claves ML-DSA y firma off-chain. Verifica on-chain vía precompile o ZK proof.

import { ml_dsa65 } from '@noble/post-quantum/ml-dsa';
const keys = ml_dsa65.keygen();
const sig = ml_dsa65.sign(keys.secretKey, message);
Firmas tipadas EIP-712Mediano plazo
1. Mapear domain separators

Documenta cada EIP712Domain en tu código. Son los objetivos de migración.

2. Firma híbrida

Agrega un campo ML-DSA paralelo a tus structs. Verifica ambas firmas durante la transición.

struct PermitConPQC {
  address owner; address spender;
  uint256 value; uint256 deadline;
  bytes   ecdsaSig;  // legacy
  bytes   mlDsaSig; // ML-DSA FIPS 204
}
3. Esperar EIP PQC

No existe estándar EIP-712 PQC todavía. Monitorea ethereum/EIPs.

Assembly ecrecover precompile (0x1)Corto plazo — primer paso
1. Reemplazar assembly con librería

Primero refactoriza a ECDSA.recover() de OpenZeppelin para facilitar la migración futura.

// ANTES (assembly)
assembly { let success := staticcall(gas(), 0x1, ptr, 0x80, ptr, 0x20) }
// DESPUÉS (librería — fácil de reemplazar)
address signer = ECDSA.recover(hash, v, r, s);
2. Seguir ruta ecrecover()

Aplica la migración ERC-4337 ML-DSA del patrón ecrecover() de arriba.

Oráculo Chainlink (DON secp256k1)Largo plazo — depende de Chainlink
1. Monitorear roadmap Chainlink

La migración del DON de Chainlink está fuera de tu control. No existe interfaz PQC hoy.

2. Circuit breaker

Despliega un circuit breaker que pueda congelar actualizaciones de precios si el oráculo es comprometido.

modifier oracleNotFrozen() {
  require(!oracleFrozen, "Oráculo congelado: riesgo cuántico activo");
  _;
}
3. Multi-oráculo

Usa mediana de múltiples oráculos (Chainlink + Pyth + UMA) para limitar el impacto.

ERC-2612 permit() aprobaciones sin gasCorto plazo
1. Agregar desactivación de emergencia

Agrega función guardian para deshabilitar permit() si la amenaza cuántica se activa.

bool public permitEnabled = true;
function setPermitEnabled(bool enabled) external onlyOwner {
  permitEnabled = enabled;
}
function permit(...) public override {
  require(permitEnabled, "permit() deshabilitado: migración PQC en curso");
  super.permit(...);
}
2. Migrar a ERC-4337 permit

Reemplaza ERC-2612 con una operación ERC-4337 que use firma ML-DSA.

Gnosis Safe / MultiSig N-de-M ECDSAMediano plazo
1. Plan de rotación de claves

Documenta todos los firmantes actuales. Planifica rotación a claves PQC.

2. Módulo Safe PQC

Despliega un módulo Safe personalizado que verifique firmas ML-DSA como tipo de firmante adicional.

contract PQCSafeModule is Module {
  mapping(address => bytes) public pqcPublicKeys;
  function execPQCTransaction(..., bytes calldata mlDsaSig) external {
    require(mlDsaVerify(keccak256(data), mlDsaSig, pqcPublicKeys[msg.sender]));
    ISafe(safe).execTransactionFromModule(to, value, data, Enum.Operation.Call);
  }
}
3. Monitorear Safe{Wallet}

El equipo de Safe conoce la necesidad de migración PQC. Monitorea github.com/safe-global/safe-contracts.

Herramientas PQC para desarrolladores Solidity

EIPs a monitorear

Final
EIP-4337

Account Abstraction — habilita validadores PQC personalizados. Live en mainnet.

Final
EIP-7702

Set EOA code — migración de claves PQC en wallets normales. Incluido en Pectra.

Draft
BIP-360

QuBit — P2QRH para Bitcoin. Referencia para el paralelo en Ethereum.

Escanea tus contratos ahora

Obtén el reporte completo antes de iniciar tu migración. Gratis, open-source, sin cuenta.

← Volver al inicio