Skip to content

IBC v2와 샤딩 ​

IBC v2 실험적 ​

NeuroChain은 IBC v2 — Inter-Blockchain Communication 프로토콜의 단순화된 클라이언트 중심 버전(Eureka라고도 함) — 로 다른 체인과 연결됩니다. 첫 번째 상대 체인은 Cosmos 생태계이며, Neutron(CosmWasm)부터 시작합니다.

NeuroChain이 더하는 것은 양자 내성 상호 운용성입니다: 커밋이 ML-DSA-65로 서명되므로, 상대 체인의 라이트 클라이언트는 기존 IBC가 의존하는 ECDSA / Ed25519 방식 대신 양자 내성 서명으로 NeuroChain을 검증합니다.

채널로 전달되는 것 ​

패킷와이어 형식목적
대체 가능 토큰 전송`nc-ics20-v1denom
보안 증명`nc-ibc-attest-v1bytecode_hash
커밋 헤더`nc-pq-lc-v1chain_id

증명 패킷은 두 가지 핵심 방향이 만나는 지점입니다: NeuroChain에서 생성되어 다른 체인이 신뢰할 수 있는 AI 보안 증명입니다.

토큰 전송 ​

IBC v2 전송: 사용자가 ibc_transfer에 서명하고, 검증자가 채널 에스크로에 NRO를 잠그며, 1 000블록마다 커밋 헤더에 서명합니다. 릴레이어가 헤더를 가져와 상대 체인 클라이언트를 업데이트하고 패킷을 전달하면, 상대 체인이 바우처를 발행합니다. 릴레이어가 확인 응답을 보내면 에스크로가 소각되며, 타임아웃 전에 확인 응답이 없으면 발신자에게 환불됩니다

아웃바운드(NeuroChain → 상대 체인)

  1. POST /api/v1/ibc/transfer는 금액을 채널의 에스크로 계정 neuro:ibc.escrow.<channel>에 잠그며, 패킷은 locked 상태가 됩니다.
  2. 릴레이어가 패킷을 전달하고, 상대 체인이 바우처를 발행합니다.
  3. POST /api/v1/ibc/ack는 패킷을 committed로 표시하고 에스크로를 소각합니다.
  4. 타임아웃 내에 확인 응답이 없으면 → 발신자에게 자동으로 환불됩니다.

인바운드(상대 체인 → NeuroChain)

  1. 릴레이어가 패킷과 그 커밋먼트를 담아 POST /api/v1/ibc/recv를 제출합니다.
  2. 수신자에게 ibc-go와 같은 방식으로 denom이 ibc/<SHA-256 of the trace path>인 IBC 바우처가 입금됩니다. 하나의 패킷 id는 한 번만 수신할 수 있습니다.
  3. POST /api/v1/ibc/redeem은 바우처를 소각하고 자산을 채널을 통해 되돌려 보냅니다.

와이어상의 금액은 기본 denom(NRO의 경우 unro) 단위의 정수입니다.

누가 무엇에 서명하는가 ​

작업제출 가능 주체서명
transfer, redeem모든 계정, 자신의 자금에 한함모든 필드 — 수신자, 채널, 체인, denom, 금액 — 를 포함
recv, ack, channel/open, channel/pause, client/update, attestIBC 운영자만: 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는 고정된 헤더, 키, 서명을 반환하므로 상대 체인 구현이 같은 바이트를 인코딩하고 검증하는지 확인할 수 있습니다.

릴레이어 실행(실험 환경) ​

bash
# 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_HEADERmainnet에서 켜짐인바운드 패킷에는 검증된 헤더가 함께 있어야 합니다
NEUROCHAIN_IBC_REQUIRE_PACKET_COMMITMENTmainnet에서 켜짐인바운드 패킷은 자신의 필드에 대한 커밋먼트를 포함해야 합니다
NEUROCHAIN_IBC_TIMEOUT_BLOCKS10확인 응답이 없는 아웃바운드 패킷이 환불되기까지의 블록 수
NEUROCHAIN_IBC_MAX_PACKET_UNRO제한 없음단일 전송의 최대 금액
NEUROCHAIN_IBC_MAX_CHANNEL_ESCROW_UNRO제한 없음한 채널이 에스크로에 보관할 수 있는 최대 금액
NEUROCHAIN_IBC_NATIVE_DENOMunro와이어상의 NRO 기본 denom

샤딩 실험적 ​

각 샤드는 자체 검증자와 높이를 가진 독립적인 합의 인스턴스를 실행하며, 계정은 FNV-1a(address) mod n_shards 샤드에 속합니다. 샤드 간 전송이 정산되는 방식은 합의 → 샤딩에 설명되어 있습니다.

샤드마다 노드를 하나씩 실행합니다:

bash
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/neurochain
  • NEUROCHAIN_SHARD_ID가 없으면 노드는 단일 샤드로 실행되며 샤드 간 전송을 만들지 않습니다.
  • Gateway는 각 트랜잭션을 발신자 샤드의 노드로 라우팅합니다.
  • 중계는 GET /api/v1/cross-shard/queue?status=locked로, 샤드별 높이는 GET /api/v1/shards로 모니터링하십시오.

내부적으로 샤드 간 중계는 IBC v2와 같은 패킷 엔진을 사용합니다 — 샤드는 채널 끝의 한 종류이고, 외부 체인은 또 다른 종류입니다.