侧边栏壁纸
博主头像
秋码记录

一个游离于山间之上的Java爱好者 | A Java lover living in the mountains

  • 累计撰写 137 篇文章
  • 累计创建 297 个标签
  • 累计创建 45 个分类

玩以太坊链上项目的必备技能(库 [library]-Solidity之旅十七)

最后,当库函数成为数据类型本身的一部分时,我们可以在其对象上调用该方法,如我们上面的契约所示,即firstNumber.add(secondNumber);

库(library)

作为开发者的您,想必对项目中重复使用的工具函数,抽取到一个公共中,以便可以在您项目中的其它位置可调用。

而 Solidity 与您所熟知的没有什么不同,它也是用来实现可重复调用,且还能省gas fee

闲话少叙,切入正题。让我们来看看 Solidity library 吧!

虽然 Solidity 中的library看起来和合约(contract)有些类似,但它并不是一个合约,它包含了可能多个消费者合约共有的功能,这有助于避免冗余。

来看看 Solidity 对library的约束:

  • 1、无状态 -

    Solidity中的库是一个无状态实体。它本质上意味着,与合约不同,您不能在一个库中定义状态变量。更简单地说,库函数不允许改变或修改合约的状态。

  • 2、仅供查看的函数

    调用库函数不会消耗gas,因为它不会修改合约的状态。换句话说,一个库只能实现pure函数或view函数。

  • 3、内部函数

    一个库不能从外部范围调用。其他合约显然可以调用它们,但它们不能从部署的外部访问。

  • 4、不能继承

    因为库是一个独立的实体,它不能继承任何其他的库或合约。一个库不能被任何其他实体/库/合同继承。

  • 5、没有回退或支付功能

    一个库不能实现回退或支付功能。

(将来有可能会解除这些限制)

如何创建 library(库)

在了解了关于库的一些概念后,让我们来创建一个library

想要在 Solidity 创建库,需使用library关键字。

//SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;

library MyLibrary {
    function add(uint a, uint b) public pure returns(uint) {
        return a + b;
    }
}

img

using … for … 使用库

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;

import "./library_example.sol";  //导入库

contract UseLibraryExample {

    using MyLibrary for uint;

    function getSum(uint firstNumber, uint secondNumber) public pure returns(uint) {
        return firstNumber.add(secondNumber); //您对这句可能产生了困惑
    }

}

img

为了在合约中使用任何库,我们需要首先告诉合约该库可以操作哪种数据类型。我们通过在合同中加入使用来操作;行来实现。

例如,library MyLibrary中的函数adduint进行操作,因为它把uint a作为它的第一个参数。

为了便于理解,您可以简单地,假设您的库函数成为uint数据类型本身的一部分,并在其对象中随时可用。

最后,当库函数成为数据类型本身的一部分时,我们可以在其对象上调用该方法,如我们上面的契约所示,即firstNumber.add(secondNumber);

注意,库函数的第一个参数成为函数被调用的对象。其余的和后续的参数仍然在函数调用中。

img

今天恰逢平安夜,正在浏览这篇文章,屏幕前的您,苹果吃了吗?无论如何我还是衷心地祝福您、以及您的家人身体健康,出入平安。听说,祝福别人的人,一生都会平安安然地度过余生,当然咯,这或许是圣诞老人给我们特别的祝福吧!

玩以太坊链上项目的必备技能(Constant 和 Immutable 状态变量-Solidity之旅十六)
« 上一篇 2022-12-23
玩以太坊链上项目的必备技能(内联汇编 [inline assembly]-Solidity之旅十八)
下一篇 » 2022-12-28

相关推荐

  • 玩以太坊链上项目的必备技能(Constant 和 Immutable 状态变量-Solidity之旅十六) 2022-12-23 22:04:32 +0800 +0800
  • 玩以太坊链上项目的必备技能(修改器 [modifier]-Solidity之旅十五) 2022-12-23 09:47:58 +0800 +0800
  • 玩以太坊链上项目的必备技能(错误处理以及异常-Solidity之旅十四) 2022-12-21 20:42:36 +0800 +0800
  • 玩以太坊链上项目的必备技能(函数及其可见性和状态可变性-Solidity之旅十三) 2022-12-19 20:30:23 +0800 +0800
  • 玩以太坊链上项目的必备技能(事件-Solidity之旅十二) 2022-12-18 20:59:44 +0800 +0800