通过接口创建的合约实例是否与原始部署的合约具有相同的地址?
Does a contract instance created via interfaces have the same address as the original deployed contract?
我一直在关注 Solidity、区块链和智能合约课程——初学者到专家 Python 教程 (https://www.youtube.com/watch?v=M576WGiDBdQ&t=28658s)。我没有复制大量代码,而是尝试将我的问题概括如下:
考虑以下代码片段:
weth=interface.IWeth(SomeAddress)
tx=weth.deposit({"from":account, "value": 0.01*10**18})
我明白 interface.IWeth(SomeAddress)
告诉以太坊虚拟机在 SomeAddress 创建一个合约实例(我称之为 SomeContract) 与接口的功能。
我想确认以下内容:
weth
和 SomeContract
是否共享同一个地址?
以下状态变化是否会产生相同的结果?
weth.deposit({"from":account, "value": 0.01*10**18})
和
SomeContract.deposit({"from":account, "value": 0.01*10**18})
假设您有 contractB
和 contractA
。在 contractB
里面你想和 contractA
交互但是你不知道 contractA 的代码。你只知道contractA的接口和地址。在这种情况下,您通过接口与 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++ ;
}
}
你编译它然后部署它。 (确保在部署时 select contractA 而不是 interfaceA)。获取部署地址。然后创建contractB:
// 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的地址。然后调用 contractB
的 addToIncrement()
。这将调用 contractA
的 increment
函数。现在转到 contractA
并调用 count
,您将获得更新的值。
我是 Solidity 的新手,我不清楚 contractA 的地址是部署 contractA 时在 Remix 控制台上指定的交易哈希参数(第一个字节),还是从中获取的帐户地址我部署了合同A。这个查询是因为当我尝试从 contractB 调用 addToIncrement 函数时出现错误,所以我猜它没有连接到 contractA。
Transaction hash contractA
Error while calling addToIncrement function on contractB
我一直在关注 Solidity、区块链和智能合约课程——初学者到专家 Python 教程 (https://www.youtube.com/watch?v=M576WGiDBdQ&t=28658s)。我没有复制大量代码,而是尝试将我的问题概括如下:
考虑以下代码片段:
weth=interface.IWeth(SomeAddress)
tx=weth.deposit({"from":account, "value": 0.01*10**18})
我明白 interface.IWeth(SomeAddress)
告诉以太坊虚拟机在 SomeAddress 创建一个合约实例(我称之为 SomeContract) 与接口的功能。
我想确认以下内容:
weth
和 SomeContract
是否共享同一个地址?
以下状态变化是否会产生相同的结果?
weth.deposit({"from":account, "value": 0.01*10**18})
和
SomeContract.deposit({"from":account, "value": 0.01*10**18})
假设您有 contractB
和 contractA
。在 contractB
里面你想和 contractA
交互但是你不知道 contractA 的代码。你只知道contractA的接口和地址。在这种情况下,您通过接口与 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++ ;
}
}
你编译它然后部署它。 (确保在部署时 select contractA 而不是 interfaceA)。获取部署地址。然后创建contractB:
// 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的地址。然后调用 contractB
的 addToIncrement()
。这将调用 contractA
的 increment
函数。现在转到 contractA
并调用 count
,您将获得更新的值。
我是 Solidity 的新手,我不清楚 contractA 的地址是部署 contractA 时在 Remix 控制台上指定的交易哈希参数(第一个字节),还是从中获取的帐户地址我部署了合同A。这个查询是因为当我尝试从 contractB 调用 addToIncrement 函数时出现错误,所以我猜它没有连接到 contractA。
Transaction hash contractA
Error while calling addToIncrement function on contractB