对应崔棉大师 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. JS如何返回异步调用的结果?

    这个问题作者认为是所有从后端转向前端开发的程序员,都会遇到的第一问题.JS前端编程与后端编程最大的不同,就是它的异步机制,同时这也是它的核心机制. 为了更好地说明如何返回异步调用的结果,先看三个尝试异 ...

  2. 【转载】【Word】项目编号应用样式后出现黑框的解决方案

    本文中的宏代码来自: https://www.zhihu.com/question/38985919 Word使用项目编号后,出现黑框,如下图所示: 网上大多数解决方案在重新打开文档后,依然还是有黑框 ...

  3. FPGA:乒乓球比赛模拟机的设计

    简介 开发板:EGO1 开发环境:Windows10 + Xilinx Vivado 2020 数字逻辑大作业题目 7: 乒乓球比赛模拟机的设计 乒乓球比赛模拟机用发光二极管(LED)模拟乒乓球运动轨 ...

  4. .net core操作MongoDB

    前言 现实中认识的一个搞java(百万富婆)的大佬,已经转行做抖音主播了,搞技术的只能赶在年前再水一篇博客,不足之处欢迎拍砖,以免误人子弟,呔,真是太难受了 环境准备 .net core 3.1 Mo ...

  5. Java学习笔记:2022年1月9日(其一)

    Java学习笔记:2022年1月9日(其一) 摘要:这篇笔记主要记录了Java运行时中的两种变量.以及参数的两种传递方式. 目录 Java学习笔记:2022年1月9日(其一) 1.不同变量的详细探讨 ...

  6. KMP 与 Z 函数

    \(\text{By DaiRuiChen007}\) 一.KMP 算法 I. 问题描述 在文本串 \(S\) 中找到模式串 \(T\) 的所有出现,其中 \(|S|=n,|T|=m\) II. 前置 ...

  7. 从0到1手把手教你实现vite系列--重写依赖请求路径,处理/@modules/vue引用

    前面以及写了三篇了,这是第四篇,等我写完就合并起来哦 这个是第一篇的链接:vite原理,创建项目,基础知识 这个是第二篇的链接Vite-中篇-通过服务访问静态资源以及重写请求路径 这个是第三篇的链接# ...

  8. flutter 2.x运行flutter run 报错Cannot run with sound null safety, because the following dependenciesdon'

    flutter 2.x运行flutter run 报错Cannot run with sound null safety, because the following dependenciesdon' ...

  9. 记一次CVE实战挖掘记录

    CVE实战挖掘记录 前一段时间在学习代码审计,然后为了学习就开始在github上面找开源的项目进行练手学习代码审计,这样就可以获取CVE编号. 0x01 cve编号获取流程 首先登录CVE官方网站,选 ...

  10. Unity之Android端权限申请

    Unity之Android端权限申请 Unity之Android端权限申请 前言 开篇废话 Unity版本 正题 前期准备 挂载脚本 打包发布 安装App 查看结果 结尾 唠家常 今日无推荐 Unit ...