在Remix和Ganache中,遵循智能合约可以正常工作。但是不适用于像Kaleido或Azure这样的私有以太坊区块链。我想念什么。当我打电话给setA时,它消耗了所有气体,然后失败了。
pragma solidity ^0.4.24;
contract TestA {
uint public someValue;
function setValue(uint a) public returns (bool){
someValue = a;
return true;
}
}
contract TestB {
address public recentA;
function createA() public returns (address) {
recentA = new TestA();
return recentA;
}
function setA() public returns (bool) {
TestA(recentA).setValue(6);
return true;
}
}
答案 0 :(得分:1)
我在Kaleido尝试了您的合同,发现即使呼叫数量非常大的eth_estimateGas也会导致“断气”。
我更改了setValue
跨合同调用以设置gas值,然后我可以调用setA,并且估计setA
的gas仅显示31663。
recentA.setValue.gas(10000)(6);
我怀疑这种EVM行为与零价汽油的许可链有关。但是,这是猜测,因为我还没有研究内部结构。
我还在kaleido-go中添加了eth_estimateGas和对Solidity文件中多个合同的支持,以防它有所帮助: https://github.com/kaleido-io/kaleido-go
其他人在合同中遇到“断气”调用的另一种可能性-在Geth中,如果
require
调用在被叫合同中失败,则错误报告为“断气”(而不是“恢复执行”) ,或require
失败的详细原因)。
答案 1 :(得分:0)
您正在达到每个区块允许使用的气体限制。有关气体限制的信息包含在每个块中,因此您可以检查区块链中当前的值。目前在以太坊MainNet上,GasLimit(每块)约为800万(请参见此处https://etherscan.io/blocks)
要解决此问题,您可以使用修改后的创世纪文件启动区块链。尝试增加创世文件中的gasLimit
参数的值,该参数指定每个区块处理的最大气体量。尝试"gasLimit": "8000000"
。
答案 2 :(得分:0)
尝试丢弃合同setValue
中的TestA
方法的返回语句。
pragma solidity ^0.4.24;
contract TestA {
uint public someValue;
function setValue(uint a) public {
someValue = a;
}
}