You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义交易处理器未接收REST API提交请求的排查求助

问题分析与修复方案

我一眼就看到了代码里的核心问题——你用错了Protobuf的序列化方式,这直接导致REST API虽然返回202,但实际并没有把有效的交易批处理传递给验证器。

核心错误:错误的BatchList序列化

你当前用batchList.String()来序列化交易批处理,这个方法返回的是Protobuf对象的人类可读调试字符串,而不是REST API要求的二进制Protobuf格式。验证器根本无法解析这种字符串格式的请求,自然不会处理你的交易。

修复步骤

  1. 导入Protobuf序列化包:在代码顶部添加导入:
import "github.com/golang/protobuf/proto"
  1. 替换序列化逻辑:把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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:18:19