IBC v2 与分片
IBC v2 实验性
NeuroChain 通过 IBC v2 与其他链互联——这是跨链通信协议(Inter-Blockchain Communication)经过简化、以客户端为中心的版本(也称 Eureka)。第一个对手链是 Cosmos 生态,从 Neutron(CosmWasm)开始。
NeuroChain 带来的是后量子互操作性:它的提交使用 ML-DSA-65 签名,因此对手链的轻客户端以后量子签名验证 NeuroChain,而不是依赖经典 IBC 所用的 ECDSA / Ed25519 方案。
通道上传输的内容
| 数据包 | 线上格式 | 用途 |
|---|---|---|
| 同质化转账 | `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 凭证,其 denom 为
ibc/<SHA-256 of the trace path>,与 ibc-go 的做法一致。同一个数据包 ID 只能被接收一次。 POST /api/v1/ibc/redeem销毁凭证,并通过通道把资产送回。
线上传输的金额是以基础 denom 计的整数(NRO 的基础 denom 为 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 测试网的端到端转账 | 尚未完成——部署脚本已就绪(tools/ibc-relayer/deploy_neutron.js),需要一个有资金的测试网账户 |
| 与 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=<operator ML-DSA-65 public key 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/neurochain- 未设置
NEUROCHAIN_SHARD_ID时,节点只运行单个分片,不会产生跨分片转账。 - Gateway 会把每笔交易路由到发送方所在分片的节点。
- 用
GET /api/v1/cross-shard/queue?status=locked监控中继,用GET /api/v1/shards监控各分片高度。
在内部,跨分片中继与 IBC v2 使用同一个数据包引擎——分片是一种通道端,外部链是另一种。