自定义交易处理器未接收REST API提交请求的排查求助
问题分析与修复方案
我一眼就看到了代码里的核心问题——你用错了Protobuf的序列化方式,这直接导致REST API虽然返回202,但实际并没有把有效的交易批处理传递给验证器。
核心错误:错误的BatchList序列化
你当前用batchList.String()来序列化交易批处理,这个方法返回的是Protobuf对象的人类可读调试字符串,而不是REST API要求的二进制Protobuf格式。验证器根本无法解析这种字符串格式的请求,自然不会处理你的交易。
修复步骤
- 导入Protobuf序列化包:在代码顶部添加导入:
import "github.com/golang/protobuf/proto"
- 替换序列化逻辑:把
serialised := batchList.String()替换成真正的二进制序列化代码:
serialised, err := proto.Marshal(batchList) if err != nil { log.Fatalf("Failed to serialize batch list: %v", err) }
其他需要修复的潜在问题
除了核心的序列化错误,还有几个小问题会导致交易即使被接收也无法正常处理:
- 签名截断错误:在
BuildTransaction和BuildBatch里,你把签名截断成了前64位headerSig[:64]。Sawtooth的secp256k1签名是完整的128字符(64字节)Hex字符串,截断后签名会失效,验证器会拒绝这个交易。直接用完整的headerSig即可。 - Payload编码冗余:你把payload做了base64编码,但XO示例的交易处理器期望的是原始的逗号分隔字符串(比如
"testing_new,create,"),不需要额外编码。去掉base64编码步骤,直接使用原始字符串作为payload即可。 - 未完成的Nonce函数:你的
GenerateNonce函数代码被截断了,确保它能生成有效的随机字符串(比如补全randStringBytesMaskImprSrc的实现)。
验证修复效果
修复后重新编译运行客户端:
- 检查返回的响应体,里面的
link字段应该包含有效的batch ID。 - 查看验证器日志,应该能看到batch被接收、验证和提交的记录。
- 查看XO交易处理器的日志,确认
Apply方法被正常触发。
内容的提问来源于stack exchange,提问作者danielcooperxyz
相关产品推荐
相关产品推荐

