• 【智能合约】合约转账


    合约可以有钱

    合约可以有钱!
    合约与其他合约或者EOA之间可以转账

    gas和gas price

    https://github.com/wolflo/evm-opcodes/blob/main/gas.md
    实际的gas是完全由执行逻辑决定的,一个固定的逻辑的合约函数执行,gas没有变化,有变化的是gas的价格,是由transaction来设定交易发起者设定最多消耗多少:gaslimit;剩下没用完的gas会“退款”, 交易失败时,已经用了
    的gas不退,合约之间函数调用可以设置gaslimit:调用者来控制gas消耗

    转账与函数调用

    • 没有单独的转账逻辑,转账是与函数调用一起发生的。
    • 转账就是函数调用,调用时加上调用选项{gas[gaslimit]:,value:}ccontracta.foo{option}();
    • 被调用者加上payable修饰符

    几点说明

    • 通过静态函数调用转账fname{gas:, value:}(),被调用的普通函数用payable修饰,接收转账通过动态函数调用aadress.call{gas:, value:}(calldata)转账。
    • 被调用函数payble修饰如果调用没带钱,被调用者不必payable;
    • 如果带钱了,但是被调用者没有payable,就会失败
    • 函数调用都可以附带做转账操作

    示例代码

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.13;
    contract ReceiveEther {
     uint public x;
     event Fallback(bytes cdata, uint value, uint gas);
     event Foo(bytes cdata, uint value, uint gas);
     
     // Fallback function is called when msg.data is not empty
     fallback() external {
     emit Fallback(msg.data, 0, gasleft());
     }
     function getBalance() public view returns (uint) {
     return address(this).balance;
     }
     function foo() public payable {
     emit Foo(msg.data, msg.value, gasleft());
     }
    }
    contract SendEther {
     function sendViaCall(address payable _to) public payable {
     (bool sent, ) = _to.call{value: msg.value}("");
     require(sent, "Failed to send Ether");
     }
     function sendViaFoo(address payable _to) public payable {
     ReceiveEther re = ReceiveEther(_to);
     re.foo{gas:2300, value: msg.value}();
     //msg.value是sendViaFoo的调用者发送给SendEther
     
     }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
  • 相关阅读:
    基于flask部署paddleocr
    label问题排查:打不开标注好的图像
    vue.js毕业设计,基于vue.js前后端分离教室预约小程序系统设计与实现
    Vue-自定义指令
    怎么能避免写出慢SQL?
    linux shell awk sed 使用
    【附源码】计算机毕业设计SSM时事新闻管理系统
    O - Muddy roads
    机器学习技术(八)——朴素贝叶斯算法实操
    【ESP32_8266_WiFi (八)】Stream
  • 原文地址:https://blog.csdn.net/weixin_42918559/article/details/127825390