如何在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
相关产品推荐
相关产品推荐

