Solidity地址支付方法Send、Transfer和Call的使用

这篇具有很好参考价值的文章主要介绍了Solidity地址支付方法Send、Transfer和Call的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

以上三种转账方式都属于地址的成员属性(members of address)。

参见地址成员类型

Transfer

如果当前合约的余额不够大或者 Ether转账被接收账户拒绝,转账功能将失败。接收方智能合约应定义回退函数,否则转账调用将引发错误。transfer函数在失败时恢复。另外它被硬编码以防止重入攻击(这句话不是很能理解)。

示例1:

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;

contract AddressFunction {
    function transfer(address payable _to) public payable {
        _to.transfer(msg.value);
    }
}

测试

solidity transfer,智能合约,区块链,solidity  

Send

Send是和Transfer具有同等功能的低级api。如果执行失败,当前合约不会因为异常而停止,但会返回false。

示例2:

    function send(address payable _to) public payable {
        bool isSend = _to.send(msg.value);
        require(isSend, "Send fail");
    }

初看这段代码总会感觉怪怪的,一般思维调send方法不是发送方吗(solidity设计的某些api反人类),其实这里的_to指向的是接收方(包括transfer使用)。

这里为什么要加上payable关键字,它可以修饰地址和函数,使之具有接受和转账以太的功能。

贴一个官方文档的说明;

solidity transfer,智能合约,区块链,solidity

 测试

solidity transfer,智能合约,区块链,solidity

solidity transfer,智能合约,区块链,solidity

send与transfer都有2300gas的限制,msg.value可以为零。官方推荐在收款人取款的模式下,使用transfer更好,因为send需要不断对发送地址余额进行判断。

尝试转移大于发送地址余额的value,此时交易将一直处于pending状态....

transact to AddressFunction.send pending ... 

Call

这是将 ETH 发送到智能合约的推荐方式。空参数触发接收地址的回退功能(fallback function)。

示例3:

 function calls(address payable _to) public payable {

        (bool isSuccess, /* memory data */ ) = _to.call{value: msg.value}("");
        require(isSuccess, "Failure! Ether not send.");
    }

测试

solidity transfer,智能合约,区块链,solidity

使用call,还可以触发合约中定义的其他功能,并发送固定数量的gas来执行该功能。交易状态作为布尔值发送,返回值在数据变量(bytes memory data)中发送。 

更具体使用的格式如下:

(bool sent, bytes memory data) = _to.call{gas :10000, value: msg.value}("func_signature(uint256 args)");

 2019年,solidity官方已经弃用了send和transfer,推荐call方法进行转账操作,但还是要小心使用官方给出了警告:

solidity transfer,智能合约,区块链,solidity

 

参考: https://medium.com/coinmonks/solidity-transfer-vs-send-vs-call-function-64c92cfc878a

            Types — Solidity 0.8.17 documentation 文章来源地址https://www.toymoban.com/news/detail-780013.html

到了这里,关于Solidity地址支付方法Send、Transfer和Call的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Solidity 关键词说明(payable transfer event modifier msg external public view pure memory)

    在 Solidity 中, payable 是一个,用于表示函数可以接收以太币(ether)的转账。如果一个函数被声明为 payable ,那么它就可以接收以太币的转账,而不仅仅是使用以太币作为参数进行函数调用。 例如,下面是一个声明了 payable 的函数: 在上面的代码中,函数 buy

    2024年02月04日
    浏览(10)
  • Solidity之abi.encode各编码方法使用

    Solidity之abi.encode各编码方法使用

    什么是智能合约 ABI ABI = Specification for encoding and decoding 非常精炼的一句话:一套用来编码和解码的规范。  注意与合约字节码(bytecode)要区分开,字节码只是一串用十六进制数表示的 EVM 操作码。 在 Solidity 文档中描述为:   “ABI 是与以太坊生态系统中的合约交互的标准方

    2023年04月13日
    浏览(11)
  • solidity学习记录 3 (地址与交易)

    智能合约中的地址 合约中的地址等同于uint160类型 合约当中的地址可以被比较 地址中余额的获取与转账操作  那新建一个地址类型时可以通过address.balance 来获取当前地址的余额 若一个函数中需要进行转账操作需要在函数中加上payable this指向的是当前合约的地址 若对当

    2023年04月24日
    浏览(10)
  • 一起学solidity写智能合约——地址类型(address)

    在区块链中说地址重不重要,其实会被笑,然后会让你去恶补一下知识点,哈哈哈哈哈哈,地址可以没有区块链,但是区块链不能没有地址,这句话不是开玩笑。 地址类型是在以太坊的诞生之后出现的一个特有类型,他是一个大小160位的二进制数字 在地址中我们可以说有很

    2023年04月16日
    浏览(9)
  • ruby send call 的简单使用

    ruby send call 的简单使用

    refer: ruby on rails - What does .call do? - Stack Overflow Ruby使用call 可以调用方法或者proc send方法也可以调用方法,在本地写一个测试: 运行:ruby hi.rb 得到输出:

    2024年02月13日
    浏览(10)
  • Solidity节省GAS的方法

    1、使用struct结构体 使用struct结构体会结构存储空间,编译器会自动优化struct的存储。比如uint类型,不管是uint32还是uint256,默认都会使用256存储。两个uint32也占用2个256的存储单元。但如果是在struct内部的两个uint32,则只会占用一个256存储单元。 2、对于不需要修改链上内容的

    2024年01月21日
    浏览(7)
  • 038.Solidity入门——25调用其他合约的方法

    Solidity 提供了几种方式用于调用其他合约: 方法 描述 直接调用 使用 address.call 函数,可以向另一个合约发送消息并返回结果。 低级调用 使用 address.call 或 address.callcode 函数,可以执行一个外部合约中的代码。与直接调用不同,低级调用允许合约调用 修改其状态 。 委托调用

    2023年04月13日
    浏览(9)
  • 【solidity三】Solidity中继承、创建合约和外部调用、合约事件event、solidity中元祖的使用、new、delete关键字的使用、solisity创建合约和外部调用

    - 最重要的两个全局变量 msg.sender 每一次和以太坊交互时都会产生一笔交易,这笔交易的执行人就是msg.sender。简而言之:谁调用的,msg.sender就是谁,每笔交易的msg.sender都可以不同。举例: 部署合约的时候,msg.sender就是部署的账户。 调用setMessage时,msg.sender就是调用账户。

    2024年02月03日
    浏览(10)
  • solidity库的使用

    一、什么是库 特殊的合约,可以像合约一样进行部署,但是没有状态变量、不能存以太币 可重用 部署一次,在不同合约内反复使用 节约gas,相同功能的代码不用反复部署 1.定义库、使用库 library mathlib{ plus(); } contract C{ mathlib.plus(); } 库函数使用委托的方式调用delegateCall,库

    2023年04月08日
    浏览(8)
  • solidity合约中的interface怎么使用

    # Interface ## 什么是 interface ? Interfaces 和抽象合约比较类似,但是他们不能实现任何功能。通过定义好的 interface 我们可以在不清楚目标合约具体实现方式的情况下,调用目标的合约 ## 如何定义 interface ? ```solidity interface Country {     // 定义接口中的方法和返回值 } ``` ## interface 中不

    2024年02月03日
    浏览(16)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包