我想从链上获取ERC20代币的名称 BSC主网,用的web3.js,代码如下
const Web3 = require('web3');
const web3 = new Web3('`https://bsc-dataseed1.binance.org:443`');
//一个请求代币名称的请求
web3.eth.call({
to: "0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c",
data: "0x06fdde03"
}).then(res => {
console.log(res)
})
请求回来的数据是这个(为了方便描述后面的问题,我把最后64位数据加粗了) 0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000b5772617070656420424e42000000000000000000000000000000000000000000
如果把整段返回值放入web3.utils.hexToUtf8()
再赋予对象的话,打印出来的会乱码
let coin = { name: web3.utils.hexToUtf8(res) }
console.log(coin);
//{
// name:'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0BWrapped BNB'
//}
如果只取最后64位(也就是上面加粗那段),那就会正常显示
let coin = { name: web3.utils.hexToUtf8(res) }
console.log(coin);
//{
// name:'Wrapped BNB'
//}
如果我想取代币名字的话,我可以只取返回值的最后64位吗?前面的那128位数据(没加粗那段)代表什么意思?有的币前面128位的返回值好像还会不太一样。
新手,刚注册的,第一次发帖,先谢谢大家。
\x00
输出并不是乱码,这是是十六进制表示, 值为0, 根据 https://donsnotes.com/tech/charsets/ascii.html 它就是空字符。
其实更好的方法式使用web3.js 包装的调用合约的方法呀。