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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 08:42:08