Solidity可支付函数使用示例详解

 更新时间:2023年05月25日 14:51:08   作者:一只路过的小码农cxy  
这篇文章主要为大家介绍了Solidity可支付函数的使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

学习Solidity中可支付函数的相关知识,了解它们在处理以太币存款方面的重要性,以及如何在智能合约中创建和使用它们。

通过本指南,您应该能够:

  • 理解Solidity中可支付函数的目的和用法
  • 学习如何向智能合约发送Ether
  • 编写Solidity中的可支付函数
  • 创建带有条件的可撤销可支付函数
  • 在可支付函数中实现自定义逻辑
  • 了解消息调用及其在以太坊虚拟机(EVM)中的相关性

Payable 函数

在Solidity中,可支付函数是一种能让智能合约接受以太币的函数。它们帮助开发人员管理接收到的以太币并在接收到时采取行动。例如,一个简单的可支付函数可以为筹款活动收集以太币捐款。

以下是一个基本的代码示例:

pragma solidity ^0.8.0;
contract Fundraiser {
    function donate() external payable {
        // Ether is received and stored in the contract's balance
        // You can perform any other actions with the Ether received here - for example, sending it to some other address etc.
    }
}

在这个例子中,当调用donate函数时,它会接受捐赠者发送的Ether并将其添加到合约的余额中。

关键字payable允许某个人向合约发送ether并运行代码来处理此存款。

这段代码可能会记录事件,修改存储以记录存款,或者如果选择这样做,甚至可能撤销交易。

当开发人员显式标记一个带有可支付类型的智能合约时,他们表示“我希望将ether发送到这个函数”。要理解这为什么很重要,想象一下如果有人将ether发送到一个合约中,但开发人员没有编写代码处理该事件,那将会有多糟糕。在那种情况下,ether可能会永久锁定,或者无法被其预期的接收方提取。

如何向智能合约发送以太币

发送以太币是以太坊虚拟机(EVM)的本地功能。这与在EVM中进行任何其他转账不同,该转账需要开发人员编写自定义逻辑来处理转账(例如NFT或ERC20)。

当有人向智能合约发送以太币时,他们通过交易本身的“value”字段进行操作。让我们看看JSON格式的交易内容:

{
    "to": "0x5baf84167cad405ce7b2e8458af73975f9489291",
    "value": "0xb1a2bc2ec50000", // 1 ether 
    "data": "0xd0e30db0" // deposit() 
    // ... other properties
}

此交易将1个以太币发送到地址0x5baf84167cad405ce7b2e8458af73975f9489291

如果此地址是一个智能合约,它将尝试解析calldata(data)以确定此用户试图调用哪个智能合约函数(在这种情况下是deposit())。

根据函数支付或非支付的情况,将发生以下两种情况之一:

  • 如果函数是一个可支付函数,那么它将运行逻辑。
  • 如果函数不可支付,则交易将恢复并返回资金,减去交易的燃气成本。

什么是 Solidity 可支付函数的示例?

这是一个使用Solidity的基本可支付函数示例,其中包括“deposit”函数:

function deposit() payable external {
    // no need to write anything here!
}

注意,在这种情况下,我们没有在 deposit 函数主体中编写任何代码。编写一个可支付的函数就足以接收以太币,您可能不需要编写任何逻辑。

例如,如果这是一个可支付的智能合约,由慈善机构控制,接受加密货币捐款,也许用户只需调用 deposit ,慈善机构最终就能够将这些捐款提取到他们选择的地址。在这种情况下,编写一个 receive 函数可能更好:

receive() external payable {
    // this built-in function doesn't require any calldata,
    // it will get called if the data field is empty and 
    // the value field is not empty.
    // this allows the smart contract to receive ether just like a 
    // regular user account controlled by a private key would.
}

什么是一个Solidity可支付函数的反转示例?

一个可付款的智能合约函数可以回滚。这是一个可回滚的可付款函数示例,它使用两个require语句来验证msg.valuebalances[msg.sender]

mapping(address => uint) balances;
function deposit() payable external {
    // deposit sizes are restricted to 1 ether
    require(msg.value == 1 ether);
    // an address cannot deposit twice
    require(balances[msg.sender] == 0);
    balances[msg.sender] += msg.value;
}

如果任何一个require语句不为真,则交易将回滚并发送者将收回他们的资金。

为什么我们要在可支付函数中编写逻辑?

如果我们有一个智能合约,需要跟踪谁存入了哪些以太币,我们可以在存储中跟踪它:

mapping(address => uint) balances;
function deposit() payable external {
    // record the value sent 
    // to the address that sent it
    balances[msg.sender] += msg.value;
}

这里的msg.value对应着我们在“如何发送以太币”部分看到的交易中编码的value字段。作为Solidity开发人员,我们可以利用消息值来记录存款并将其映射到该交易地址的某些内部余额。

为什么叫做msg.value?

在以太坊虚拟机(EVM)中,与智能合约的交互被称为“消息调用”。这适用于用户直接调用智能合约的情况,也适用于智能合约调用另一个智能合约的情况(内部交易)。

可支付的Solidity函数

简而言之,一个可支付的函数是一个可以接收以太币的函数。它为开发者提供了回应以太币存款进行记录或任何其他必要逻辑的机会。

以上就是Solidity可支付函数使用详解的详细内容,更多关于Solidity可支付函数的资料请关注脚本之家其它相关文章!

相关文章

  • 使用Javascript开发sliding-nav带滑动条效果的导航插件

    使用Javascript开发sliding-nav带滑动条效果的导航插件

    这篇文章主要介绍了使用Javascript开发sliding-nav带滑动条效果的导航插件,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • BootStrap实现鼠标悬停下拉列表功能

    BootStrap实现鼠标悬停下拉列表功能

    这篇文章主要介绍了BootStrap实现鼠标悬停下拉列表功能,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-02-02
  • 微信小程序与公众号实现数据互通的方法

    微信小程序与公众号实现数据互通的方法

    这篇文章主要介绍了微信小程序与公众号实现数据互通的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • BootStrap组件之进度条的基本用法

    BootStrap组件之进度条的基本用法

    bootstrap组件在前端开发中经常会用到,今天小编通过本文给大家分享bootstrap组件之进度条的基本用法,需要的朋友参考下吧
    2017-01-01
  • javascript实现的listview效果

    javascript实现的listview效果

    javascript实现的listview效果...
    2007-04-04
  • JavaScript数据检测方法的全面指南

    JavaScript数据检测方法的全面指南

    在 JavaScript 开发中,准确检测数据类型是保证代码健壮性的基础,JavaScript 提供了多种数据类型检测方法,每种方法都有其适用场景和局限性,本文将全面介绍 JavaScript 中各种数据检测方法,需要的朋友可以参考下
    2025-07-07
  • Jupyter Notebook运行JavaScript的方法

    Jupyter Notebook运行JavaScript的方法

    Jupyter Notebook是一块所见即所得的画布,通过在浏览器上编辑代码,让开发人员实现展示与快速迭代的利器,本文主要介绍了Jupyter Notebook运行JavaScript的方法,感兴趣的可以了解一下
    2021-05-05
  • JavaScript将数组转换成CSV格式的方法

    JavaScript将数组转换成CSV格式的方法

    这篇文章主要介绍了JavaScript将数组转换成CSV格式的方法,实例分析了javascript使用valueOf方法将数组值转换为csv格式字符串的技巧,非常具有实用价值,需要的朋友可以参考下
    2015-03-03
  • 微信小程序自定义滚动选择器

    微信小程序自定义滚动选择器

    这篇文章主要为大家详细介绍了微信小程序自定义滚动选择器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • JAVA Web实时消息后台服务器推送技术---GoEasy

    JAVA Web实时消息后台服务器推送技术---GoEasy

    本篇文章主要介绍了PHP实现Web实时消息后台服务器推送技术,这里整理了详细的代码,有需要的小伙伴可以参考下。
    2016-11-11

最新评论