Transaction有几个重要字段,from, to, value, data(input)。
from: Transaction是由谁发起的。
to: Transaction发送到哪个地址。
value: Transaction发送的ETH数量。
data: 某些api中字段名字叫做input,含义都一样,代表这个Transaction附带的数据,通常是执行某些智能合约的命令。
let _data = '0x' + // 固定
// 代表调用合约 transfer 方法
'a9059cbb' +
// 参数1 收币 address 使用 '0' 补足 length 为 64 字符串
'000000000000000000000000' +
'ee37d06477a5a6733dcf032aeb7460f7e913efef' +
// 参数2 转币数量 用户输入单位为 ether 需要转换为 wei 再转换为16进制字符串
// 同样是使用 '0' 补位为 length 64 字符串
'000000000000000000000000000000000000000000000000000000000000' +
'2710'
let txObj = {
nonce: _nonce, // 此参数为当前账户交易次数统计
gasPrice: BigInt(28000), // gas 每单位价格
gasLimit: BigInt(100000), // 最高上限
to: '0xb2cf81e5ef5b3272fc6c014be41076b7baaab5d9', // 此处为 token 合约地址
value: '0x00',
data: _data
}
跟主链币的区别就是多了data参数的生成,详解data如何生成:
当我们调用transfer函数向某个地址发送N个ERC-20代币的时候,交易的input数据分为3个部分:
1.指令hash。
- 4 字节,是方法名的哈希:a9059cbb
回到ERC20的代码中,发送的函数如下,根据ABI编码的规则,我们要通过web3.sha3("transfer(address,uint256)")
方法计算得到值,取前4个字节(8个16进制数)得到Transaction中的指令hash。ERC20标准的transfer函数的指令hash前8字节为a9059cbb
。
2.接收账户。
- 32字节,放以太坊地址,目前以太坊地址是20个字节,高危补0
000000000000000000000000abcabcabcabcabcabcabcabcabcabcabcabcabca
通常的以太坊账户为20字节(40个16进制数)
,前面加上0x
。在data部分,需要将40个16进制数前面填充24个0,总共64个16进制数
。
3.数量。
- 32字节,是需要传输的代币数量,这里是1*10^18 GNT
0000000000000000000000000000000000000000000000000de0b6b3a7640000
将数量转化成16进制
(以1e-18为单位),同样填充若干个0,填充为64个16进制数
。
然后将三个部分拼接而成Transaction的data。例如,向0x299432642dcc4c2f33ff0f5d41b8f4154b82ae2a
地址发送1000
个token。data部分凭接如下:
0x +
a9059cbb +
000000000000000000000000299432642dcc4c2f33ff0f5d41b8f4154b82ae2a+ //(接收地址)
00000000000000000000000000000000000000000000021e19e0c9bab2400000 //(接收数量16进制表示,以1e-18为单位)。
所以发送的Transaction参数为:
from: 0x发送地址;
to:0x合约地址;
value:0x;
data:0xa9059cbb000000000000000000000000299432642dcc4c2f33ff0f5d41b8f4154b82ae2a00000000000000000000000000000000000000000000021e19e0c9bab2400000.
参考链接:
https://blog.csdn.net/guokaikevin/article/details/79060095
https://blog.csdn.net/guokaikevin/article/details/78577078