首页 > 其他分享 >Solidity极简入门#17. 库合约

Solidity极简入门#17. 库合约

时间:2023-02-17 22:00:55浏览次数:61  
标签:极简 string 17 uint256 Solidity value length 合约 库函数

这一讲,我们用ERC721的引用的库合约String为例介绍solidity中的库合约(library),并总结了常用的库函数。

库函数

库函数是一种特殊的合约,为了提升solidity代码的复用性和减少gas而存在。库合约一般都是一些好用的函数合集(库函数),由大神或者项目方创作,咱们站在巨人的肩膀上,会用就行了。

Solidity极简入门#17. 库合约_web3

他和普通合约主要有以下几点不同:

  1. 不能存在状态变量
  2. 不能够继承或被继承
  3. 不能接收以太币
  4. 不可以被销毁

String库合约

String库合约是将uint256类型转换为相应的string类型的代码库,样例代码如下:

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);
}
}

他主要包含两个函数,toString()将uint256转为string,toHexString()将uint256转换为16进制,在转换为string。

如何使用库合约

我们用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);
}

我们部署合约并输入170测试一下,两种方法均能返回正确的16进制string “0xaa”。证明我们调用库函数成功!

Solidity极简入门#17. 库合约_web3_02

总结

这一讲,我们用ERC721的引用的库函数String为例介绍solidity中的库函数(Library)。99%的开发者都不需要自己去写库合约,会用大神写的就可以了。我们只需要知道什么情况该用什么库合约。常用的有:

  1. ​String​​:将uint256转换为String
  2. ​Address​​:判断某个地址是否为合约地址
  3. ​Create2​​:更安全的使用Create2 EVM opcode
  4. ​Arrays​​:跟数组相关的库函数

标签:极简,string,17,uint256,Solidity,value,length,合约,库函数
From: https://blog.51cto.com/sleep666/6064539

相关文章

  • 2023/2/17 考试总结
    时间安排7.30~7.47发现重题,于是换题。7.47~7.52T1很sb,写了。O0O0O0OO0O0O0O0O0O0O0O0O0O0O0O00O7.52~8.40T2不是很sb,想了个状态数巨大的dp套dp。dfs搜了一下只有36......
  • misc图片隐写------2023.2.17
    1,查看属性2.伪装成图片的压缩包一般这种图片看起来和普通图片没什么区别,但其实这个图片是由压缩包伪装成的,一般flag的文本文件就藏在这个压缩包中3,修改图片宽高4,将flag......
  • 20230217周报
    本周时间管理回顾时间管理记录本周手机使用时间理论上应该是变少了的,因为感觉工作效率还可以。但是实际一看,微信使用时长也快到了一个小时,非常莫名其妙。还是要减少看微......
  • 2023.2.17
    不知从什么时候开始记性变得不好,昨天记得有个被拿来和马库斯做过对比的巨人选手,结果费半天劲才想起来叫morganaste也许哪一天我就会啥也想不起来和何老师要了生日歌和生......
  • 从0到1一步一步玩转openEuler--17 openEuler DNF(YUM)检查更新
    DNF是一款Linux软件包管理工具,用于管理RPM软件包。DNF可以查询软件包信息,从指定软件库获取软件包,自动处理依赖关系以安装或卸载软件包,以及更新系统到最新可用版本。说明:......
  • RSA常见题型------2023.2.17
    1,已知dp,dq求解m其中关系式如下:dp=d%(p-1)dq=d%(q-1)解题脚本:#!/usr/bin/python#coding:utf-8importgmpy2fromCrypto.Util.numberimportlong_to......
  • 230217 关于英语学习的目标
    最近几天,你在听larry的英语课程.通过larry的介绍,你有了一些新的感触与理解.尤其是你关于你的英语的学习目标,你值得去深入思考,同时,不断校正与优化你的目标.之前,你......
  • 【0217】end2end自动驾驶方案想法
    最近着重看了一些端到端的自动驾驶方案,有一些想法特点:1.表现好,Carlaleaderboard榜首几乎都是E2E,比如TCP,Transfuser,LAV2.逐渐偏重模块化的精细设计,并且中间量可以decod......
  • 闲话 23.2.17
    闲话发现自己没学过欧拉数相关的推导开koishi的排列去(一会儿补个euleriannumber的bgf的推导。现在从略(今日放了be的歌?不谈演唱中只有少部分人能接受的部分......
  • C/C++学生个人消费记录管理系统[2023-02-17]
    C/C++学生个人消费记录管理系统[2023-02-17]学生个人消费记录管理系统学生个人消费记录管理系统给学生一个管理个人财务的平台,主要用于对学生的生活费用收入、支出进行添......