📜  Solidity – 库

📅  最后修改于: 2022-05-13 01:54:59.756000             🧑  作者: Mango

Solidity – 库

Solidity 中的库类似于包含可重用代码的合约。库具有可以被其他合约调用的函数。通过创建库来部署通用代码可以降低 gas 成本。库的函数在不修改状态变量的情况下可以直接调用,即只能从库外部调用纯函数和视图函数。它不能被销毁,因为它被假定为无状态。该库没有状态变量,它不能继承任何元素,也不能被继承。

创建库

库合约是通过使用 library 关键字而不是通用合约来定义的。库没有任何存储,因此它不能保存状态变量,也不能在库中创建回退或应付函数,因为它不能存储以太币。库不是用来改变合约状态的,它只能用来执行基于输入和输出的基本操作。然而,它可以实现一些数据类型,如用户定义的结构和枚举,以及存储在以太坊堆栈中而不是存储中的常量变量。

句法:

library  {
    // block of code
}

示例:在下面的示例中,创建库 libraryExample以演示创建库的过程。

坚固性

// Solidity program to demonstrate 
// how to create a library
pragma solidity ^0.5.0;

// Library Definition
library libraryExample {
    
    // Defining structure
    struct Constants {

        // Declaring variables
        uint Pi;             
        uint EulerNb;        
        uint PythagoraConst; 
        uint TheodorusConst; 
    }
    
}

使用“For”关键字部署库

一个库可以在同一个合约上定义,也可以使用 import 语句从外部导入。

例子:

import  from “./library-file.sol”;

单个文件可以包含多个库,这些库可以在导入语句中使用花括号指定,并用逗号分隔。可以使用“for”关键字在智能合约中访问库。

句法:

 for     

上述语句可用于将库函数附加到任何类型。 libraryName是要导入的所需库的名称, dataType是我们要访问该库的变量类型。通配符运算符(*) 也可以使用库的所有成员。

示例:在下面的示例中,创建了合约 libraryExample以演示如何使用“For”关键字部署库。

坚固性

// Solidity program to demonstrate 
// how to deploy a library
pragma solidity ^0.5.0;

// Defining Library
library LibExample {

    // Function to power of 
    // an unsigned integer
    function pow(
      uint a, uint b) public view returns (
      uint, address) {
        return (a ** b, address(this));
    }
}

// Defining calling contract
contract LibraryExample {
    
    // Deploying library using 
    // "for" keyword
    using LibExample for unit;
    address owner = address(this);
    
    // Calling function pow to 
    // calculate power 
    function getPow(
      uint num1, uint num2) public view returns (
      uint, address) {
        return num1.pow(num2);
    }
}

输出 :

部署库

不使用 For 关键字部署库

示例:在下面的示例中,创建了合约 libExample以演示如何在不使用“For”关键字的情况下部署库。

坚固性

// Solidity program to demonstrate 
// how to deploy library 
// without using for keyword
pragma solidity ^0.5.0;

// Defining library
library libraryExample {

         // Defining structure
         struct strings {

              // Declaring variables
               string str1 ;
               string str2 ;
               string str3 ;
      }
       
     // function to concatenate 
    // 2 strings 
      function concatenate(
       string memory _In1, string memory _In2) 
                              public view returns(
       string memory){
           return string(
           abi.encodePacked(_In1, _In2));
           }
 }

// Defining calling contract
contract libExample{

         // Deploying the library 
         // without using "for" keyword
        libraryExample.strings data 
          = libraryExample.strings("Geeks", "For", "Geeks");

        // Function to calculate and display 
        // the result of string concatenation
          function getResult(
         ) public view returns(string memory){
          string memory result 
           = libraryExample.concatenate(data.str1, data.str2);
          result = libraryExample.concatenate(result, data.str3);
          return result;
     }
}

输出:

不使用 For 关键字部署库

内置库

Solidity 有一些内置库以方便用户使用。下面列出了一些库:

  1. 模块化网络:这包括许多对实现非常有用的模块化库,例如 ArrayUtils、Token、CrowdSale、Vesting、StringUtils、LinkedList、Wallet 等。
  2. OpenZeppelin:其他支持库有 Roles、MerkleProof、ECDSA、Math、Address、SafeERC20、ERC165Checker、SafeMath、Arrays 等,可防止溢出。
  3. Dapp-bin:由以太坊创建,包括有趣且有用的库,如 DoublyLinkedList、StringUtils、IterableMapping 等。