我调 Dusk 索引器时踩过一个坑:让 transaction ID 与 contract ID 共用一个 hash 函数。区块哈希和 Merkle root 用 SHA3-256;合约 bytecode 与 event bloom filter 用 BLAKE3;contract ID 和 transaction ID 用 BLAKE2b;钱包完整性与密钥派生用 SHA2-256。
这像档案馆的四枚印章。入库章、合同章和取件章都能压出编号,可登记系统只认指定那枚。算法选错,输出照样像正常哈希,节点却找不到对应对象。另一个坑是把十六进制展示字符串再 hash 一次,协议接口通常吃原始 bytes;编码多绕一步,结果就全变了。
所以我接入时会保留原始字节,用官方 SDK 或 Rusk 生成 ID,再拿已知区块、交易和合约做测试向量。@Dusk Dusk 文档也建议少重复实现协议编码。多种算法把职责分开,也把版本、字节序和输入格式变成验收项。能生成一串长度正确的字符,只说明函数跑完了,链上身份还得反查确认#dusk $DUSK
这像档案馆的四枚印章。入库章、合同章和取件章都能压出编号,可登记系统只认指定那枚。算法选错,输出照样像正常哈希,节点却找不到对应对象。另一个坑是把十六进制展示字符串再 hash 一次,协议接口通常吃原始 bytes;编码多绕一步,结果就全变了。
所以我接入时会保留原始字节,用官方 SDK 或 Rusk 生成 ID,再拿已知区块、交易和合约做测试向量。@Dusk Dusk 文档也建议少重复实现协议编码。多种算法把职责分开,也把版本、字节序和输入格式变成验收项。能生成一串长度正确的字符,只说明函数跑完了,链上身份还得反查确认#dusk $DUSK