繁体   English   中英

以太坊中的接口和合约

[英]Interfaces and contracts in ethereum

我之前见过这个问题,但我仍然需要澄清一下接口中声明的函数到底在哪里完全定义? 我了解该界面布局并解释了另一个合约(contractB)可以使用的功能,但是该界面是否只是一种方便,而不是 contractB 使用这些功能的必要条件? 在我看来,我将 delegateCall 与接口混淆了。 如果我们想从其他合约调用函数,为什么要使用接口而不是委托调用? 如果接口指向的合约地址已经定义了函数,但是我没有在接口中勾勒出来,那么在contractB中还能使用吗?

例如,下面我知道我可以在众筹中使用转移功能,但转移在哪里? 假设合约 A 定义了 makepovertyhistory() 函数,但我没有在接口代币中提及它……我还能在众筹合约中使用它吗?

如果我在接口内重新定义传递函数,它是否会覆盖在众售合约中实例化的地址处定义的传递函数? 我不确定我是否正确地考虑了这一切,所以我想我会问更详细的问题,以防其他人发现通用答案仍然是通用的,以构建正在发生的事情的视觉效果。

区分为什么我们会使用接口而不是将合约直接继承到我当前创建的合约中可能会有所帮助

interface token {
    function transfer(address receiver, uint amount);
}

contract Crowdsale {
    address public beneficiary;
    uint public fundingGoal;
....
....
..

Solidity 中的接口实际上与任何 OOP 中的接口没有什么不同。 它们允许您在不知道底层实现的情况下对存根进行编码。 如果需要实现该接口的合约的新版本,则无需更改使用它的合约。

这使您可以解决智能合约中的常见问题之一:可升级合约。 通过使用接口,您可以部署合约的新版本,然后使用新地址更新任何现有合约。

简化示例(显然,这不会通过基本的安全检查,但您明白了)。

interface I {
  someMethod();
}

contract C {
  I i;

  C(address _addr) {
    i = I(_addr);
  }

  doSomething() {
    i.someMethod();
  }

  upgrade(address _newAddr) {
    i = _newAddr;
  }
}

提供这种类型的分离(并使用库)使得升级合约变得更加容易和便宜。

例如,下面我知道我可以在众筹中使用转移功能,但转移在哪里? 假设合约 A 定义了 makepovertyhistory() 函数,但我没有在接口代币中提及它……我还能在众筹合约中使用它吗?

不,它需要在某处导入或定义。

如果我在接口内重新定义传递函数,它是否会覆盖在众售合约中实例化的地址处定义的传递函数?

这取决于您如何调用传输函数。 如果您在已部署合约的地址上执行它,那么您正在使用该已部署合约的实现。

可以在这篇博文 中找到更深入的示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM