Quorum Ethereum Truffle) Error: Number can only safely store up to 53 bits
Quorum Ethereum Truffle) Error: Number can only safely store up to 53 bits
我实际上正在学习以太坊上的智能合约编程,并且我使用 truffle。现在我正在这里制作这个教程:https://truffleframework.com/tutorials/building-dapps-for-quorum-private-enterprise-blockchains
您可以在其中学习如何创建具有 quorum 的 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;
}
}
还有我的松露-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="] })
};
所以问题是块时间戳以纳秒为单位。
@edgraaff 写了一个 Proxy 将时间戳从纳秒转换为秒。
您可以在此处找到代码 -> 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
@QuorumPrivateBlockChain 嗨伙计。
所以这是我的松露-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 如何启动代理。
代理不够用,因为web3.js可以通过ws
获取block in subscribtion
此外,在 quorum 中,按数字获取块已被破坏,它只接受十六进制,但是 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 回购 https://github.com/ethereum/web3.js/issues/1215
中的相关问题
如果您将 truffle 版本降级到 4.1.15,则无需使用任何代理。如果您这样做,一切都会正常进行。只是不要降级到 4.1.14,因为 truffle init 在那个包里坏了!
简单修复:只需在您的 truffle-config 中添加 type: "quorum"
,因为网络应该 运行 法定人数。
目前(2020 年 5 月),基本上您有两种解决方法:
- 在
truffle-config.js
或networks.js
中添加type: "quorum"
,例如:
myLocalQuorum: {
protocol: 'http',
host: 'localhost',
port: 22000,
gas: 5000000,
gasPrice: 0,
networkId: '*',
type: "quorum"
},
- 如果您正在使用
@truffle/hd-wallet-provider
,没有简单的解决方法,但您可以将共识切换为 istanbul
而不是 raft
,请参阅 oz community更多详情。
When running the default consensus Istanbul BFT, I can deploy and interact with a contract using Truffle and OpenZeppelin SDK.
When I switch to RAFT I wasn’t able to deploy a contract using truffle migrate nor oz create. I didn’t see anything different I needed to do config wise in the Truffle documentation for RAFT. by @abcoathup
我实际上正在学习以太坊上的智能合约编程,并且我使用 truffle。现在我正在这里制作这个教程:https://truffleframework.com/tutorials/building-dapps-for-quorum-private-enterprise-blockchains
您可以在其中学习如何创建具有 quorum 的 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;
}
}
还有我的松露-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="] })
};
所以问题是块时间戳以纳秒为单位。
@edgraaff 写了一个 Proxy 将时间戳从纳秒转换为秒。 您可以在此处找到代码 -> 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
@QuorumPrivateBlockChain 嗨伙计。
所以这是我的松露-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 如何启动代理。
代理不够用,因为web3.js可以通过ws
获取block in subscribtion此外,在 quorum 中,按数字获取块已被破坏,它只接受十六进制,但是 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 回购 https://github.com/ethereum/web3.js/issues/1215
中的相关问题如果您将 truffle 版本降级到 4.1.15,则无需使用任何代理。如果您这样做,一切都会正常进行。只是不要降级到 4.1.14,因为 truffle init 在那个包里坏了!
简单修复:只需在您的 truffle-config 中添加 type: "quorum"
,因为网络应该 运行 法定人数。
目前(2020 年 5 月),基本上您有两种解决方法:
- 在
truffle-config.js
或networks.js
中添加type: "quorum"
,例如:
myLocalQuorum: {
protocol: 'http',
host: 'localhost',
port: 22000,
gas: 5000000,
gasPrice: 0,
networkId: '*',
type: "quorum"
},
- 如果您正在使用
@truffle/hd-wallet-provider
,没有简单的解决方法,但您可以将共识切换为istanbul
而不是raft
,请参阅 oz community更多详情。
When running the default consensus Istanbul BFT, I can deploy and interact with a contract using Truffle and OpenZeppelin SDK.
When I switch to RAFT I wasn’t able to deploy a contract using truffle migrate nor oz create. I didn’t see anything different I needed to do config wise in the Truffle documentation for RAFT. by @abcoathup