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

如何在Web3j中向合约构造函数传递bytes类型参数

Web3j中正确传递bytes类型参数到合约构造函数的方法

问题背景

我要部署一个代理合约,其构造函数定义如下:

constructor(address beacon, bytes memory data,string memory assetId)

需要传入的参数:

  • beacon:0xa7cF300E62EA5c7eA611e71Fb30A41182AC3ACDD
  • data:0x000000000000000000000000a7cf300e
  • assetId:"1"

我编写的Web3j代码:

FunctionEncoder.encodeConstructor(
        Arrays.asList(
                new Address(beaconAddress),
                new DynamicBytes("0x000000000000000000000000a7cf300e".getBytes()),
                new Utf8String("1")));

编码结果对比

理想的编码输出:

000000000000000000000000a7cf300e62ea5c7ea611e71fb30a41182ac3acdd000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000a7cf300e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013100000000000000000000000000000000000000000000000000000000000000

实际得到的输出:

000000000000000000000000a7cf300e62ea5c7ea611e71fb30a41182ac3acdd000000000000000000000000000000000000000000000000000000
000000006000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000223078303030303030303030303030303030303030303030303030613763663330306500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013100000000000000000000000000000000000000000000000000000000000000

问题根源是data参数被错误转换为字符串本身的ASCII字节,而非十六进制字符串对应的原始字节。


正确实现方式

Web3j提供了Hex工具类用于解析十六进制字符串为原始字节数组,修正后的代码如下:

import org.web3j.utils.Hex;

// ...

FunctionEncoder.encodeConstructor(
        Arrays.asList(
                new Address(beaconAddress),
                // 去掉0x前缀后解析十六进制字符串为字节数组
                new DynamicBytes(Hex.decode("0x000000000000000000000000a7cf300e".substring(2))),
                new Utf8String("1")));

如果你的十六进制字符串不带0x前缀,可直接传入:

new DynamicBytes(Hex.decode("000000000000000000000000a7cf300e"))

关键说明

  • Hex.decode()方法会将十六进制字符串转换为对应的原始字节数组,例如0xa7cf300e会被解析为[0xa7, 0xcf, 0x30, 0x0e],而非字符串"0xa7cf300e"的ASCII字节。
  • 若十六进制字符串以0x开头,必须先移除前缀再调用Hex.decode(),否则会触发解析错误。

内容的提问来源于stack exchange,提问作者Senuda Jayalath

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 20:35:45