Tendermint交易查询返回tx字段解码结果乱码问题求助
解决Tendermint交易tx字段解码乱码问题
别担心,这个乱码问题其实很好解决!核心原因是你拿到的tx字段不是普通的文本Base64,而是Protobuf序列化后的二进制数据再经过Base64编码的结果——直接把它解码成字符串,自然会出现乱码,因为二进制里包含大量不可打印的字符。下面给你两种可行的解决方法:
方法一:用代码解析(以Python为例)
步骤1:准备依赖
先安装必要的库:
pip install base64 protobuf
步骤2:获取Tendermint的Protobuf定义
你需要用到Tendermint官方的Protobuf结构定义,主要是交易相关的tx.proto文件(可以从Tendermint官方仓库获取对应版本的文件),然后用protoc编译成Python类。比如编译命令:
protoc --python_out=. ./tendermint/types/tx.proto
步骤3:解码并解析交易
import base64 # 导入编译好的Protobuf类(路径根据你的实际情况调整) from tendermint.types_pb2 import Tx # 你的tx Base64字符串 tx_base64 = 'AAABF3siZnJvbSI6eyJhbW91bnQiOjEwMCwicHVia2V5IjoiOmJhc2U2NDpBNmZUNjFvRnlLNG1HZExnd21xSU5ubE55c1NIQ1BDRm9vb2Jod1BTamY2UCIsInNlcXVlbmNlIjowLCJzaWduYXR1cmUiOiI6YmFzZTY0OjFGdmZvZUlLTWlDd1A2NE9IVHd2MHhjeGk3elVBRUNRTkc1NnpnR1lYdkV2UEMvallTcG...' # 1. 先把Base64解码成二进制字节流 tx_bytes = base64.b64decode(tx_base64) # 2. 用Protobuf反序列化得到可读的交易对象 tx = Tx.FromString(tx_bytes) # 现在就能正常访问交易的各个字段了 print("交易内容:", tx)
方法二:用Tendermint CLI/protoc工具直接解码
如果你不想写代码,可以用命令行工具快速解码:
- 先下载对应版本的
tx.proto文件到本地 - 执行以下命令(替换成你的tx字符串和proto文件路径):
echo "AAABF3siZnJvbSI6eyJhbW91bnQiOjEwMCwicHVia2V5IjoiOmJhc2U2NDpBNmZUNjFvRnlLNG1HZExnd21xSU5ubE55c1NIQ1BDRm9vb2Jod1BTamY2UCIsInNlcXVlbmNlIjowLCJzaWduYXR1cmUiOiI6YmFzZTY0OjFGdmZvZUlLTWlDd1A2NE9IVHd2MHhjeGk3elVBRUNRTkc1NnpnR1lYdkV2UEMvallTcG..." | base64 -d | protoc --decode=tendermint.types.Tx ./tendermint/types/tx.proto
执行后就能直接看到解析后的可读交易内容了。
总结一下:Tendermint的tx字段是二进制Protobuf的Base64编码,不是文本编码,所以必须先解码成二进制,再用Protobuf结构解析才能得到正常的交易内容,直接转字符串肯定会乱码~
内容的提问来源于stack exchange,提问作者shapeare
相关产品推荐
相关产品推荐

