以太坊中的接口和合同

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了以太坊中的接口和合同相关的知识,希望对你有一定的参考价值。

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

例如,下面我知道我可以在crowdsale中使用传递函数但是在哪里转移?假设合约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;
  }
}

提供这种类型的分离(以及使用库)使升级合同更容易和更便宜。

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

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

如果我在界面内重新定义传递函数,它是否会覆盖在人群销售合同中实例化的地址中定义的传递函数?

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

this blog post中可以找到更深入的例子。

以上是关于以太坊中的接口和合同的主要内容,如果未能解决你的问题,请参考以下文章

以太坊中的gasgas pricegas limit到底是什么

以太坊中的计量单位及相互转换

以太坊中的账户交易Gas和区块Gas Limit等概念

以太坊中GraphQL简介及使用

以太坊中的Ghost协议

以太坊中的nonce是什么