假设你有contractB
和contractA
。在里面contractB
你想与之交互contractA
但你不知道contractA的代码。你只知道合约A的接口和地址。在这种情况下,您通过接口与contractB内部的contractA进行交互,您对contractA所做的任何更改都将反映在区块链中的contractA中。
在您打电话的问题中,您weth.deposit
实际上是在修改给定地址的合同状态。
您可以在Remix上轻松测试。
假设你有 contractA 和它的接口:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface InterfaceA {
function count() external view returns (uint256);
function increment() external;
}
contract contractA {
uint256 number = 0;
function count() external view returns (uint256) {
return number;
}
function increment() external {
number++ ;
}
}
你编译它然后部署它。(确保在部署时选择contractA而不是interfaceA)。获取部署地址。然后创建合约B:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import './contractA.sol' ;
contract contractB {
address addressA;
constructor (address _addressA) {
addressA = _addressA;
}
function getCount() external view returns (uint256) {
InterfaceA b = InterfaceA(addressA);
return b.count();
}
function addToIncrement() external {
InterfaceA b = InterfaceA(addressA);
b.increment();
}
}
现在当你部署它时,由于我写了一个带参数的构造函数,你需要传递 cotractA 的地址。然后调用addToIncrement()
. contractB
这将调用 的increment
函数contractA
。现在去contractA
打电话count
,你会得到更新的价值。