Solidity
如何“.call”另一個使用“.call”的合約的函式
所以,我正在學習高級智能合約開發。兩天前,我學習了 Reentrancy 攻擊,然後我還創建了兩個合約
Protocol.sol
(脆弱合約)+Hacker.sol
(攻擊者合約)來測試我的知識。我能夠順利執行所有操作,我在我的Hacker.sol
. 今天了解到,我們可以在不導入 ABI 的情況下呼叫另一個智能合約函式,只需通過“.call”和委託呼叫使用合約地址。所以,為了測試我的知識,我使用了 Protocol.sol 和 Hacker.sol。
Protocol.sol
:// SPDX-License-Identifier: MIT pragma solidity 0.8.7; contract Protocol { mapping(address => uint256) public balances; function deposit() public payable { balances[msg.sender] += msg.value; } function withdraw() public payable { require(balances[msg.sender] > 0, "BRUH"); (bool success, ) = (msg.sender).call{value: 1 ether}(""); require(success); balances[msg.sender] = 0; } function getBalance() public view returns(uint256) { return address(this).balance; } }
Hacker.sol
:// SPDX-License-Identifier: MIT pragma solidity 0.8.7; contract Hacker { function protocolDeposit(address protocol) public payable { (bool success,) = protocol.call{value: msg.value}(abi.encodeWithSignature("deposit()")); require(success, "call failed"); } function attack(address protocol) public payable { (bool hacked,) = protocol.call(abi.encodeWithSignature("withdraw()")); require(hacked, "attack failed"); } // fallback() external payable { // (bool hacked,) = protocol.call(abi.encodeWithSignature("withdraw()")); // require(hacked, "hack failed"); // } function rektMoney() public view returns(uint256) { return address(this).balance; } }
我現在面臨的問題是呼叫
withdraw()
func。我可以將 ETHHacker.sol
存入Protocol.sol
,但我無法withdraw()
使用attack
可能是因為裡面的
withdraw
funcprotocol.sol
也是call
用來轉賬ETH的。如何“.call”另一個使用“.call”的合約的函式?
我該如何解決這個問題?請幫助,在此先感謝
你需要刺穿
receive
或fallback
運作才能在你的黑客合約中收到錢。// function to receive eth from others receive() external payable { emit receivedMoney(msg.sender, msg.value); // event to emit when receive eth , this is optional }
因為你還沒有實現這就是你面臨這個問題的原因。
還有一件事你需要讓你
withdraw()
和attack(address protocol)
功能得到支付,因為我們不接受該功能中使用者的任何 ETH。我希望您理解,如果不評論以更好地理解。
祝你有美好的一天😊