在 Solidity 中 payable() 函数

kas*_*per 3 ethereum solidity

我真的不明白 payable() 我应该使用

contract(){
receive() {
 somefunction()
}

somefunction() payable external{
}
Run Code Online (Sandbox Code Playgroud)

或者使用就足够了

contract(){

somefunction() payable external{}
}
Run Code Online (Sandbox Code Playgroud)

它们是否需要一起使用 - 我们使用回退功能和一些正常的应付修饰符,两者使用或仅使用回退或仅使用某些功能有什么区别?如果有 2 个需要修饰符的函数怎么办,你能给我一些例子吗?

小智 15

payable修饰符的存在意味着该函数可以处理非零 Ether 值的交易。如果一笔传输 Ether 的交易来到合约并调用某个函数 X,那么如果该函数 X 没有payable修饰符,那么该交易将被拒绝。回退函数旨在处理合约中的交易中根本没有调用任何函数的情况(例如,交易只是传输以太币),或者调用了不在合约中的函数。在这种情况下,与上面描述的类似 - 如果后备函数具有应付修饰符,那么它将能够接受以以太币传输的交易,如果没有,那么它们将被拒绝。

因此,在您的情况下,如果交易中正在传输以太币,则函数somefunction将被成功调用,而当调用接收函数时,交易将被拒绝。

contract(){
receive() {
 somefunction()
}

somefunction() payable external{
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,应付修改器严格处理 ETH 支付,而 ERC-20 等代币在与智能合约交互时具有不同的机制。 (3认同)