乐趣区

关于区块链: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())。

依据函数领取或非领取的状况,将产生以下两种状况之一:

  1. 如果函数是一个可领取函数,那么它将运行逻辑。
  2. 如果函数不可领取,则交易将复原并返回资金,减去交易的燃气老本。

什么是 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 函数

简而言之,一个 可领取 的函数是一个能够接管以太币的函数。它为开发者提供了回应以太币贷款进行记录或任何其余必要逻辑的机会。

本文由 mdnice 多平台公布

退出移动版