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可支付函数的资料请关注脚本之家其它相关文章!

相关文章

  • js获取视频时长代码

    js获取视频时长代码

    下面的这段js获取视频时长代码是网上找的,还没有测试,需要的朋友可以参考下
    2014-04-04
  • DOM节点深度克隆函数cloneNode()用法实例

    DOM节点深度克隆函数cloneNode()用法实例

    这篇文章主要介绍了DOM节点深度克隆函数cloneNode()用法,实例分析了cloneNode()函数深度复制的操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-01-01
  • JavaScript 轮播图和自定义滚动条配合鼠标滚轮分享代码贴

    JavaScript 轮播图和自定义滚动条配合鼠标滚轮分享代码贴

    本文给大家分享一段js轮播图和自定义滚动条的代码片段,布局和样式小编没给大家多介绍,大家可以根据个人需求优化,具体实现代码,大家可以参考下面代码片段
    2016-10-10
  • 微信端调取相册和摄像头功能,实现图片上传,并上传到服务器

    微信端调取相册和摄像头功能,实现图片上传,并上传到服务器

    这篇文章主要介绍了微信端调取相册和摄像头功能图片上传服务器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • JavaScript实现网页端播放摄像头实时画面

    JavaScript实现网页端播放摄像头实时画面

    这篇文章主要介绍了如何利用JavaScript实现在网页端播放局域网(不能上云)或是广域网的摄像头的实时画面,文中的示例代码讲解详细,需要的可以参考一下
    2022-02-02
  • 微信小程序使用input组件实现密码框功能【附源码下载】

    微信小程序使用input组件实现密码框功能【附源码下载】

    这篇文章主要介绍了微信小程序使用input组件实现密码框功能,涉及input组件布局设置相关操作技巧,并附带源码供读者下载参考,需要的朋友可以参考下
    2017-12-12
  • js编写贪吃蛇的小游戏

    js编写贪吃蛇的小游戏

    本文为大家介绍的是使用JS写的贪吃蛇游戏,个人练习之用,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望对大家学习js有所帮助
    2015-12-12
  • 轻松掌握JavaScript享元模式

    轻松掌握JavaScript享元模式

    这篇文章主要帮助大家轻松掌握JavaScript享元模式,告诉大家想什么是js享元模式,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • javascript实现简易的计算器

    javascript实现简易的计算器

    这篇文章主要为大家详细介绍了javascript实现简易的计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-01-01
  • uniapp地图组件(map)使用与遇到的一些问题总结

    uniapp地图组件(map)使用与遇到的一些问题总结

    uniapp是用vue.js开发所有前端应用的框架,开发人员只需要编写一套代码就可以发布到安卓、iOS、H5和小程序、快应用等平台,下面这篇文章主要给大家介绍了关于uniapp地图组件(map)使用与遇到的一些问题,需要的朋友可以参考下
    2022-07-07

最新评论