Blockchain 以太/BSC区块链交易数据

Blockchain 以太/BSC区块链交易数据,blockchain,ethereum,web3,web3js,binance,Blockchain,Ethereum,Web3,Web3js,Binance,我试图在Binance智能链区块链上玩web3js,我在理解交易数据方面遇到了困难 查看此事务,因为有三个事务传输(令牌传输),大多数情况下有两个(到目前为止,我已经看到了2、3和5)。 我不明白是什么决定了单笔交易的转账数量。以及如何使用web3js检索这些数据 我想知道BNB支付的金额和在该交易中收到的代币金额,反之亦然,如果交易是关于出售代币而不是购买代币 我设法获得了支付的价格和代币金额,但仅限于有2个代币转账的交易。但如果有3个或更多,我就无法获得这些信息 web3.eth.getTr

我试图在Binance智能链区块链上玩web3js,我在理解交易数据方面遇到了困难

查看此事务,因为有三个事务传输(令牌传输),大多数情况下有两个(到目前为止,我已经看到了2、3和5)。 我不明白是什么决定了单笔交易的转账数量。以及如何使用web3js检索这些数据

我想知道BNB支付的金额和在该交易中收到的代币金额,反之亦然,如果交易是关于出售代币而不是购买代币

我设法获得了支付的价格和代币金额,但仅限于有2个代币转账的交易。但如果有3个或更多,我就无法获得这些信息

web3.eth.getTransaction('0x899e7f3c2138d051eb5246850ded99d519ab65eba58e5f806245cf346ab40e83').then((result) => {
  console.log(result)
  console.log(web3.utils.fromWei(result.value))

  let tx_data = result.input;
  let input_data = '0x' + tx_data.slice(10);  // get only data without function selector

  let params = web3.eth.abi.decodeParameters([
      {
        indexed: false,
        internalType: 'uint256',
        name: 'value',
        type: 'uint256'
      },
      {
        indexed: false,
        internalType: 'uint256',
        name: 'ethReceived',
        type: 'uint256'
      },
    ]
    , input_data);
  console.log(params)

})
这部分代码只为2个令牌传输提供数据。无论交易中有多少笔转账,如何始终将已支付/收到的现金/代币金额返还给我??有可能吗??从我所看到的情况来看,事务中的第一次传输和最后一次传输都是我感兴趣的值。有没有一个简单的方法可以得到这些?我正在努力理解这一点,并与ABIs合作解码。它们是否具有某种通用性?

传递的令牌信息来自事件日志。大多数令牌标准定义了一个事件
传输(地址索引自,地址索引至,uint256值)
,因此您可以在事务中查找此事件的日志

事件日志在中提供,而不是常规的

事件定义中的
索引
修饰符意味着该值将在
主题
属性中可用(
主题[0]
是事件签名的keccak256哈希,在索引值之后)。然后,“未索引”值存储在
数据
属性中-根据其定义的顺序排序

const transferEventSignature = web3.utils.keccak256('Transfer(address,address,uint256)'); // 0xddf252...
const jsonAbi = [{
    "constant" :true,
    "inputs": [],
    "name": "decimals",
    "outputs": [{"name":"","type":"uint8"}],
    "type": "function"
}]; // simplified JSON abi that is only able to read decimals

web3.eth.getTransactionReceipt('0x899e7f3c2138d051eb5246850ded99d519ab65eba58e5f806245cf346ab40e83').then(async (result) => {
    for (const log of result.logs) {
        if (log.topics[0] !== transferEventSignature) {
            continue; // only interested in Transfer events
        }

        const from = web3.eth.abi.decodeParameter('address', log.topics[1]);
        const to = web3.eth.abi.decodeParameter('address', log.topics[2]);
        const value = web3.eth.abi.decodeParameter('uint256', log.data);
        const tokenContractAddress = log.address;

        const contractInstance = new web3.eth.Contract(jsonAbi, tokenContractAddress);
        const decimals = await contractInstance.methods.decimals().call();

        console.log('From: ', from);
        console.log('To: ', to);
        console.log('Value: ', value);
        console.log('Token contract: ', tokenContractAddress);
        console.log('Token decimals: ', decimals);
        console.log('---');
    }
});
输出:

From:  0xC6A93610eCa5509E66f9B2a95A5ed1d576cC9b7d
To:  0xE437fFf464c6FF2AA5aD5c15B4CCAD98DF38cF52
Value:  31596864050517135
Token contract:  0x78F1A99238109C4B834Ac100d1dfCf14e3fC321C
Token decimals:  9
---
From:  0xE437fFf464c6FF2AA5aD5c15B4CCAD98DF38cF52
To:  0x58F876857a02D6762E0101bb5C46A8c1ED44Dc16
Value:  4064578781674512
Token contract:  0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c
Token decimals:  18
---
From:  0x58F876857a02D6762E0101bb5C46A8c1ED44Dc16
To:  0xC6A93610eCa5509E66f9B2a95A5ed1d576cC9b7d
Value:  2552379452401563824
Token contract:  0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56
Token decimals:  18

注意:某些令牌实现是不正确的(即不遵循令牌标准),并且没有将事件参数标记为
索引的
。在这种情况下,
主题[0]
仍然是相同的,但是
主题
中不存在
from
to
的地址,但是您必须从
数据
字段解析它们。
地址的长度为64个十六进制字符(在实际的40个字符地址前加上零)