1

我一直在关注 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})

我知道这告诉以太坊虚拟机使用接口的功能在SomeAddress(我将称之为SomeContractinterface.IWeth(SomeAddress)创建合同实例。

我想确认以下几点:

wethSomeContract共享同一个地址吗?

以下状态更改是否会产生相同的结果?

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

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

2 回答 2

1

假设你有contractBcontractA。在里面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,你会得到更新的价值。

于 2022-02-11T05:55:00.237 回答
0

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

交易哈希合约A

在contractB上调用addToIncrement函数时出错

于 2022-02-13T20:48:54.137 回答