본문으로 건너뛰기

EVM 프리컴파일

QoreChain은 QoreChain EVM 엔진을 6개의 커스텀 프리컴파일 컨트랙트로 확장하여 프로토콜 수준의 기능을 Solidity에 직접 노출합니다. 이 프리컴파일들은 포스트 퀀텀 암호화, AI 리스크 스코어링, 크로스 VM 메시징, PRISM 합의 파라미터에 대한 온체인 접근을 제공합니다.

메인넷과 테스트넷에서 아직 활성화되지 않음

아래의 QoreChain 프리컴파일 6개는 노드에 컴파일되어 있지만 아직 활성화되지 않았습니다. qorechain-vladi 메인넷(EVM 체인 ID 9801)과 qorechain-diana 테스트넷(EVM 체인 ID 9800) 모두 해당됩니다. EVM은 active_static_precompiles 파라미터에 있는 주소만 디스패치하며, 이 목록은 두 네트워크 모두 비어 있습니다. 체인 업그레이드로 활성화되기 전까지 이 주소들을 호출하면 성공하고 빈 데이터(0x)를 반환합니다. 리버트하지도, 오류를 반환하지도 않습니다. 이 중 어느 것이든 의존하기 전에 네트워크 상태를 확인하세요.

네트워크 상태​

프리컴파일주소qorechain-vladi (메인넷)qorechain-diana (테스트넷)
PQC Verify0x…0A01비활성비활성
PQC Key Status0x…0A02비활성비활성
AI Risk Score0x…0B01비활성비활성
AI Anomaly Check0x…0B02비활성비활성
PRISM Consensus Params0x…0C01비활성비활성
CrossVM Bridge0x…0901비활성비활성

활성화에는 체인 업그레이드가 필요하며 단계적으로 진행될 예정입니다. 읽기 전용인 PQC 및 합의 프리컴파일이 먼저, AI 2종은 읽기 전용 고정소수점 경로가 갖춰진 뒤에, CrossVM 브리지는 저널링, 값 검사, 크로스 VM 서킷 브레이커와 함께 재구축된 이후에만 활성화됩니다. 이 표는 이들 중 어느 것이든 활성화하는 업그레이드와 같은 작업에서 갱신됩니다.

현재 목록을 직접 확인하세요 (비어 있으면 활성화된 것이 없음).

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

빈 반환 데이터에 대비하기​

비활성(또는 QoreChain이 아닌) 주소는 데이터 없이 성공을 반환하므로, 길이를 확인하지 않고 저수준 호출의 원시 반환 바이트를 읽어서는 안 됩니다. abi.decode와 타입이 지정된 인터페이스 호출은 빈 데이터에서 리버트하며 이는 안전한 결과입니다. 직접 작성한 저수준 호출은 이를 명시적으로 확인해야 합니다.

(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));

이 주소들로 가치를 보내지 마세요. payable이 아니며, 비활성 프리컴파일 주소로 보낸 가치는 그곳에 남아 복구할 방법이 없습니다.


프리컴파일 주소 맵​

가스 수치는 프리컴파일이 활성화된 후 노드가 부과하는 값입니다 (바이트당은 호출 입력 바이트당을 의미합니다).

프리컴파일주소기본 가스설명
CrossVM Bridge0x000000000000000000000000000000000000090150,000 + 바이트당 4동기식 크로스 VM 호출(EVM에서 CosmWasm으로)
PQC Verify0x0000000000000000000000000000000000000A0125,000 + 바이트당 8ML-DSA-87 포스트 퀀텀 서명 검증
PQC Key Status0x0000000000000000000000000000000000000A022,500계정에 등록된 PQC 키가 있는지 확인
AI Risk Score0x0000000000000000000000000000000000000B0150,000트랜잭션 데이터에 대한 AI 생성 리스크 스코어 조회
AI Anomaly Check0x0000000000000000000000000000000000000B0240,000전송이 이상 거래로 플래그되는지 확인
PRISM Consensus Params0x0000000000000000000000000000000000000C011,500현재 PRISM 튜닝 합의 파라미터 조회

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
);
}

사용 예제​

PQC Verify — 포스트 퀀텀 서명 검증​

// 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");
}
}

가스 비용: 기본 25,000 + 입력 데이터 바이트당 8 가스. 입력은 ABI 인코딩된 호출(공개 키 2592 바이트, 서명 4627 바이트, 메시지, 그리고 ABI 오프셋과 패딩)이므로, 일반적인 ML-DSA-87 검증은 대략 85,000~90,000 가스가 소요됩니다.

PQC Key Status — 계정 등록 여부 확인​

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");
}
}

가스 비용: 정액 2,500.

AI Risk Score — 트랜잭션 리스크 평가​

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...
}
}

리스크 레벨:

레벨값
SAFE0
LOW1
MEDIUM2
HIGH3
CRITICAL4

레벨은 AI 엔진이 해당 트랜잭션에 부여한 심각도 레이블에서 나오며, 스코어는 베이시스 포인트(0 - 10000)로 반환됩니다. 스코어 범위에서 레벨로의 고정된 매핑은 없으므로, 스코어 임계값이 아니라 level을 기준으로 게이팅하세요.

가스 비용: 정액 50,000.

AI Anomaly Check — 의심스러운 전송 플래그 처리​

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");
}
}
}

가스 비용: 정액 40,000.

PRISM Consensus Params — 합의 상태 조회​

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;
}
}

가스 비용: 정액 1,500.

노트

현재 노드 빌드에서 rlConsensusParams는 라이브 PRISM 튜닝 값이 아닌 고정된 플레이스홀더 기본값을 반환합니다 (예를 들어 측정된 블록 시간, 즉 메인넷에서 약 3.2초, 테스트넷에서 약 1.0초를 보고하지 않습니다). 이를 라이브 합의 파라미터에 연결하는 것은 활성화 작업의 일부입니다.

CrossVM Bridge — EVM에서 CosmWasm 호출​

경고

CrossVM 브리지 프리컴파일은 현재 형태로는 활성화되지 않을 것입니다. 호출하는 컨트랙트의 리버트가 CosmWasm 쪽도 함께 되돌리고, 값 전송은 거부되며, EVM-to-EVM 재진입은 거절되고, 크로스 VM 서킷 브레이커가 적용되도록 재구축 중입니다. 그때까지는 동기식 EVM-to-CosmWasm 경로가 없습니다. MsgCrossVMCall 메시지 경로는 크로스 VM 상호운용성을 참고하세요. 이 경로 자체도 현재 메인넷에서는 꺼져 있습니다.

노드는 calldata를 executeCrossVMCall(uint8 targetVM, string targetContract, bytes payload)로 디코딩합니다 (4바이트 셀렉터 다음에 ABI 인코딩된 인자). 문서화된 용도는 EVM에서 CosmWasm으로의 호출이며, 재구축에 따라 ABI가 변경될 수 있습니다.

가스 비용: 기본 50,000 + 입력 바이트당 4 가스, 여기에 대상 컨트랙트 실행 비용이 더해집니다. 자세한 내용은 크로스 VM 상호운용성을 참고하세요.


인터페이스 파일 위치​

Solidity 인터페이스 파일은 직접 임포트할 수 있도록 저장소에 제공됩니다.

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

Hardhat 또는 Foundry 프로젝트에 다음과 같이 설치하세요.

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

또는 Solidity 파일에서 임포트 경로를 통해 참조하세요.

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

다음 단계​