Solidity 问题汇总

1、查询合约账户余额(address(this).balance)报错

在自己的Geth私链上查询合约账户余额时报错,但是使用Remix的 Javascript VM 执行时正常,使用测试网络Goerli也正常,能够查看合约余额。

(1)执行函数

    //查询合约账户余额,使用view修饰符
    function getContractAccountBalance() public view returns (uint256){
        return address(this).balance;  //this为本合约对象
    }

(2)错误信息

call to functionModifier.getContractAccountBalance
call 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)错误信息 

上面编译时报错:

ParseError: Expected primary expression.

(3)解决方案

接收多个返回值时,需要用小括号()括起来,与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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值