以太坊智能合约(solidity)开发可能遇到的问题和解决方案,(持续更新)

以太坊智能合约(solidity)开发可能遇到的问题和解决方案,(持续更新)

我会在这篇博客里持续更新我在开发过程中所遇到的报错,和解决方案。

1.调用以太坊钱包metamask出现错误,Uncaught Error: Invalid number of arguments to Solidity function

答:合约函数调用时应该与声明参数列表一致,检查调用合约时输入的实参是否都对上了。

2.合约编译报错,address 类型不正确,需要 payable address类型参数。TypeError: Type address is not implicitly convertible to expected type address payable.

这是因为0.5.0以上版本新增了 “payable address” 的概念。

address:保存一个20字节的值(以太坊地址的大小)。

payable address:与address相同,但附加转移和发送。

这种区别背后的想法是,payable address是您可以发送以太币的地址,而address(普通地址)不能发送以太币。

声明方法时,形参要求是payable address类型

下面解决方案代码

    function TransferEther(address payable _addr,uint256 _value) external onlyOwner{
        _addr.transfer(_value);
    }

google 查到地址转换实测无效

address payable recharge_address = address(uint160(0x0000000000000000000000000));

3.合约编译报错,address 类型不正确,TypeError: Invalid type for argument in function call. Invalid implicit conversion from function () view returns (address payable) to address requested.

这个报错跟上面2的问题相反。审核代码,是否传入了 payable address 类型参数到函数内。

4.Bytes32类型相关问题

1.solidity代码内 string 转 bytes32

    function stringToBytes32(string memory source) public pure returns (bytes32 result) {
        bytes memory tempEmptyStringTest = bytes(source);
        if (tempEmptyStringTest.length == 0) {
            return 0x0;
        }

        assembly {
        result := mload(add(source, 32))
        }
    }

2.Golang与合约交互,传入 [32]byte 类型数据

Solidity代码编译成Golang接口时,bytes32类型参数会转换成 Golang的 [32]byte (32位byte数组)类型数据

value := [32]byte{}
copy(value[:], []byte("hello"))

3.C#与合约交互,传入 byte[] 类型数据

Solidity代码编译成C#接口时,bytes32类型参数会转换成 C#的 byte[] (byte数组)类型数据

byte[] value = Encoding.UTF8.GetBytes("hello");

5.合约上线前测试建议使用 Ropsten

很多小伙伴应该是用的remix的 js vm快速部署

又或者是 Truffle的 Ganache做本地环境.

通常做合约测试我都建议选择 Ropsten测试网, 因为这是最接近主网真实性的测试网络了.

放到 Ropsten 上测试没有问题,那么上主网就不会有问题.

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值