Solidity interface 接口

接口本意是物体之间连接的部位。例如:电脑的 usb 接口可以用来连接鼠标也可以连接U盘和硬盘。因此,使用标准的接口可以极大的拓展程序的功能。在 solidity 语言中,接口可以用来接受相同规则的合约,实现可更新的智能合约。

interface 类似于抽象合约,但它们不能实现任何功能。还有其他限制:

  • 无法继承其他合约或接口。
  • 所有声明的函数必须是 external 的。
  • 无法定义构造函数。
  • 无法定义变量。
  • 无法定义结构。

1. 接口定义

接口需要有interface关键字,并且内部只需要有函数的声明,不用实现。

只要某合约中有和词接口相同的函数声明,就可以被此合约所接受。

interface 接口名{
    函数声明;
}

例子:

interface animalEat{
      function eat() public returns(string);
}

2. 接口使用

在下面的例子中,定义了cat合约以及dog合约。他们都有eat方法.以此他们都可以被上面的animalEat接口所接收。

 contract cat{
    string name;
    function eat() public returns(string){
        return "cat eat fish";
    }

    function sleep() public returns(string){
         return "sleep";
    }
}

contract dog{
    string name;
    function eat() public returns(string){
        return "dog miss you";
    }

    function swim() public returns(string){
         return "sleep";
    }
}

interface animalEat{
      function eat() public returns(string);
}

contract animal{
    function test(address _addr) returns(string){
        animalEat generalEat = animalEat(_addr);
        return generalEat.eat();
    }
}

在合约 animal 中,调用函数 test,如果传递的是部署的 cat 的合约地址,那么我们在调用接口的 eat 方法时,实则调用了cat 合约的 eat 方法。 同理,如果传递的是部署的 dog 的合约地址,那么我们在调用接口的 eat 方法时,实则调用了 dog 合约的 eat 方法。

3. Uniswap使用示例

interface UniswapV2Factory {
    function getPair(address tokenA, address tokenB)
        external
        view
        returns (address pair);
}

interface UniswapV2Pair {
    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );
}

contract UniswapExample {
    address private factory = 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f;
    address private dai = 0x6B175474E89094C44Da98b954EedeAC495271d0F;
    address private weth = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;

    function getTokenReserves() external view returns (uint, uint) {
        address pair = UniswapV2Factory(factory).getPair(dai, weth);
        (uint reserve0, uint reserve1, ) = UniswapV2Pair(pair).getReserves();
        return (reserve0, reserve1);
    }
}

下一章:solidity 优化智能合约gas使用的模式

在以太坊区块链上,Gas被用来补偿矿工为智能合约的存储与执行所提供的算力。目前以太坊的利用在逐渐增长,而交易手续费成本也水涨传告 —— 现在每天的gas成本已经高达数百 ...