Skip to content

VMGuardian ​

VMGuardian은 WebAssembly 바이트코드를 감사합니다. 같은 코드로 세 곳에서 실행되므로, 컨트랙트는 어디서나 같은 점수를 받습니다.

위치시점
브라우저(WASM 모듈)배포를 보내기 전, 즉시
모든 검증자, 합의 과정에서모든 배포 트랜잭션마다 — 게이트
모든 노드, 백그라운드에서배포된 모든 컨트랙트에 대해 지속적으로

점수가 만들어지는 방식 ​

1. 규칙(휴리스틱) ​

분석기는 코드 섹션을 명령어 단위로 디코딩하고(한 번의 선형 패스이므로 512 KiB 컨트랙트도 빠르게 분석됩니다) 다섯 가지 패턴을 검사합니다. 일치할 때마다 위험도가 더해지며, 합계는 1.0으로 제한됩니다.

규칙심각도가산발동 조건
reentrancy치명적0.40동적 call_indirect 뒤에 스토리지 쓰기가 이어짐
uncapped_loop치명적0.35빠져나가는 조건 분기가 없는 루프
unbounded_memory경고0.20memory.grow 명령어가 8개 초과
unchecked_call경고0.15결과를 버리는 호출
large_import_surface정보0.10import한 host 함수가 20개 초과

0.5 미만의 점수는 safe로 보고됩니다.

2. 신경망 ​

작은 내장 신경망(입력 10 → 32 → 16 → 1, 파라미터 897개)이 같은 바이트코드를 열 가지 특징으로 평가합니다: 제한 없는 루프의 비율, 재진입 패턴, 결과를 버리는 호출, memory.grow·import·간접 호출·저장·루프·산술 연산의 밀도, 그리고 코드 크기. ML 런타임 없이 노드 안에서 실행됩니다.

3. 혼합 ​

if |network − rules| > 0.25:   risk = rules                 (model: "heuristic")
else:                          risk = 0.3 × network + 0.7 × rules   (model: "ml+heuristic")

신경망은 더 작은 가중치를 받으며, 규칙과 크게 어긋나면 무시됩니다 — 주로 합성 데이터와 공개 CosmWasm 체인의 실제 안전한 컨트랙트로 학습되었기 때문에, 더 신뢰하려면 실제 익스플로잇 데이터가 필요합니다.

어디서나 표시되는 보안 점수는 100 − risk × 100입니다.

배포 게이트 ​

모든 검증자가 각 배포 트랜잭션에 대해 게이트를 실행합니다 — 컨트랙트 배포를 참고하세요.

경우결과
바이트코드 해시가 신뢰 목록에 있음(NRC-20 같은 공식 템플릿)점수 100, 분석 없음
거버넌스로 게이트가 꺼짐(deploy_security_enabled = 0)중립 점수 70
risk ≥ deploy_risk_threshold(기본값 0.80)배포 실패, 수수료 없음; 위반 사항과 함께 로그 기록; nc_deploy_rejected_total에 집계
그 외해당 점수와 함께 컨트랙트 생성

직접 컨트랙트 확인하기 ​

bash
curl -s -X POST "$NODE_RPC/api/v1/contracts/analyze" \
  -H 'Content-Type: application/json' -d "{\"bytecode_hex\":\"$HEX\"}"
json
{
  "risk_score": 0,
  "security_score": 100,
  "safe": true,
  "ml_score": 0.439,
  "model": "heuristic",
  "violations": [],
  "gas_estimate": 34550
}

(여기서는 신경망이 0.44, 규칙이 0을 냈으므로 규칙만으로 결정되었습니다.)

gateway를 통해서는 같은 본문으로 POST /api/v1/contracts/audit를 사용하세요. gateway는 직접 컨트랙트 점수를 매기지 않으며, 노드로 전달하기만 합니다.

서명된 증명 ​

POST /api/v1/contracts/attest는 같은 분석을 실행하고 노드의 ML-DSA-65 키로 결과에 서명합니다.

json
{
  "score": 100,
  "risk_score": 0,
  "bytecode_hash": "18642df0…",
  "timestamp": 1791200887,
  "signature": "665a7ab2…",
  "pubkey": "6e80bab8…",
  "model": "heuristic",
  "ml_score": 0.439,
  "violations": []
}

서명되는 메시지는 "nc-attest|" ‖ score (4바이트, big-endian) ‖ SHA3-256(bytecode) (32바이트) ‖ timestamp (8바이트, big-endian)입니다. 브라우저는 지갑이 사용하는 것과 같은 WASM 모듈로 이를 검증하고, 배포 페이지는 증명된 점수를 표시합니다.

증명은 어느 노드가 점수를 계산했는지를 입증합니다. 노드를 신뢰하지 않고도 점수가 올바르게 계산되었음을 입증하는 것이 아래 ZKML 작업의 목표입니다.

인증서 ​

컨트랙트는 점수에 따라 온체인 보안 인증서를 받습니다.

등급점수
Gold90 이상
Silver75 – 89
Bronze75 미만

인증서는 제네시스에서 배포된 ncert.app 시스템 컨트랙트의 레코드이며, API용으로 색인됩니다: GET /api/v1/certificates, /certificates/:id, /certificates/contract/:address.

지속적 모니터링 ​

각 노드는 배포된 컨트랙트를 MONITOR_INTERVAL_SECS(20초)마다 다시 분석합니다. 점수가 MONITOR_SCORE_THRESHOLD(10)점 이상 변하면 — 보통 새 모델 버전이 활성화된 후 — 노드는 합의를 통해 인증서 업데이트를 발행하고, 오라클 로그에 score_degraded 또는 score_improved가 기록됩니다.

gateway는 그 위에 활동 알림을 추가합니다(WebSocket을 통한 contract_alert): 비정상적인 호출 급증, 그리고 낮은 점수의 컨트랙트가 호출되기 시작하는 경우.

모델 버전 ​

모델 가중치는 온체인에서 버전 관리되므로, 모든 검증자가 같은 모델을 실행합니다.

  1. 검증자가 새 버전을 등록합니다(POST /api/v1/models/register, 검증자 전용) — 2 000블록 동안 voting 상태가 됩니다.
  2. 다른 검증자들이 P2P로 가중치를 가져와 해시를 등록 내용과 대조한 뒤 확인합니다.
  3. 2f + 1 검증자의 확인을 받으면 버전이 active가 되어 이전 버전을 대체하고, 그렇지 못하면 기한에 rejected가 됩니다.

레지스트리: GET /api/v1/models/registry. Prometheus: nc_model_active_count, nc_model_voting_count, nc_model_version{…}.

검증 가능한 AI 실험적 ​

계획은 영지식 가상 머신(RISC Zero / SP1)으로 VMGuardian의 결과를 증명하는 것입니다. 즉 *이 점수가 체인이 승인한 가중치로 계산한 analyze_v2(bytecode)*라는 증명으로, 어떤 노드도 신뢰하지 않고 누구나 — 다른 체인을 포함해 — 확인할 수 있습니다. 모델이 충분히 작아서 이것이 실용적입니다.

테스트 방법: 설계와 prover 골격이 저장소에 있습니다(docs/zkml-poc.md, neurochain/zkml/). prover를 빌드하려면 RISC Zero / SP1 툴체인이 필요한데, 프로젝트의 빌드 환경에서는 아직 실행된 적이 없습니다. 온체인 검증은 아직 없습니다.

한계 ​

  • 합성 데이터와 실제 안전한 컨트랙트로만 학습되었습니다 — WASM의 실제 익스플로잇은 아직 보지 못했습니다.
  • 발견 항목의 바이트 오프셋과 사용자 정의 규칙 세트는 아직 제공되지 않습니다.
  • 깨끗한 점수는 알려진 위험 패턴이 발견되지 않았다는 뜻이지, 컨트랙트가 올바르다는 뜻이 아닙니다.