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;
}
}
输出:
内置库
Solidity 有一些内置库以方便用户使用。下面列出了一些库:
- 模块化网络:这包括许多对实现非常有用的模块化库,例如 ArrayUtils、Token、CrowdSale、Vesting、StringUtils、LinkedList、Wallet 等。
- OpenZeppelin:其他支持库有 Roles、MerkleProof、ECDSA、Math、Address、SafeERC20、ERC165Checker、SafeMath、Arrays 等,可防止溢出。
- Dapp-bin:由以太坊创建,包括有趣且有用的库,如 DoublyLinkedList、StringUtils、IterableMapping 等。