对应崔棉大师 26-40课程
https://www.bilibili.com/video/BV1yS4y1N7yu/?spm_id_from=333.788&vd_source=c81b130b6f8bb3082bdb42226729d69c

部署合约

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7; contract TestContract1{
address public owner = msg.sender; function setOwner(address _owner) public{
require(owner== msg.sender,"not owner");
owner = _owner;
} } contract TestContract2{
address public owner = msg.sender;
uint public value = msg.value;
uint public x;
uint public y;
constructor(uint _x,uint _y){
x = _x;
y = _y;
}
} contract Proxy{
function deploy() public payable returns(address addr){
//强转为address类型 否则报错 不能进行隐式转换
// owner地址为Proxy地址
addr = address(new TestContract1());
return addr;
}
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
contract Proxy {
    event Deploy(address); //事件
    fallback() external payable {} //可能接受主币要有回退函数
    receive () payable external {} //
    function deploy(bytes memory _code) external payable returns (address addr) {
        assembly { //内联汇编
            // create(v, p, n)
            // v = amount of ETH to send 发送eth金额
            // p = pointer in memory to start of code 合约二进制编码,再偏移20
            // n = size of code 合约二进制编码长度
            addr := create(callvalue(), add(_code, 0x20), mload(_code)) //隐式返回
        }
        // return address 0 on error
        require(addr != address(0), "deploy failed"); //确实部署成功返回地址不为0
        emit Deploy(addr);
    }
    function execute(address _target, bytes memory _data) external payable {
        //_target目标地址
        (bool success, ) = _target.call{value: msg.value}(_data);
        require(success, "failed");
    }
}
contract TestContract1 {
    address public owner = msg.sender;
    function setOwner(address _owner) public {
        require(msg.sender == owner, "not owner");
        owner = _owner;
    }
}
contract TestContract2 {
    address public owner = msg.sender;
    uint public value = msg.value;
    uint public x;
    uint public y;
    constructor(uint _x, uint _y) payable {
        x = _x;
        y = _y;
    }
}
contract Helper {
    function getBytecode1() external pure returns (bytes memory) {
        bytes memory bytecode = type(TestContract1).creationCode;// 获取二进制编码
        return bytecode;
    }
    function getBytecode2(uint _x, uint _y) external pure returns (bytes memory) {
        bytes memory bytecode = type(TestContract2).creationCode;// 获取二进制编码
        return abi.encodePacked(bytecode, abi.encode(_x, _y)); //构造函数编码后拼接
    }
    function getCalldata(address _owner) external pure returns (bytes memory) {
        return abi.encodeWithSignature("setOwner(address)", _owner); //构造函数call编码
    }
}
 

存储位置

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
contract DataLocations {
    struct MyStruct{
        uint foo;
        string text;
    }
    mapping(address => MyStruct) public MyStructs;
    function examples(string memory  _x,uint[] calldata _y) external{
        MyStructs[msg.sender] = MyStruct({foo:123,text:"bar"});
        //状态变量
        MyStruct storage write = MyStructs[msg.sender];
        write.text = "foo";
        //局部变量
        MyStruct memory read = MyStructs[msg.sender];
        read.foo = 456;
        //节省gas:calldata传递参数时候不需要重新赋值 memory传递参数需要重新赋值
        calldata_fun(_x,_y);
    }
    function calldata_fun(string memory  _x,uint[] calldata _y )  private pure returns(uint,string memory){
        uint y = _y[0];
        string memory x = _x;
        return (y,x);
    }
}

简单存储


// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
contract SimpleStorage {
    string public text;
    // transaction cost 27359 gas 交易消耗gas (包括execution cost)
    // execution cost   5851 gas evm执行消耗gas
    function memory_set(string memory _input) external{
            text = _input;
    }
    // transaction cost 26855 gas
    // execution cost   5347 gas
    //节省gas:calldata比memory 执行gas少
    function calldata_set(string calldata _input) external{
            text = _input;
    }
}

待办事项列表


// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
contract ToDoList {
    struct Todo{
        string text;
        bool completed;
    }
    Todo[] public todos;
    function create(string calldata _text) external{
        todos.push(Todo({
            text:_text,
            completed:false
        }));
    }
    function updateText(uint _index,string calldata _text) external{
        //节省gas:单个参数更新下面的方式
        todos[_index].text = _text;
        // 节省gas:多个参数更新下面的方式
        // Todo storage t = todos[_index];
        // t.text = "a";
        // t.text = "b";
        // t.text = "c";
        // t.text = "d";
    }
    function get(uint _index) external view returns(string memory,bool){
        //从storage到return复制一次
        //Todo storage todo = todos[_index];
       
        //storage到memory到memory 复制两次
        Todo memory todo = todos[_index];
        return (todo.text,todo.completed);
    }
    function toggleCompleted(uint _index) external {
        todos[_index].completed = !todos[_index].completed;
    }
}

事件


// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
contract Event {
    // Event declaration
    // Up to 3 parameters can be indexed. 一个时间最多定义三个索引
    // Indexed parameters helps you filter the logs by the indexed parameter
    event Log(address indexed sender, string message);
    event AnotherLog();
    function test() public {
        emit Log(msg.sender, "Hello World!");
        emit Log(msg.sender, "Hello EVM!");
        emit AnotherLog();
    }
}

继承


// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
contract A {
    function foo() public pure virtual returns (string memory) {
        return "A";
    }
    function bar() public pure virtual returns (string memory) {
        return "A";
    }
    function barz() public pure virtual returns (string memory) {
        return "A";
    }
}
// Contracts inherit other contracts by using the keyword 'is'.
contract B is A {
    // Override A.foo()
    function foo() public pure virtual override returns (string memory) {
        return "B";
    }
    function bar() public pure virtual override returns (string memory) {
        return "B";
    }
}
contract C is B {
    // Override A.foo()
    function bar() public pure virtual override returns (string memory) {
        return "C";
    }
}

多线继承


// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
    //  X
    // / \
    // Y  \
    // \  /
    //   Z
 
contract X {
    function foo() public pure virtual returns (string memory) {
        return "X";
    }
    function bar() public pure virtual returns (string memory) {
        return "X";
    }
    function _X() public pure  returns (string memory) {
        return "X";
    }
}
// Contracts inherit other contracts by using the keyword 'is'.
contract Y is X {
    // Override A.foo()
    function foo() public pure virtual override returns (string memory) {
        return "Y";
    }
    function bar() public pure virtual override returns (string memory) {
        return "Y";
    }
    function _Y() public pure  returns (string memory) {
        return "Y";
    }
}

//按基类和派生顺序继承

contract Z is X,Y {
    // Override A.foo()
    function bar() public pure virtual override(X,Y) returns (string memory) {
        return "Z";
    }
    function foo() public pure virtual override(X,Y) returns (string memory) {
        return "Z";
    }
    function _Z() public pure  returns (string memory) {
        return "Z";
    }
}

运行父级合约构造函数


// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
contract S {
   
    string public text;
    constructor(string memory _text){
        text = _text;
    }
 
}
contract T {
   
    string public name;
    constructor(string memory _name){
        name = _name;
    }
 
}
//已知构造函数
contract V is S("s"),T("t") {
   
 
}
//未知构造函数
contract VV is S,T {
   
    constructor(string memory _text,string memory _name) S(_text) T(_name){
       
    }
 
}
//混合使用
contract VVV is S("s"),T {
   
    constructor(string memory _name) T(_name){
       
    }
 
}

调用父级合约函数


// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
/* Inheritance tree
   A
 /  \
B   C
 \ /
  D
*/
contract A {
    event Log(string message);
    function foo() public virtual {
        emit Log("A.foo called");
    }
    function bar() public virtual {
        emit Log("A.bar called");
    }
}
contract B is A {
    function foo() public virtual override {
        emit Log("B.foo called");
        //第一种调用方式
        A.foo();
    }
    function bar() public virtual override {
        emit Log("B.bar called");
        //第二种调用方式
        super.bar();
    }
}
contract C is A {
    function foo() public virtual override {
        emit Log("C.foo called");
        A.foo();
    }
    function bar() public virtual override {
        emit Log("C.bar called");
        super.bar();
    }
}
//当 B , C 到基类长度相等时,只调用最后面的B
contract D is  C,B {
    // Try:
    // - Call D.foo and check the transaction logs.
    //   Although D inherits A, B and C, it only called C and then A.
    // - Call D.bar and check the transaction logs
    //   D called C, then B, and finally A.
    //   Although super was called twice (by B and C) it only called A once.
    function foo() public override(B, C) {
        super.foo();
    }
    function bar() public override(B, C) {
        super.bar();
    }
}

可视范围


// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
contract VisibilityBase{
    uint private x;
    uint internal y;
    uint public z;
    function privateFunc() private pure returns(uint){
    }
    function internalFunc() internal pure returns(uint){
    }
    function publicFunc() public pure returns(uint){
    }
    function externalFunc() external pure returns(uint){
    }
    function examples() public view returns(uint res){
        res = x + y + z;
        privateFunc();
        internalFunc();
        publicFunc();
        //先到外部再call
        this.externalFunc();
    }
}

不可变量


// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
contract Immutable {
    // 节省gas:但是必须在部署合约时赋值
    address public immutable MY_ADDRESS;
    uint public immutable MY_UINT;
    constructor(uint _myUint) {
        MY_ADDRESS = msg.sender;
        MY_UINT = _myUint;
    }
}

支付ETH


// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
contract Payable {
    /*地址有两种类型
    address
    payable address 多了两个成员方法send和transfer
    send方法相比较transfer方法来说更“底层”一些,如果send方法执行失败,并不会抛出异常,而是返回false。
    */
    address payable public owner;
    // 普通address需要强转payable address
    constructor() payable {
        owner = payable(msg.sender);
    }
    function deposit() public payable {}
    function getBalance() public view returns(uint){
        return address(this).balance;
    }
}

回退函数


// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
contract Fallback {
    event Log(string message,uint gas);
    /*      fallback() or receive() ?
                    ETH Send
                       |
                msg.data is empty?
                    /       \
                   /         \
                yes           no
                |              |
        receive() exists?    fallback()
             /    \
            /      \
           yes      no
           |         |
        receive()  fallback()
    */
    fallback() external payable {
     
        emit Log("fallback()",gasleft());
    }
    receive() external payable {
        emit Log("receive()",gasleft());
    }
    // Helper function to check the balance of this contract
    function getBalance() public view returns (uint) {
        return address(this).balance;
    }
}
contract SendToFallback {
    function transferToFallback(address payable _to) public payable {
        _to.transfer(msg.value);
    }
    function callFallback(address payable _to) public payable {
        (bool sent, ) = _to.call{value: msg.value}("123");
        require(sent, "Failed to send Ether");
    }
}

发送ETH

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
contract ReceiveEther {
    event Log(uint amount,uint gas);
    receive() external payable {
        emit Log(msg.value,gasleft());
    }
}
contract SendEther {
    event Log(bool sent);
    function sendViaTransfer(address payable _to) public payable {
        // This function is no longer recommended for sending Ether.
        _to.transfer(msg.value);
    }
    function sendViaSend(address payable _to) public payable {
        // Send returns a boolean value indicating success or failure.
        // This function is not recommended for sending Ether.
        bool sent = _to.send(msg.value);
        emit Log(sent);
        require(sent, "Failed to send Ether");
    }
    function sendViaCall(address payable _to) public payable {
        // Call returns a boolean value indicating success or failure.
        // This is the current recommended method to use.
        (bool sent, bytes memory data) = _to.call{value: msg.value,gas:222222}("");
        require(sent, "Failed to send Ether");
    }
}

钱包合约


// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
contract EtherWallet {
    address payable public owner;
    constructor() {
        owner = payable(msg.sender);
    }
    receive() external payable {}
    function withdraw(uint _amount) external {
        require(msg.sender == owner, "caller is not owner");
        payable(msg.sender).transfer(_amount);
    }
    function getBalance() external view returns (uint) {
        return address(this).balance;
    }
}
 
 

Solidity8.0-02的更多相关文章

  1. 驱动开发学习笔记. 0.02 基于EASYARM-IMX283 烧写uboot和linux系统

    驱动开发读书笔记. 0.02 基于EASYARM-IMX283 怎么烧写自己裁剪的linux内核?(非所有arm9通用) 手上有一块tq2440,但是不知道什么原因,没有办法烧boot进norflas ...

  2. KmdKit4D 0.01正式版发布了(0.02版已放出)(Delphi做驱动)

    此版本较0.01预览版已经有了脱胎换骨的变化,主要表现在以下几个方面:    1.对程序的结构进行了调整,将原来的ntutils.dcu分成fcall.dcu.halfcall.dcu和macros. ...

  3. Hdu 2955 Robberies 0/1背包

    Robberies Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  4. ASP.Net MVC3安全升级导致程序集从3.0.0.0变为3.0.0.1

    开发环境一般引用的是本机 C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 3\Assemblies下的System.Web.Mvc.dll,当 ...

  5. CentOS-6.5安装zabbix 3.0.4

    关闭selinux [root@localhost /]# sed -i "s#SELINUX=enforcing#SELINUX=disabled#g" /etc/selinux ...

  6. MVC3.0 EF增删改查的封装类

    本人亲身使用EF CodeFirst,因为增删改查都是使用EF内置的一些方法,我想把它封装到一个类调用就行了.结合网上的资料和自己的整理,若有不对的地方望斧正,感激不尽.直接上代码吧.我就用新闻的增删 ...

  7. CentOS6.8下部署Zabbix3.0

    Centos6.8下部署安装zabbix3.0: 环境要求 PHP >= 5.4  (CentOS6默认为5.3.3,需要更新) curl >= 7.20 (如需支持SMTP认证,需更新) ...

  8. [ActionScript 3.0] AS3.0 下雨及涟漪效果

    帧代码: stage.frameRate = 80; function init(x1:Number,y1:Number) { var mc:MovieClip=new MovieClip(); ad ...

  9. Ext.NET 4.1.0 搭建页面布局

    Ext.NET目前的最新版本为4.1.0,可以从官网:ext.net上下载,具体下载网址为:http://ext.net/download/. 文件下载下来后,在\lib\目录下存在3个文件夹,分别对 ...

  10. Grasshopper 2.0 MP Color FireWire 1394b (Sony ICX274)

        相机参数如下,参见这里: Resolution 1624 x 1224 Frame Rate 30 FPS Megapixels 2.0 MP Chroma Color Sensor Name ...

随机推荐

  1. 【Spring专题】「开发指南」夯实实战基础功底之解读logback-spring.xml文件的详解实现

    logback的maven配置 <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j- ...

  2. VS2022,VS2019最新安裝方法

    直接参照:  https://www.bilibili.com/read/cv12364240/ 2022年5月30浩,亲测可用 1.下载notepad++ (必须) 2. 去微软官网下载 对应的安装 ...

  3. 【Redis技术专区】「优化案例」谈谈使用Redis慢查询日志以及Redis慢查询分析指南

    前提介绍 本篇文章主要介绍了Redis的执行的慢查询的功能的查询和配置功能,从而可以方便我们在实际工作中,进行分析Redis的性能运行状况以及对应的优化Redis性能的佐证和指标因素. 在我们5.0左 ...

  4. DML_修改数据

    DML_修改数据 修改数据: 语法: update 表名 set 列名1 = 值1,列名2 = 值2, ... [ where 条件 ] ; 注意: 1. 如果不加任何条件,则会将表中所有记录全部修改 ...

  5. 结构性模式 - 适配器模式Adapter

    学习而来,代码是自己敲的.也有些自己的理解在里边,有问题希望大家指出. 模式的定义与特点 适配器模式(Adapter)的定义如下:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不 ...

  6. 【Android】Android 源码方式使用 opencv 库文件

    使用方法 opencv 官方的 SDK 已经有编译好的 so 库,我们可以直接使用,因此我们只需要将平台架构对应的 so 库文件以及头文件提取出来,使用 Android.mk 进行预安装,然后在需要使 ...

  7. Docker命令的自动补齐

    Docker命令的自动补齐 背景 在linux下输入命令或文件都是可以自动补齐的,这个特性极大的提高了我们的效率,多数情况下我们很少用命令参数的自动补齐. 但对docker git这类参数特别多的命令 ...

  8. drf-序列化器、反序列化、反序列化校验

    1.APIView执行流程 1.之前我们是基于django原生的View编写接口,drf提供给咱们的一个类APIView,以后使用drf写视图类,都是继承这个类及其子类,APIView本身就是继承了D ...

  9. react 高效高质量搭建后台系统 系列 —— 表格的封装

    其他章节请看: react 高效高质量搭建后台系统 系列 表格 有一种页面在后台系统中比较常见:页面分上下两部分,上部分是 input.select.时间等查询项,下部分是查询项对应的表格数据.包含增 ...

  10. 面向对象程序设计(二):C++模板初探

    背景:老师留了一个作业,对两个数组进行相加,但是总是会出现错误:首先我们需要知道当数组作为参数传递的时候是不能用 sizeof 的,因为当数组传入子函数就变成了普通的数组头:这时候使用 sizeof ...