库函数是一种特殊的合约,主要是为了提升solidity代码的复用性和减少gas fee而存在。库合约一般都是一些好用的函数合集(库函数),由大神或者项目方创作
与智能合约相比,目前库在使用存在一些限制:
常用的库:
- library Strings {
- bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
-
- /**
- * @dev Converts a `uint256` to its ASCII `string` decimal representation.
- */
- function toString(uint256 value) public pure returns (string memory) {
- // Inspired by OraclizeAPI's implementation - MIT licence
- // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
-
- if (value == 0) {
- return "0";
- }
- uint256 temp = value;
- uint256 digits;
- while (temp != 0) {
- digits++;
- temp /= 10;
- }
- bytes memory buffer = new bytes(digits);
- while (value != 0) {
- digits -= 1;
- buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
- value /= 10;
- }
- return string(buffer);
- }
-
- /**
- * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
- */
- function toHexString(uint256 value) public pure returns (string memory) {
- if (value == 0) {
- return "0x00";
- }
- uint256 temp = value;
- uint256 length = 0;
- while (temp != 0) {
- length++;
- temp >>= 8;
- }
- return toHexString(value, length);
- }
-
- /**
- * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
- */
- function toHexString(uint256 value, uint256 length) public pure returns (string memory) {
- bytes memory buffer = new bytes(2 * length + 2);
- buffer[0] = "0";
- buffer[1] = "x";
- for (uint256 i = 2 * length + 1; i > 1; --i) {
- buffer[i] = _HEX_SYMBOLS[value & 0xf];
- value >>= 4;
- }
- require(value == 0, "Strings: hex length insufficient");
- return string(buffer);
- }
- }
我们用String库函数的toHexString()来演示两种使用库合约中函数的办法。
1. 利用using for指令
指令 using A for B; 可用于附加库函数(从库 A)到任何类型(B)。添加完指令后,库A中的函数会自动添加为B类型变量的成员,可以直接调用。注意:在调用的时候,这个变量会被当作第一个参数传递给函数:
- // 利用using for指令
- using Strings for uint256;
- function getString1(uint256 _number) public pure returns(string memory){
- // 库函数会自动添加为uint256型变量的成员
- return _number.toHexString();
- }
2. 通过库合约名称调用库函数
- // 直接通过库合约名调用
- function getString2(uint256 _number) public pure returns(string memory){
- return Strings.toHexString(_number);
- }