通过接口创建的合约实例是否与原始部署的合约具有相同的地址?

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) 与接口的功能。

我想确认以下内容:

wethSomeContract 是否共享同一个地址?

以下状态变化是否会产生相同的结果?

weth.deposit({"from":account, "value": 0.01*10**18})

SomeContract.deposit({"from":account, "value": 0.01*10**18})

假设您有 contractBcontractA。在 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的地址。然后调用 contractBaddToIncrement()。这将调用 contractAincrement 函数。现在转到 contractA 并调用 count,您将获得更新的值。

我是 Solidity 的新手,我不清楚 contractA 的地址是部署 contractA 时在 Remix 控制台上指定的交易哈希参数(第一个字节),还是从中获取的帐户地址我部署了合同A。这个查询是因为当我尝试从 contractB 调用 addToIncrement 函数时出现错误,所以我猜它没有连接到 contractA。

Transaction hash contractA

Error while calling addToIncrement function on contractB