在自己的Geth私链上查询合约账户余额时报错,但是使用Remix的 Javascript VM 执行时正常,使用测试网络Goerli也正常,能够查看合约余额。
(1)执行函数 //查询合约账户余额,使用view修饰符
function getContractAccountBalance() public view returns (uint256){
return address(this).balance; //this为本合约对象
}
(2)错误信息
call to functionModifier.getContractAccountBalancecall to functionModifier.getContractAccountBalance errored: Internal JSON-RPC error. { "code": -32000, "message": "invalid opcode: SELFBALANCE" }
如图所示:
(3)解决方案在genesis.json中的config增加 ”istanbulBlock“设置,如下所示:
{
"config": {
"chainId": 1422,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock":0,
"ethash": {}
},
"difficulty": "1",
"gasLimit": "8000000",
"alloc": {
"7df9a875a174b3bc565e6424a0050ebc1b2d1d82": { "balance": "300000" },
"f41c74c9ae680c1aa78f42e5647a62f353b7bdde": { "balance": "400000" }
}
}
关闭所有节点,重新运行init命令启用新的链配置。已测试,可以正常执行查询合约账户余额了
可参考:blockchain - Geth private network return error "invalid opcode: SELFBALANCE" when executing a simple contract - Stack Overflow
或官网:Private Networks | Go Ethereum
2、接收多于1个的函数返回值时报错 (1) 合约部分代码 /// @dev 查看信息
function _getInfo() internal view returns (string memory, address[] memory) {
return (no, list);
}
/// 调用上面函数
function toDo() external view {
address[] list;
,list = _getInfo();
//......
}
(2)错误信息
(3)解决方案上面编译时报错:
ParseError: Expected primary expression.
接收多个返回值时,需要用小括号()括起来,与return多个返回值一样需要用小括号括起来
(,list ) = _getInfo();
3、 错误:ParserError: Expected primary expression. (1)合约部分代码
// 状态变量
mapping(string => address) no_addr;
function toDo() external view {
address addr = no_addr("timo");
//......
}
(2)解决方案
在使用mapping类型时,获取某key的值时,使用中括号[],小括号()一般在函数定义或调用时使用
address addr = no_addr["timo"]; //使用中括号
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)