IBC v2와 샤딩
IBC v2 실험적
NeuroChain은 IBC v2 — Inter-Blockchain Communication 프로토콜의 단순화된 클라이언트 중심 버전(Eureka라고도 함) — 로 다른 체인과 연결됩니다. 첫 번째 상대 체인은 Cosmos 생태계이며, Neutron(CosmWasm)부터 시작합니다.
NeuroChain이 더하는 것은 양자 내성 상호 운용성입니다: 커밋이 ML-DSA-65로 서명되므로, 상대 체인의 라이트 클라이언트는 기존 IBC가 의존하는 ECDSA / Ed25519 방식 대신 양자 내성 서명으로 NeuroChain을 검증합니다.
채널로 전달되는 것
| 패킷 | 와이어 형식 | 목적 |
|---|---|---|
| 대체 가능 토큰 전송 | `nc-ics20-v1 | denom |
| 보안 증명 | `nc-ibc-attest-v1 | bytecode_hash |
| 커밋 헤더 | `nc-pq-lc-v1 | chain_id |
증명 패킷은 두 가지 핵심 방향이 만나는 지점입니다: NeuroChain에서 생성되어 다른 체인이 신뢰할 수 있는 AI 보안 증명입니다.
토큰 전송
아웃바운드(NeuroChain → 상대 체인)
POST /api/v1/ibc/transfer는 금액을 채널의 에스크로 계정neuro:ibc.escrow.<channel>에 잠그며, 패킷은locked상태가 됩니다.- 릴레이어가 패킷을 전달하고, 상대 체인이 바우처를 발행합니다.
POST /api/v1/ibc/ack는 패킷을committed로 표시하고 에스크로를 소각합니다.- 타임아웃 내에 확인 응답이 없으면 → 발신자에게 자동으로 환불됩니다.
인바운드(상대 체인 → NeuroChain)
- 릴레이어가 패킷과 그 커밋먼트를 담아
POST /api/v1/ibc/recv를 제출합니다. - 수신자에게 ibc-go와 같은 방식으로 denom이
ibc/<SHA-256 of the trace path>인 IBC 바우처가 입금됩니다. 하나의 패킷 id는 한 번만 수신할 수 있습니다. POST /api/v1/ibc/redeem은 바우처를 소각하고 자산을 채널을 통해 되돌려 보냅니다.
와이어상의 금액은 기본 denom(NRO의 경우 unro) 단위의 정수입니다.
누가 무엇에 서명하는가
| 작업 | 제출 가능 주체 | 서명 |
|---|---|---|
transfer, redeem | 모든 계정, 자신의 자금에 한함 | 모든 필드 — 수신자, 채널, 체인, denom, 금액 — 를 포함 |
recv, ack, channel/open, channel/pause, client/update, attest | IBC 운영자만: NEUROCHAIN_IBC_OPERATOR_PUBKEYS에 나열된 키 | 위와 같으며, 운영자의 키로 서명 |
권한은 주장된 주소가 아니라 운영자의 공개 키에 있습니다. 모든 IBC 작업은 합의에서 적용되며 neuro:system.ibc에 대해 서명합니다.
현재 상태와 한계
| 구성 요소 | 상태 |
|---|---|
| 에스크로, 바우처, denom 추적, 타임아웃, 패킷 레코드 | 노드에 구현됨, 단위 테스트 완료 |
| 1 000블록마다 서명되는 PQ 커밋 헤더 | 구현됨. GET /api/v1/ibc/header/latest에서 제공 |
| 모든 IBC 작업의 필드 바인딩 서명 | 구현됨, 골든 테스트 벡터 포함 |
상대 체인 컨트랙트 neuro-pq-client(CosmWasm) | 빌드됨(neurochain/contracts/neuro_pq_client). 아직 무신뢰가 아님: 릴레이어의 신뢰 키와 증가하는 높이를 확인하며, ML-DSA-65 서명은 릴레이어가 오프체인에서 검증합니다 |
| 인바운드 패킷 | 입금 필드에 대한 커밋먼트와 함께 IBC 운영자로부터 수락됨. 상대 체인의 Merkle 멤버십 증명은 제안되었으나 구현되지 않음 |
| Neutron testnet과의 종단 간 전송 | 아직 완료되지 않음 — 배포 스크립트는 준비되어 있으며(tools/ibc-relayer/deploy_neutron.js), 자금이 있는 testnet 계정이 필요합니다 |
| ibc-go와의 전체 IBC v2 핸드셰이크 | 계획됨 |
상대 체인이 온체인에서 ML-DSA-65를 검증하기 전까지 IBC 채널은 릴레이어를 신뢰합니다. 실제 가치가 있는 네트워크에서는 NEUROCHAIN_IBC_MAX_PACKET_UNRO와 NEUROCHAIN_IBC_MAX_CHANNEL_ESCROW_UNRO를 낮게 유지하십시오.
테스트 방법: 노드 단위 테스트는 잠금, 확인 응답, 타임아웃 환불, 바우처 입금과 상환, 중복 패킷, 예약된 패킷 id, 커밋먼트 불일치, 운영자 권한, 정규 서명 메시지를 다룹니다(cargo test -p neurochain-node ibc). GET /api/v1/ibc/pq/test-vector는 고정된 헤더, 키, 서명을 반환하므로 상대 체인 구현이 같은 바이트를 인코딩하고 검증하는지 확인할 수 있습니다.
릴레이어 실행(실험 환경)
# 1. 운영자 키를 허용한 상태로 노드를 시작
NEUROCHAIN_IBC_OPERATOR_PUBKEYS=<운영자 ML-DSA-65 공개 키, hex> ./target/debug/neurochain
# 2. 채널 열기(운영자가 서명)
# POST /api/v1/ibc/channel/open { from, channel, port, counterparty_chain, allowed_denoms, … }
# 3. 체크포인트 후, 상대 체인 클라이언트용 헤더를 내보내기
NODE_RPC=http://localhost:9933 node neurochain/tools/ibc-relayer/export_update_client.js스크립트는 neuro-pq-client용 UpdateClient 메시지를 출력합니다. 모든 IBC 엔드포인트의 요청 필드는 REST 레퍼런스에 있습니다.
구성
| 변수 | 기본값 | 의미 |
|---|---|---|
NEUROCHAIN_IBC_OPERATOR_PUBKEYS | 비어 있음 | 중계와 채널 관리가 허용되는 공개 키(쉼표로 구분) |
NEUROCHAIN_IBC_TRUSTED_PUBKEYS | 비어 있음 | 인바운드 패킷에서 헤더 서명이 수락되는 ML-DSA-65 키. 비어 있으면 유효한 서명은 모두 수락합니다(실험 환경 전용) |
NEUROCHAIN_IBC_REQUIRE_HEADER | mainnet에서 켜짐 | 인바운드 패킷에는 검증된 헤더가 함께 있어야 합니다 |
NEUROCHAIN_IBC_REQUIRE_PACKET_COMMITMENT | mainnet에서 켜짐 | 인바운드 패킷은 자신의 필드에 대한 커밋먼트를 포함해야 합니다 |
NEUROCHAIN_IBC_TIMEOUT_BLOCKS | 10 | 확인 응답이 없는 아웃바운드 패킷이 환불되기까지의 블록 수 |
NEUROCHAIN_IBC_MAX_PACKET_UNRO | 제한 없음 | 단일 전송의 최대 금액 |
NEUROCHAIN_IBC_MAX_CHANNEL_ESCROW_UNRO | 제한 없음 | 한 채널이 에스크로에 보관할 수 있는 최대 금액 |
NEUROCHAIN_IBC_NATIVE_DENOM | unro | 와이어상의 NRO 기본 denom |
샤딩 실험적
각 샤드는 자체 검증자와 높이를 가진 독립적인 합의 인스턴스를 실행하며, 계정은 FNV-1a(address) mod n_shards 샤드에 속합니다. 샤드 간 전송이 정산되는 방식은 합의 → 샤딩에 설명되어 있습니다.
샤드마다 노드를 하나씩 실행합니다:
NEUROCHAIN_SHARDS=4 NEUROCHAIN_SHARD_ID=0 NEUROCHAIN_DATA_DIR=./data-s0 NEUROCHAIN_RPC_PORT=9933 … ./target/debug/neurochain
NEUROCHAIN_SHARDS=4 NEUROCHAIN_SHARD_ID=1 NEUROCHAIN_DATA_DIR=./data-s1 NEUROCHAIN_RPC_PORT=9934 … ./target/debug/neurochainNEUROCHAIN_SHARD_ID가 없으면 노드는 단일 샤드로 실행되며 샤드 간 전송을 만들지 않습니다.- Gateway는 각 트랜잭션을 발신자 샤드의 노드로 라우팅합니다.
- 중계는
GET /api/v1/cross-shard/queue?status=locked로, 샤드별 높이는GET /api/v1/shards로 모니터링하십시오.
내부적으로 샤드 간 중계는 IBC v2와 같은 패킷 엔진을 사용합니다 — 샤드는 채널 끝의 한 종류이고, 외부 체인은 또 다른 종류입니다.