Solidity
3級乙太傳輸
contract foster{ vulnerable v = new vulnerable(); attacker a = new attacker(address(v)); constructor() public payable{ // a.deposit(address(v)); // transferring 3 ethers to vulnerable contract and rest to the attacker contract // v.addNominee(address(a)); } function action() public payable{ a.deposit(address(v)); // transferring 3 ethers to vulnerable contract and rest to the attacker contract v.addNominee(address(a)); } function getTargetBalance() public view returns(uint256, uint256){ return (address(v).balance , address(this).balance); } function attack() public payable{ v.transact(); } }
這就是我想做的。我有兩個契約
attacker
,即vulnerable
具有以下定義。合約攻擊者
contract attacker{ constructor(address payable _vulnerableContract) public{ vulnerable v = vulnerable(_vulnerableContract); } function deposit(address payable _addr) payable public{ _addr.transfer(msg.value); } function() external payable{ } }
合約易受攻擊
contract vulnerable{ mapping (address => uint256) balance; uint256 _amount; function() external payable{ } function deposit() payable public{ address(this).transfer(_amount); } }
在
foster
契約中,我想為vulnerable
和分別創建一個實例attacker
。我想讓合約中的函式
action
呼叫foster
,a.deposit(address(v))
並將乙太幣從a的代表轉移到合約v
。這樣淨乙太幣就從呼叫賬戶轉移到合約實例v
。然後我想
a
作為被提名人添加到v
實例中。當我在做我在契約中所做的事情時,乙太幣會去
contract foster
而不是去v
。我怎樣才能讓它發生?我的最終目標是在呼叫時觸發一個
failed send()
錯誤v.transact
,因為我需要一些帶有contract v
. 我將在function() payable
後面contract a
添加一些失敗。
**找到解決方案。**謝謝,如果有人試圖這樣做。
我們需要在這裡做的事情是,在
a.deposit()
寄養契約中呼叫這里之後我們需要將乙太轉移到
v
. 我在action()
函式中添加了以下內容。它做所需的事情。a.deposit(address(v)); address(v).send(msg.value);
問題是醚首先轉移到
contract foster
,所以我們需要在這contract v
之後將它轉移到。它解決了3級乙太傳輸的問題。完整的解決方案位於以下要點連結: https ://gist.github.com/johnsoncarl/99d761df62da338a41ce3a3d6b162698