Arbitrum调用getBlockByNumber报transaction type not supported问题求助
解决Arbitrum网络
transaction type not supported错误的方法 核心原因
Arbitrum网络支持EIP-1559(动态手续费)等较新的交易类型,你当前使用的ethclient依赖的go-ethereum版本过低,无法解析这些新类型交易,因此触发报错。
具体修复步骤
升级go-ethereum相关依赖
执行命令更新到最新稳定版:go get github.com/ethereum/go-ethereum@latest再整理依赖:
go mod tidy验证兼容性
升级后,types.Block和types.Transaction结构会默认支持EIP-1559等新交易类型,调用BlockByNumber即可正常解析Arbitrum区块中的交易。可选:手动注册交易类型(升级后仍异常时)
若升级后仍有问题,可手动注册交易类型解析器(新版本通常已默认支持,此为兜底方案):import ( "github.com/ethereum/go-ethereum/core/types" ) func init() { // 注册EIP-1559动态手续费交易类型 types.RegisterTransactionType(types.DynamicFeeTxType, func() types.TxData { return new(types.DynamicFeeTx) }) }
代码优化建议
原代码每次调用都重新创建客户端连接,建议将ethclient.Client作为BlockManager的成员变量初始化一次,提升性能:
type BlockManager struct { Block *big.Int Log log.Logger Client *ethclient.Client // 新增客户端成员 } // 初始化BlockManager时创建客户端 func NewBlockManager() *BlockManager { client, err := ethclient.Dial("https://go.getblock.io/b3d301d") if err != nil { log.Fatal(err) } return &BlockManager{ Client: client, // 其他字段初始化 } } func (bn *BlockManager) getTrxByBlockNumber() *types.Transactions { op := "decoder.tx.GetTransactionsByBlockNumber " var block *types.Block var err error for { block, err = bn.Client.BlockByNumber( context.Background(), bn.Block, ) if err == nil { break } fmt.Println(err) bn.Log.Info(op + "Switch web3 client") // 可添加备用节点切换逻辑,避免重复重试同一节点 } transactions := block.Transactions() return &transactions }
内容的提问来源于stack exchange,提问作者Maksim Smolovsky
相关产品推荐
相关产品推荐

