Skip to content

IBC v2 与分片 ​

IBC v2 实验性 ​

NeuroChain 通过 IBC v2 与其他链互联——这是跨链通信协议(Inter-Blockchain Communication)经过简化、以客户端为中心的版本(也称 Eureka)。第一个对手链是 Cosmos 生态,从 Neutron(CosmWasm)开始。

NeuroChain 带来的是后量子互操作性:它的提交使用 ML-DSA-65 签名,因此对手链的轻客户端以后量子签名验证 NeuroChain,而不是依赖经典 IBC 所用的 ECDSA / Ed25519 方案。

通道上传输的内容 ​

数据包线上格式用途
同质化转账`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 凭证,其 denom 为 ibc/<SHA-256 of the trace path>,与 ibc-go 的做法一致。同一个数据包 ID 只能被接收一次。
  3. 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 返回固定的提交头、密钥和签名,让对手链实现能够检查自己编码和验证的是完全相同的字节。

运行中继器(实验环境) ​

bash
# 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_HEADERmainnet 上开启入站数据包必须附带经过验证的提交头
NEUROCHAIN_IBC_REQUIRE_PACKET_COMMITMENTmainnet 上开启入站数据包必须携带覆盖其字段的承诺
NEUROCHAIN_IBC_TIMEOUT_BLOCKS10未确认的出站数据包被退款前的区块数
NEUROCHAIN_IBC_MAX_PACKET_UNRO无限制单笔转账上限
NEUROCHAIN_IBC_MAX_CHANNEL_ESCROW_UNRO无限制单个通道可托管的最大金额
NEUROCHAIN_IBC_NATIVE_DENOMunroNRO 在线上传输时的基础 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 使用同一个数据包引擎——分片是一种通道端,外部链是另一种。