简介:上一节,我们介绍了智能合约的开发范例,本节我们将详解智能合约开发中常用的Lib工具库。由于内容较长,工具库我们将分两部分介绍,本文将介绍LibInt和LibString。
在合约开发规范中,我们看到contracts目录下有个子目录utillib,此子目录下,是JUICE开放服务平台提供的一些常用工具库。这些工具库提供的方法,和具体的业务没有关系。它的作用,和JAVA中的各种util工具类似。常用的有:
1. LibInt 封装对整数的操作(支持直接调用、using调用)https://open.juzix.net/api_doc/contract/utillib/LibInt.html
2. LibString 封装对字符串的操作 (支持直接调用、using调用) https://open.juzix.net/api_doc/contract/utillib/LibString.html
3. LibJson 封装对JSON格式的字符串操作(支持直接调用、using调用)https://open.juzix.net/api_doc/contract/utillib/LibJson.html
4. LibStack 封装对堆栈的使用(仅支持直接调用)https://open.juzix.net/api_doc/contract/utillib/LibStack.html
5. LibLog 封装日志操作(仅支持直接调用)https://open.juzix.net/api_doc/contract/utillib/LibLog.html
6. 使用方法
在业务合约的头部引入库文件:
pragma solidity ^0.4.2;
import "./utillib/LibLog.sol";
Copy
在合约中直接调用方式:
function myLogger() constant public returns(bool _out) {
LibLog.log("here is my logger message");
...
...
_out = true;
}
Copy
在合约中using使用方式:
pragma solidity ^0.4.2;
import "./utillib/LibString.sol";
contract StringTest is OwnerNamed {
using LibString for * ;
function myString() constant public returns(bool _out) {
LibLog.log("here is my string test");
string memory _string = "hello world";
//using 方式
bool result = _string.compare("hello world");
//直接调用方式
//bool result = LiString.compare(_string, "hello world");
_out = result ;
}
}
注意:
LibJson虽然支持直接调用、using调用,但是它的using调用方式稍有不同,详情查看LIbJson库说明。https://open.juzix.net/api_doc/contract/utillib/LibJson.html
以下示例都将采用 using for *; 方式进行调用
LibInt 主要封装了对整形的一系列操作;
支持直接调用、using for *;调用
描述:将一个整数转为指定长度字符串
结构定义
function toString(uint _self, uint width) internal returns (string _ret);
示例
uint _uint = 1000;
string memory _ret= _uint.toString(3); // _ret = 100
描述:uint 类型转string类型
结构定义
function toString(uint _self) internal returns (string _ret) ;
示例
uint _uint = 1000;
string memory _ret= _uint.toString(); // _ret = 1000
描述:uint 数据转16进制string
结构定义
function toHexString(uint _self) internal returns (string _ret) ;
示例
uint _uint = 1000;
string memory _ret= _uint.toHexString(); // _ret = 0x3e8
描述:把uint的每个字节转换成十六进制字符串,uint是32字节,需要64个字符来表示,当高位全是0时,补0,到64字符
结构定义
function toHexString64(uint _self) internal returns (string _ret) ;
示例
uint _uint = 1000;
string memory _ret= _uint.toHexString64(); // _ret = 0x0000000000000000000000000000000000000000000000000000000003e8
描述:int 类型转字符串
结构定义
function toString(int _self) internal returns (string _ret);
示例
int _int = 1000;
string memory _ret= _uint.toString(); // _ret = "1000"
描述:uint类型转地址字符串
结构定义
function toAddrString(uint _self) internal returns (string _ret);
示例
address _address =0x8affd1952705d8a908e016695c6e454ad39a1c6f ;
uint _uint = uint(_address);
string memory _ret= _uint.toAddrString(); // _ret = "0x8affd1952705d8a908e016695c6e454ad39a1c6f"
描述:uint类型转为k-v的键值对
结构定义
function toKeyValue(uint _self, string _key) internal returns (string _ret);
示例
uint _uint = 1000;
string memory _ret= _uint.toKeyValue("key");
// -> _ret = "key" : 1000
描述:int类型转为k-v的键值对
结构定义
function toKeyValue(int _self, string _key) internal returns (string _ret);
示例
int _int = 1000;
string memory _ret= _int.toKeyValue("key");
// -> _ret = "key" : 1000
描述:address类型转为k-v的键值对
结构定义
function toKeyValue(address _self, string _key) internal returns (string _ret);
示例
address _address =0x8affd1952705d8a908e016695c6e454ad39a1c6f ;
string memory _ret= _address.toKeyValue("key");
// -> _ret = "key" : "0x8affd1952705d8a908e016695c6e454ad39a1c6f"
此方法主要是由于合约之间调用不能使用字符串,因此将字符转为32字节整数传递
描述:uint的内存数据,以32字节向右对齐,拷贝到一个整数中
如果要传一个小于32字节的字符串,就把字符串的内存向右对齐,存储到这个整数中,出去后,再恢复成字符串
结构定义
function recoveryToString(uint _self) internal returns (string _ret);
示例
uint _uint = 1000;
string memory _ret= _uint.recoveryToString();
描述:判断某个uint类型元素是否存在某个uint[]数组中,注意:uint[]的类型必须为storage.
结构定义
function inArray(uint _self,uint[] storage _array) internal returns (bool _ret);
Copy
示例
pragma solidity ^0.4.2;
import "LibInt.sol";
contract TestManager {
using LibInt for *;
uint[] public _arruint;
function test(uint _uint) constant returns(string _ret) {
// if exists , isExists = true,
// if not ,isExists = false;
bool isExists = _uint.inArray(_arruint);
}
}
以下示例都将采用library库的 using for *; 方式进行调用
LibString主要封装了对字符串的一系列常规操作;
支持直接调用、using for *;调用
字符串比较
描述:比较两个字符串是否相等
结构定义
function equals(string _self, string _str) internal returns (bool _ret);
示例
string memory _str1 = "1000";
string memory _str2 = "200";
bool _ret= _str1.equal(_str2); // _ret = falses
描述:比较两个字符串是否相等
结构定义
function equals(string _self, string _str) internal returns (bool _ret);
示例
string memory _str1 = "ABC";
string memory _str2 = "abc";
bool _ret= _str1.equalsNoCase(_str2); // _ret = true
描述:截取字符串指定长度
结构定义
function substr(string _self, uint _start, uint _len) internal returns (string _ret);
示例
string memory _str1 = "abcdefg";
string _ret= _str1.substr(0,3); // _ret = "abc"
描述:拼接字符串
结构定义
function concat(string _self, string _str) internal returns (string _ret)
示例
string memory _str1 = "abcdefg";
string _ret= _str1.concat("123"); // _ret = "abcdefg123"
描述:拼接字符串,一次可传入多个待拼接字符串
结构定义
function concat(string _self, string _str1, string _str2)internal returns (string _ret);
function concat(string _self, string _str1, string _str2,string _str3)internal returns (string _ret);
示例
string memory _str1 = "abcdefg";
_str1 = _str1.concat("123","456"); // _str1 = "abcdefg123456"
_str1 = _str1.concat("A","B","C"); // _str1 = "abcdefg123456ABC"
描述:去除字符串空格
结构定义
function trim(string _self) internal returns (string _ret) ;
示例
string memory _str1 = "abcdefg";
string _ret= _str1.trim("123"); // _ret = "abcdefg123"
描述:去除字符串指定字符
结构定义
function trim(string _self,string _chars) internal returns (string _ret) ;
示例
string memory _str1 = "abcdefg";
string _ret= _str1.trim("a"); // _ret = "bcdefg"
描述:字符串按指定字符切成数组,注意:数组类型一定为状态变量storage
结构定义
function split(string _self, string _delim, string[] storage _array);
示例
pragma solidity ^0.4.2;
import "LibString.sol";
contract TestManager {
using LibString for *;
striing[] public _arr;
function test(uint _uint) constant returns(string _ret) {
string memory _str = "A&B&C";
_str.split("&",_arr); // _arr = ["A","B","C"]
}
}
描述:查找指定字符在字符串中的索引位置,从0开始,不存在则返回-1
结构定义
function indexOf(string _self, string _str) internal returns (int _ret);
示例
string memory _str1 = "abcdefg";
int _ret= _str1.indexOf("b"); // _ret = 1
描述:查找指定字符在字符串中的索引并指定开始位置,从0开始,不存在则返回-1
结构定义
function indexOf(string _self, string _str,uint pos) internal returns (int _ret);
示例
string memory _str1 = "abcdefg";
int _ret= _str1.indexOf("b",0); // _ret = 1
描述:字符串类型转为整数类型
结构定义
function toInt(string _self) internal returns (int _ret) ;
示例
string memory _str1 = "1111";
int _ret= _str1.toInt(); // _ret = 1111
描述:字符串类型转为address类型
结构定义
function toAddress(string _self) internal returns (address _ret);
示例
string memory _str1 = "0x8affd1952705d8a908e016695c6e454ad39a1c6f";
address _ret= _str1.toAddress(); // _ret = 0x8affd1952705d8a908e016695c6e454ad39a1c6f
描述:字符串组装成k-v键值对
结构定义
function toKeyValue(string _self, string _key) internal returns (string _ret)
示例
string memory _str1 = "aaaa";
address _ret= _str1.toKeyValue("name"); // _ret = "name":"aaaa"
描述:字符串组装成k-v键值对,针对storage类型变量;
注意:生命在函数体外的变量为状态变量storage;
结构定义
function toKeyValue(string storage _self, string _key) internal returns (string _ret)
示例
pragma solidity ^0.4.2;
import "LibString.sol";
contract TestManager {
using LibString for *;
string public _str;
function test() constant returns(string _ret) {
_str = "hello";
_ret = _str.toKeyValue("name"); // _ret ="name":"hello"
}
}
描述:将一个长度长度小于32字节的字符串用uint进行表示;
结构定义
function storageToUint(string _self) internal returns (uint _ret);
示例
string memory _str1 = "aaaa";
uint _ret= _str1.storageToUint(); // _ret =
描述:判断某个字符串是否在指定数组中;
结构定义
function inArray(string _self, string[] storage _array) internal returns (bool _ret);
示例
pragma solidity ^0.4.2;
import "LibString.sol";
contract TestManager {
using LibString for *;
string[] public _arr;
function test() constant returns(bool _ret) {
_arr.push("hello1");
_arr.push("hello2");
string memory _str = "hello1";
_ret = _str.inArray(_arr); // _ret = true
}
}
描述:判断某个字符串是否在指定数组中,并忽略大小写判定;
结构定义
function inArrayNoCase(string _self, string[] storage _array) internal returns (bool _ret);
示例
pragma solidity ^0.4.2;
import "LibString.sol";
contract TestManager {
using LibString for *;
string[] public _arr;
function test() constant returns(bool _ret) {
_arr.push("Hello1");
_arr.push("hello2");
string memory _str = "hello1";
_ret = _str.inArrayNoCase(_arr); // _ret = true
}
}
描述:将一个字符串的所有元素用大写表示
结构定义
function toUpper(string _self) internal returns (string _ret);
示例
string memory _str1 = "aaaa";
string memory _ret= _str1.toUpper(); // _ret = "AAAA"
描述:将所有字符转为小写
结构定义
function toLower(string _self) internal returns (string _ret);
示例
string memory _str1 = "AAAA";
string memory _ret= _str1.toLower(); // _ret = "aaaa"
描述:将字符串类型转为uint,该字符串内容本身为uint才可转换;如:"aa123"不可转换,"123"可以转换.
结构定义
function toUint(string _self) internal returns (uint _ret);
示例
string memory _str1 = "111";
uint _ret= _str1.toUint(); // _ret = 111
参考内容:https://open.juzix.net/doc
智能合约开发教程视频:区块链系列视频课程之智能合约简介