首页 > 解决方案 > Javascript将ethereum web3 json对象转换为数组

问题描述

我正在与 web3 合作,试图从以太坊主网上提取实时数据。承诺返回一个 JSON 对象,我想获取最后 10 个块的信息并将这个对象推送到一个数组latest中,以便我可以使用类似的东西将它输出到其他地方,例如latest[0].difficulty.

每次我将块信息推送到数组中时,它似乎只是以一种奇怪的方式将它捆绑在一起,这样当我这样做时latest.length它就会返回为0

我认为我可以对数组和对象进行入门,但非常感谢任何信息。

window.addEventListener('load', function() {

  //  sconsole.log('No Web3 Detected... using HTTP Provider')
  const web3 = new Web3(new Web3.providers.WebsocketProvider("wss://rinkeby.infura.io/ws"));
  console.log('Web3 Detected! ')
  window.web3 = new Web3(web3.currentProvider);

  if (typeof window.web3 !== 'undefined') {
    // You have a web3 browser! Continue below!
    //  startApp(web3);
    init()
    //alert("Web3");
  }
})

async function getArray() {
  latest = []
  await web3.eth.getBlockNumber(function(error, blockNumber) {
    for (var i = 0; i < 10; i++) {
      web3.eth.getBlock(blockNumber - i).then(obj => {
        latest.push(obj)
      })
    }
  })
  return latest
}

async function init() {
  await getArray().then(v => {
    console.log(v.length)
    console.log(v)
  })
}

块上初始 for 循环的数据输出如下所示,基本上是 10 个单独的对象,其中包含这些块的数据

    {
        difficulty:"1"
        extraData:"0xd683010811846765746886676f312e3130856c696e7578000000000000000000cf7828c6662bacad0822d8bdc84a93344f25a1902c54fecb714667177a997dc9569305ec918859784fa1849509da15003eb46f53e831b630991697f3debb842600"
        gasLimit:7134847
        gasUsed:7070346
        hash:"0xb7fff64678bb329288fbec01aaa57038250403674297d754b686b50f5c5c273f"
        logsBloom:"0x00002000024010080000022040108000000000000000008001002004000004000000021000000800000000200006000000000080000000000000000000000002000000000020000000000008000000000000000000001004000000000000004000000000020000002000000000000000000000000000040000000010000000000020108000000000080088000008000000000000000000000000000000000000000080004002000008000002c00000000000000000000000002010000010000002000002000000000010800000000000000000040008000000000000000000100000800200000400000000000480000022000000000480000000000000008000"
        miner:"0x0000000000000000000000000000000000000000"
        mixHash:"0x0000000000000000000000000000000000000000000000000000000000000000"
        nonce:"0x0000000000000000"
        number:3077903
        parentHash:"0x4ca2eabaa9d5759170be9efb43d0a803ab11c8ab35f9649701456a5c2448d781"
        receiptsRoot:"0x7467d9dabf04e6b8037786dd62b2cc1a7b9aad85cb5188ab44e8ba2b82b90b54"
        sha3Uncles:"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
        size:3166
        stateRoot:"0xa81abd0e2f1017179e6ccbc8bf88b579041e65eec7efbce2c763b3b982869191"
        timestamp:1538295579
        totalDifficulty:"5718449"
        transactions:(9) ["0x172af85792c52de0adf86841816523db6cd3bcfac8f0e01f6eb2bcac46621dff", "0xe6dc06855a3514eb41e1770ff4b731a1b1ed4672ae4afd3537e3f04594b8a8ba", "0x622f667af2d6741642b42873ce002b11e98472b86d2fc26a011c085e67fc68e5", "0x6cf3f5a6f0c22ce26bec9372b23bd9b434b1d7371592c272203492da1feb1f9e", "0xaebcdd5fc8f29fc8c265c2b0bc261665e2f5bc7d8c0acf711886731d47ad7158", "0x0ee2d28ba83cc9f3f82b2c8184e51719006d3bd38102d9d7e99dc5803c499ab7", "0x56314a0423a3683feda5e4a6eb9117e35e07e853b8ae28d91dbfc597fa04d98a", "0xaaaee387c6837a8531b3d38fbed0961d8cb34924c4a6fe5ce5e907c793c81359", "0xb5580743c4bcf879c9059d785b9821c8d6d41d68f4a751bc097c74a5ef2d5517"]
        transactionsRoot:"0xc15d937720ee7807fce8606c66af67c495afd917fd733a2a6121a410b8530019"
    }

标签: javascriptarraysethereum

解决方案


何时使用 await 运算符以及何时使用回调函数似乎有些混乱,因为您试图同时使用这两者。

我已将代码更改为仅使用 promise 版本和 await 运算符。

  getArray = async () => {
    const blocknumber = await web3.eth.getBlockNumber()
    for (var i = 0; i < 10; i++) {
      const block = await web3.eth.getBlock(blocknumber - i)
      latest.push(block)
    }
    return latest
  }

这将正确返回一个由十个块组成的数组,从当前块号开始倒数。

当你想使用它时,你可以这样称呼它:

  someAsyncFunctionWhereWeAreWorking = async () => {
    const blocks = await this.getArray()
    blocks.map(block => {
      //we can do things here to each item of the block
      console.log(block.difficulty)
    })
  }

请注意,这必须从async函数中调用


推荐阅读