当前位置: 首页 > article >正文

solidity-20-sendeth

发送ETH

这章的标题让我觉得奇怪,因为先前我也发送ETH,如上一篇提到的recieve和fallback函数。
重现了教程中的代码

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;

contract sendeth{
    // 这个事件是为了打log,记录收到的eth和剩余的gas fee
    event log(uint amount,uint gas);

    receive() external payable {
        emit log(msg.value,gasleft());
     }

     function get_balance() public view returns (uint _balance){
        // 这个balance的单位并不是eth而是最小单位wei
        _balance = address(this).balance;
     }
}

在这里插入图片描述
本章的重心在于:
Solidity有三种方法向其他合约发送ETH,他们是:transfer(),send()和call(),其中call()是被鼓励的用法.

下面就实现一些方法向合约内发送eth

Transfer

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;

contract sendeth{
    // 这个事件是为了打log,记录收到的eth和剩余的gas fee
    event log(uint amount,uint gas);

    receive() external payable {
        emit log(msg.value,gasleft());
     }

     function get_balance() public view returns (uint _balance){
        // 这个balance的单位并不是eth而是最小单位wei
        _balance = address(this).balance;
     }
}

contract sendeth_send{
    // 构造函数使用payable使得部署的时候可以转eth进去 我怎么没看懂?
    constructor() payable {}

    // 在接收eth时会触发这个函数
    receive() external payable { }

    // external只能被外部函数调用 public可以被内外函数进行调用
    // 为什么使用external而不使用public呢
    function transfereth(address payable add,uint256 amount) external payable{
        // add是接收合约的地址,amount是转账的金额
        // transfer是address类内部实现的一个方法
        add.transfer(amount);
    }
}

这里是使用transfer方法
在这里插入图片描述

send

send方法和transfer的用法是差不多的,同样可以理解为address类内部实现的方法,可以使用add.send()的方式进行使用。
send的gas fee是很低的,合约的fallback()和receive()不能实现太复杂的逻辑。
send的返回值是一个bool,需要额外的逻辑处理转账失败。

call

contract sendeth_send{
    // 构造函数使用payable使得部署的时候可以转eth进去 我怎么没看懂?
    constructor() payable {}

    // 在接收eth时会触发这个函数
    receive() external payable { }

    // external只能被外部函数调用 public可以被内外函数进行调用
    // 为什么使用external而不使用public呢
    function transfereth(address payable add,uint256 amount) external payable{
        // add是接收合约的地址,amount是转账的金额
        // transfer是address类内部实现的一个方法
        add.transfer(amount);
    }

    // 这个是send方法 为什么这个address要使用payable?
    function sendseth(address payable add,uint256 amount) external payable {
        // 返回值需要显示的表明
        bool success = add.send(amount);
        // 如果send方法返回一个false就表示
        if (!success){
            revert Sendfailed();
        }
    }

    function sendethcall(address payable add,uint256 amount) external payable {
        (bool success,) = add.call{value:amount}("");
        if(!success){
            revert Callfailed();
        }
    }
}

方法的使用差不多。


http://www.kler.cn/a/305937.html

相关文章:

  • 条件语句 - if, else, switch-case
  • 剑指Offer|LCR 014. 字符串的排列
  • MySQL 性能瓶颈,为什么 MySQL 表的数据量不能太大?
  • RockyLinux介绍及初始化
  • FIR数字滤波器设计——窗函数设计法——滤波器的时域截断
  • bash shell的条件语句
  • MySQL——数据库的高级操作(三)权限管理(2)授予权限
  • 自动驾驶自动泊车场景应用总结
  • RAII 与 std::lock_guard 在 C++ 中的应用:自动化互斥锁管理与线程安全
  • 【6大设计原则】迪米特法则:解密软件设计中的“最少知识原则”
  • 创建一个Java项目在IntelliJ IDEA中
  • 【AI绘画】Midjourney进阶:景别详解
  • 数学建模常用模型---“算法”总结(含特性和应用场景)
  • 聊天组件 Vue3-beautiful-chat
  • 【QT】实现TCP服务器,客户端之间的通信
  • 国风编曲:了解国风 民族调式 五声音阶 作/编曲思路 变化音 六声、七声调式
  • 【开源免费】基于SpringBoot+Vue.JS在线旅游网站(JAVA毕业设计)
  • 威胁建模网络与云威胁
  • SQL进阶的技巧:如何实现某列的累计乘积?
  • Codeforces Round 921 (Div. 2) A~D
  • 英飞凌MCU第五代高性能CAPSENSE技术PSoC4000T
  • Leetcode 二叉树中根遍历
  • 力扣-96.不同的二叉搜索树 题目详解
  • Android Radio2.0——动态列表回调(七)
  • tcp、http和rpc
  • WebSocket详细介绍