代码之家  ›  专栏  ›  技术社区  ›  BlockchainProgrammer

quorum-ethereum-truffle)错误:数字只能安全地存储最多53位

  •  0
  • BlockchainProgrammer  · 技术社区  · 6 年前

    我正在以太坊学习智能合约编程,我和松露一起工作。现在我在这里做这个教程: https://truffleframework.com/tutorials/building-dapps-for-quorum-private-enterprise-blockchains

    学习如何创建具有仲裁的DAPP。但现在我有个问题。

    我做的每件事都和描述的一样,但当我做的时候:

    truffle migrate
    

    我在这里得到这个错误:

    $ truffle migrate
        ⚠️  Important ⚠️
        If you're using an HDWalletProvider, it must be Web3 1.0 enabled or your migration will hang.
    
    
        Starting migrations...
        ======================
        > Network name:    'development'
        > Network id:      10
        > Block gas limit: 3758096384
    
    
        1_initial_migration.js
        ======================
    
           Deploying 'Migrations'
           ----------------------
           > transaction hash:    0x0a55cd010bb30247c3ae303e54be8dd13177b520af5967728cf77e07ca9efe76
        - Blocks: 0            Seconds: 0
           > Blocks: 0            Seconds: 0
           > contract address:    0x1932c48b2bF8102Ba33B4A6B545C32236e342f34
           > account:             0xed9d02e382b34818e88B88a309c7fe71E65f419d
           > balance:             1000000000
           > gas used:            245462
           > gas price:           0 gwei
           > value sent:          0 ETH
           > total cost:          0 ETH
    
    
        - Saving migration to chain.
        Error: Number can only safely store up to 53 bits
            at assert (C:\Users\dany.vandermeij\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\number-to-bn\~\bn.js\lib\bn.js:6:1)
            at BN.toNumber (C:\Users\dany.vandermeij\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\number-to-bn\~\bn.js\lib\bn.js:506:1)
            at Object.hexToNumber (C:\Users\dany.vandermeij\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\web3-utils\src\utils.js:234:1)
            at Method.outputBlockFormatter [as outputFormatter] (C:\Users\dany.vandermeij\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\web3-eth\~\web3-core-helpers\src\formatters.js:239:1)
            at Method.formatOutput (C:\Users\dany.vandermeij\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\web3-eth\~\web3-core-method\src\index.js:163:1)
            at sendTxCallback (C:\Users\dany.vandermeij\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\web3-eth\~\web3-core-method\src\index.js:473:1)
            at C:\Users\dany.vandermeij\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\web3-core-requestmanager\src\index.js:147:1
            at C:\Users\dany.vandermeij\AppData\Roaming\npm\node_modules\truffle\build\webpack:\packages\truffle-migrate\index.js:145:1
            at C:\Users\dany.vandermeij\AppData\Roaming\npm\node_modules\truffle\build\webpack:\packages\truffle-provider\wrapper.js:112:1
            at XMLHttpRequest.request.onreadystatechange (C:\Users\dany.vandermeij\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\web3-providers-http\src\index.js:96:1)
            at XMLHttpRequestEventTarget.dispatchEvent (C:\Users\dany.vandermeij\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\xhr2-cookies\dist\xml-http-request-event-target.js:34:1)
            at XMLHttpRequest._setReadyState (C:\Users\dany.vandermeij\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\xhr2-cookies\dist\xml-http-request.js:208:1)
            at XMLHttpRequest._onHttpResponseEnd (C:\Users\dany.vandermeij\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\xhr2-cookies\dist\xml-http-request.js:318:1)
            at IncomingMessage.<anonymous> (C:\Users\dany.vandermeij\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\xhr2-cookies\dist\xml-http-request.js:289:47)
            at emitNone (events.js:111:20)
            at IncomingMessage.emit (events.js:208:7)
            at endReadableNT (_stream_readable.js:1064:12)
            at _combinedTickCallback (internal/process/next_tick.js:138:11)
            at process._tickCallback (internal/process/next_tick.js:180:9)
        Truffle v5.0.1 (core: 5.0.1)
        Node v8.11.4
    

    现在我不知道为什么…

    有没有人有同样的问题可以帮我解决?

    这是我的智能合约:

    pragma solidity ^0.4.17;
    
    contract SimpleStorage {
      uint public storedData;
    
      constructor(uint initVal) public {
        storedData = initVal;
      }
    
      function set(uint x) public {
        storedData = x;
      }
    
      function get() view public returns (uint retVal) {
        return storedData;
      }
    }
    

    我的truffle-config.js文件:

    module.exports = {
      networks: {
        development: {
          host: "127.0.0.1",
          port: 22000, // was 8545
          network_id: "*", // Match any network id
          gasPrice: 0,
          gas: 4500000
        },
        nodefour:  {
          host: "127.0.0.1",
          port: 22003,
          network_id: "*", // Match any network id
          gasPrice: 0,
          gas: 4500000
        },
        nodeseven:  {
          host: "127.0.0.1",
          port: 22006,
          network_id: "*", // Match any network id
          gasPrice: 0,
          gas: 4500000
        }
      },
      // Set default mocha options here, use special reporters etc.
      mocha: {
        // timeout: 100000
      },
    
      // Configure your compilers
      compilers: {
        solc: {
          version: "0.4.25",    // Fetch exact version from solc-bin (default: truffle's version)
        }
      }
    }
    

    以及迁移文件:

    var SimpleStorage = artifacts.require("SimpleStorage");
    
    module.exports = function(deployer) {
      // Pass 42 to the contract as the first constructor parameter
      deployer.deploy(SimpleStorage, 2, { privateFor: ["ROAZBWtSacxXQrOe3FGAqJDyJjFePR5ce4TSIzmJ0Bc="] })
    };
    
    3 回复  |  直到 6 年前
        1
  •  1
  •   BlockchainProgrammer    6 年前

    所以问题是块时间戳是以纳秒为单位的。

    @Edgraaff写了一个代理,它将时间戳从纳秒转换为秒。 您可以在此处找到代码-> https://github.com/edgraaff/quorum-rpc-proxy

    我要做的是克隆代理并将config.js文件更改为:

    module.exports = {
      rpcUrl: 'http://localhost:22000',
      port: 7545
    };
    

    在truffle-config.js文件中,我必须更改端口。代码如下:

    module.exports = {
      networks: {
        development: {
          host: "127.0.0.1",
          port: 7545, // was 8545
          network_id: "*", // Match any network id
          gasPrice: 0,
          gas: 4500000
        },
        nodefour:  {
          host: "127.0.0.1",
          port: 22003,
          network_id: "*", // Match any network id
          gasPrice: 0,
          gas: 4500000
        },
        nodeseven:  {
          host: "127.0.0.1",
          port: 22006,
          network_id: "*", // Match any network id
          gasPrice: 0,
          gas: 4500000
        }
      },
      // Set default mocha options here, use special reporters etc.
      mocha: {
        // timeout: 100000
      },
    
      // Configure your compilers
      compilers: {
        solc: {
          version: "0.4.25",    // Fetch exact version from solc-bin (default: truffle's version)
        }
      }
    }
    

    感谢@edgraaff

        2
  •  0
  •   BlockchainProgrammer    6 年前

    @QuorumPrivateBlockchain嘿,伙计。

    这是我的truffle-config.js文件:

    module.exports = {
      networks: {
        development: {
          host: "127.0.0.1",
          port: 7545,
          network_id: "*",
          gasPrice: 0,
          gas: 4500000
        },
        nodefour:  {
          host: "127.0.0.1",
          port: 7546,
          network_id: "*",
          gasPrice: 0,
          gas: 4500000
        },
        nodeseven:  {
          host: "127.0.0.1",
          port: 7547,
          network_id: "*",
          gasPrice: 0,
          gas: 4500000
        }
      },
      compilers: {
        solc: {
          version: "0.4.25",   
        }
      }
    }
    

    这是代理服务器上的config.js文件:

    module.exports = [
      {
        rpcUrl: 'http://localhost:22000',
        port: 7545
      },
      {
        rpcUrl: 'http://localhost:22003',
        port: 7546
      },
      {
        rpcUrl: 'http://localhost:22006',
        port: 7547
      },
    ];
    

    所以,您要做的是,将来自truffle的请求发送到代理服务器,然后代理服务器转换时间戳并将请求进一步发送到节点。

    代理本身就是一个程序,您不必从代理代码中复制config.js文件。看看Github如何启动代理。

        3
  •  0
  •   Eugene    6 年前

    代理是不够的,因为web3.js可以通过ws在subscription中获取块

    同样,在按编号获取块的仲裁中,它只接受十六进制,但是web3.js假定十六进制为blockhash

    这是我的解决方案

    web3.extend({
      property: 'eth',
      methods: [new web3.extend.Method({
        name: 'getBlockByNumber',
        call: 'eth_getBlockByNumber',
        params: 2,
        inputFormatter: [web3.extend.formatters.inputBlockNumberFormatter, v => !!v],
        outputFormatter: web3.extend.formatters.outputBlockFormatter
      })]
    });
    web3.utils.hexToNumber = v => {
      if (!v) return v;
      try {
        return numberToBN(v).toNumber();
      } catch (e) {
        return numberToBN(v).toString();
      }
    };
    

    现在注意时间戳是字符串

    这是web3.js repo中的相关问题 https://github.com/ethereum/web3.js/issues/1215

    推荐文章