Saltar al contenido principal

Precompilados de EVM

QoreChain extiende el QoreChain EVM Engine con seis contratos precompilados personalizados que exponen funciones a nivel de protocolo directamente a Solidity. Estos precompilados brindan acceso on-chain a criptografía post-cuántica, puntuación de riesgo por IA, mensajería cross-VM y parámetros de consenso PRISM.

Aún no activos en mainnet ni en testnet

Los seis precompilados de QoreChain que se describen a continuación están compilados en el nodo pero aún no activados, ni en la mainnet qorechain-vladi (ID de cadena EVM 9801) ni en la testnet qorechain-diana (ID de cadena EVM 9800). La EVM solo despacha las direcciones listadas en el parámetro active_static_precompiles, y esa lista está vacía en ambas redes. Hasta que una actualización de la cadena los active, una llamada a cualquiera de estas direcciones tiene éxito y devuelve datos vacíos (0x); no revierte ni devuelve un error. Consulte Estado de la red antes de depender de cualquiera de ellos.

Estado de la red​

PrecompiladoDirecciónqorechain-vladi (mainnet)qorechain-diana (testnet)
PQC Verify0x…0A01No activoNo activo
PQC Key Status0x…0A02No activoNo activo
AI Risk Score0x…0B01No activoNo activo
AI Anomaly Check0x…0B02No activoNo activo
PRISM Consensus Params0x…0C01No activoNo activo
CrossVM Bridge0x…0901No activoNo activo

La activación requiere una actualización de la cadena y está planificada por etapas: primero los precompilados de PQC y de consenso de solo lectura, el par de IA una vez que esté lista su ruta de solo lectura en punto fijo, y el CrossVM Bridge solo después de reconstruirlo con journaling, comprobaciones de valor y el circuit breaker cross-VM. Esta tabla se actualiza en la misma operación que la actualización que active cualquiera de ellos.

Compruebe usted mismo la lista actual (una lista vacía significa que ninguno está activo):

curl -s https://api.qore.host/cosmos/evm/vm/v1/params | jq .params.active_static_precompiles
curl -s https://api-testnet.qore.host/cosmos/evm/vm/v1/params | jq .params.active_static_precompiles

Protéjase frente a datos de retorno vacíos​

Como una dirección inactiva (o que no es de QoreChain) devuelve éxito sin datos, nunca lea los bytes de retorno sin procesar de una llamada de bajo nivel sin comprobar su longitud. abi.decode y las llamadas a interfaces tipadas revierten con datos vacíos, que es el resultado seguro; una llamada de bajo nivel escrita a mano debe comprobarlo explícitamente:

(bool ok, bytes memory ret) = address(0x0000000000000000000000000000000000000A02)
.staticcall(abi.encodeWithSignature("pqcKeyStatus(address)", account));
require(ok && ret.length >= 96, "precompile not active");
(bool registered, uint8 algorithmId, bytes memory pubkey) = abi.decode(ret, (bool, uint8, bytes));

No envíe valor a estas direcciones. No son payable, y el valor enviado a una dirección de precompilado inactiva se queda allí sin forma de recuperarlo.


Mapa de direcciones de precompilados​

Las cifras de gas son lo que el nodo cobra una vez que un precompilado está activo (por byte significa por byte de la entrada de la llamada).

PrecompiladoDirecciónGas baseDescripción
CrossVM Bridge0x000000000000000000000000000000000000090150,000 + 4/byteLlamadas cross-VM síncronas (EVM a CosmWasm)
PQC Verify0x0000000000000000000000000000000000000A0125,000 + 8/byteVerifica firmas post-cuánticas ML-DSA-87
PQC Key Status0x0000000000000000000000000000000000000A022,500Verifica si una cuenta tiene una clave PQC registrada
AI Risk Score0x0000000000000000000000000000000000000B0150,000Obtiene la puntuación de riesgo generada por IA para datos de transacción
AI Anomaly Check0x0000000000000000000000000000000000000B0240,000Verifica si una transferencia está marcada como anómala
PRISM Consensus Params0x0000000000000000000000000000000000000C011,500Lee los parámetros de consenso actuales ajustados por PRISM

Interfaces de Solidity​

IQorePQC.sol​

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

interface IQorePQC {
/// @notice Verify an ML-DSA-87 (Dilithium-5) signature
/// @param pubkey The 2592-byte ML-DSA-87 public key
/// @param signature The 4627-byte ML-DSA-87 signature
/// @param message The original message bytes
/// @return valid True if the signature is valid
function pqcVerify(
bytes calldata pubkey,
bytes calldata signature,
bytes calldata message
) external view returns (bool valid);

/// @notice Check if an account has a registered PQC public key
/// @param account The Ethereum-style address to check
/// @return registered True if a PQC key is registered
/// @return algorithmId The PQC algorithm identifier (1 = ML-DSA-87)
/// @return pubkey The registered public key bytes (empty if not registered)
function pqcKeyStatus(address account)
external
view
returns (bool registered, uint8 algorithmId, bytes memory pubkey);
}

IQoreAI.sol​

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

interface IQoreAI {
/// @notice Get the AI-generated risk score for transaction data
/// @param txData The transaction data to evaluate
/// @return score Risk score in basis points (0-10000)
/// @return level Risk level: 0=SAFE, 1=LOW, 2=MEDIUM, 3=HIGH, 4=CRITICAL
function aiRiskScore(bytes calldata txData)
external
view
returns (uint256 score, uint8 level);

/// @notice Check if a transfer is flagged as anomalous
/// @param sender The sender address
/// @param amount The transfer amount in wei
/// @return anomalyScore The anomaly score (higher = more anomalous)
/// @return flagged True if the transfer exceeds the anomaly threshold
function aiAnomalyCheck(address sender, uint256 amount)
external
view
returns (uint256 anomalyScore, bool flagged);
}

IQoreConsensus.sol​

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

interface IQoreConsensus {
/// @notice Get current PRISM-tuned consensus parameters
/// @return blockTime Current target block time in milliseconds
/// @return baseGasPrice Current base gas price in wei
/// @return validatorSetSize Current active validator set size
/// @return epoch Current PRISM epoch number
function rlConsensusParams()
external
view
returns (
uint256 blockTime,
uint256 baseGasPrice,
uint256 validatorSetSize,
uint256 epoch
);
}

Ejemplos de uso​

PQC Verify — Verificar una firma post-cuántica​

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

import "./interfaces/IQorePQC.sol";

contract PQCVerifier {
IQorePQC constant PQC = IQorePQC(0x0000000000000000000000000000000000000A01);

/// @notice Verify a PQC signature and revert if invalid
function verifyOrRevert(
bytes calldata pubkey,
bytes calldata signature,
bytes calldata message
) external view {
bool valid = PQC.pqcVerify(pubkey, signature, message);
require(valid, "PQC signature verification failed");
}
}

Costo de gas: 25,000 base + 8 gas por byte de datos de entrada. La entrada es la llamada codificada en ABI (clave pública de 2592 bytes, firma de 4627 bytes, el mensaje, más los desplazamientos y el relleno de ABI), por lo que una verificación típica de ML-DSA-87 cuesta aproximadamente 85,000-90,000 de gas.

PQC Key Status — Verificar el registro de una cuenta​

contract PQCChecker {
IQorePQC constant PQC_STATUS = IQorePQC(0x0000000000000000000000000000000000000A02);

function requirePQCKey(address account) external view {
(bool registered, , ) = PQC_STATUS.pqcKeyStatus(account);
require(registered, "Account must have a registered PQC key");
}
}

Costo de gas: 2,500 fijo.

AI Risk Score — Evaluar el riesgo de una transacción​

import "./interfaces/IQoreAI.sol";

contract RiskGate {
IQoreAI constant AI = IQoreAI(0x0000000000000000000000000000000000000B01);

uint8 constant MAX_ALLOWED_RISK = 2; // Allow up to MEDIUM

function executeIfSafe(bytes calldata txData) external {
(uint256 score, uint8 level) = AI.aiRiskScore(txData);
require(level <= MAX_ALLOWED_RISK, "Risk level too high");

// Proceed with execution...
}
}

Niveles de riesgo:

NivelValor
SAFE0
LOW1
MEDIUM2
HIGH3
CRITICAL4

El nivel proviene de la etiqueta de gravedad que el motor de IA asigna a la transacción; la puntuación se devuelve en puntos básicos (0 - 10000). No hay una correspondencia fija entre rangos de puntuación y niveles, así que condicione la decisión a level en lugar de a umbrales de puntuación.

Costo de gas: 50,000 fijo.

AI Anomaly Check — Marcar transferencias sospechosas​

contract AnomalyGuard {
IQoreAI constant AI = IQoreAI(0x0000000000000000000000000000000000000B02);

function safeTransfer(address sender, uint256 amount) external view {
(uint256 anomalyScore, bool flagged) = AI.aiAnomalyCheck(sender, amount);

if (flagged) {
revert("Transfer flagged as anomalous");
}
}
}

Costo de gas: 40,000 fijo.

PRISM Consensus Params — Leer el estado del consenso​

contract ConsensusReader {
IQoreConsensus constant RL = IQoreConsensus(
0x0000000000000000000000000000000000000C01
);

function getBlockTime() external view returns (uint256) {
(uint256 blockTime, , , ) = RL.rlConsensusParams();
return blockTime;
}

function getCurrentEpoch() external view returns (uint256) {
(, , , uint256 epoch) = RL.rlConsensusParams();
return epoch;
}
}

Costo de gas: 1,500 fijo.

nota

En la compilación actual del nodo, rlConsensusParams devuelve valores predeterminados fijos de marcador de posición, no valores en vivo ajustados por PRISM (por ejemplo, no informa el tiempo de bloque medido, que es de aproximadamente 3,2 s en mainnet y de aproximadamente 1,0 s en la testnet). Conectarlo a los parámetros de consenso en vivo forma parte del trabajo de activación.

CrossVM Bridge — Llamar a CosmWasm desde EVM​

aviso

El precompilado CrossVM Bridge no se activará en su forma actual. Se está reconstruyendo para que una reversión en el contrato que llama también deshaga el lado de CosmWasm, se rechacen las transferencias de valor, se impida la reentrada de EVM a EVM y se aplique el circuit breaker cross-VM. Hasta entonces no existe una ruta síncrona de EVM a CosmWasm; consulte Interoperabilidad Cross-VM para la ruta de mensajes MsgCrossVMCall, que a su vez está desactivada hoy en mainnet.

El nodo decodifica el calldata como executeCrossVMCall(uint8 targetVM, string targetContract, bytes payload) (selector de 4 bytes y, a continuación, los argumentos codificados en ABI). El uso documentado es de EVM a CosmWasm; el ABI puede cambiar con la reconstrucción.

Costo de gas: 50,000 base + 4 gas por byte de entrada, más el costo de ejecución del contrato de destino. Consulte Interoperabilidad Cross-VM para más detalles.


Ubicaciones de los archivos de interfaz​

Los archivos de interfaz de Solidity están disponibles en el repositorio para importación directa:

contracts/
interfaces/
IQorePQC.sol
IQoreAI.sol
IQoreConsensus.sol

Instálelos en su proyecto de Hardhat o Foundry:

# Copy interfaces to your project
cp -r contracts/interfaces/ my-project/contracts/interfaces/

O referéncielos mediante la ruta de importación en sus archivos Solidity:

import "./interfaces/IQorePQC.sol";
import "./interfaces/IQoreAI.sol";
import "./interfaces/IQoreConsensus.sol";

Próximos pasos​