receive payable 里面尽量避免写代码,以免其他合约调用transfer 不成功

  • A+
所属分类:以太坊ETH

chatGPT账号

receive() payable 里面尽量避免写代码,以免其他合约调用transfer 不成功

缘起:最近调试一段solidity代码,本来想测试在收款的时候,记录一个receive 和发出一个log,哪个消耗gas更大

  • 如下图,我定义了两个contract, TestTransfer 中的sendOut函数会使用transfer转账到TransferCount 合约.
    • 第一步 使用remix 测试,总是不成功.
    • 第二步 使用remix直接给TransferCount转账能成功
    • 修改代码,注释掉 TransferCount recieve() 里面的代码,重做第一步测试就能成功.

receive payable 里面尽量避免写代码,以免其他合约调用transfer 不成功

pragma solidity >0.8.0 ;

contract TransferCount {
    uint public fallbackCount = 0;
    uint public receiveCount = 0;
    constructor() payable{

    }
    function deposit() payable external{

    }
    receive() external payable {
       //这里增加代码,可能导致合约TestTransfer.sendOut 中调用 address.transfer 因为gas不足调用失败
        receiveCount ++;
    }
    fallback() external payable{
        fallbackCount ++;
    }
}

contract TestTransfer{
    uint public fallbackCount = 0;
    uint public receiveCount = 0;
    address payable public  tc;
    receive() external payable {
        receiveCount ++;
    }
    fallback() external payable{
        fallbackCount ++;
    }


    constructor(address payable addr) payable {
        tc = addr;

    }

    function sendOut(uint amount ) external{
        require(amount  <= address(this).balance, "insufficient balance");
        payable(tc).transfer(amount);
       
    }
}
免责声明

发文时比特币价格:$71249

当前比特币价格:[crypto coins=”BTC” type=”text” show=”price”]

当前比特币涨幅:[crypto coins=”BTC” type=”text” show=”percent”]

免责声明:

本文不代表路远网立场,且不构成投资建议,请谨慎对待。用户由此造成的损失由用户自行承担,与路远网没有任何关系;

路远网不对网站所发布内容的准确性,真实性等任何方面做任何形式的承诺和保障;

网站内所有涉及到的区块链(衍生)项目,路远网对项目的真实性,准确性等任何方面均不做任何形式的承诺和保障;

网站内所有涉及到的区块链(衍生)项目,路远网不对其构成任何投资建议,用户由此造成的损失由用户自行承担,与路远网没有任何关系;

路远区块链研究院声明:路远区块链研究院内容由路远网发布,部分来源于互联网和行业分析师投稿收录,内容为路远区块链研究院加盟专职分析师独立观点,不代表路远网立场。

本文是全系列中第16 / 245篇:通证发行

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的电报
  • 这是我的电报扫一扫
  • weinxin
chatGPT账号
路远

发表评论

您必须登录才能发表评论!