簡介:上一節,我們介紹了智能合約的開發範例,本節我們將詳解智能合約開發中常用的Lib工具庫。由於內容較長,工具庫我們將分兩部分介紹,本文將介紹LibInt和LibString。
- 常用庫簡介
在合約開發規範中,我們看到contracts目錄下有個子目錄utillib,此子目錄下,是JUICE開放服務平臺提供的一些常用工具庫。這些工具庫提供的方法,和具體的業務沒有關係。它的作用,和JAVA中的各種util工具類似。常用的有:
1.LibInt 封裝對整數的操作(支持直接調用、using調用)
2.LibString 封裝對字符串的操作 (支持直接調用、using調用)
3.LibJson 封裝對JSON格式的字符串操作(支持直接調用、using調用)
4.LibStack 封裝對堆棧的使用(僅支持直接調用)
5.LibLog 封裝日誌操作(僅支持直接調用)
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
LibInt 主要封裝了對×××的一系列操作;
支持直接調用、using for ;調用
uint轉爲字符串
描述:將一個整數轉爲指定長度字符串
結構定義
function toString(uint _self, uint width) internal returns (string _ret);
示例
uint _uint = 1000;
string memory _ret= _uint.toString(3); // _ret = 100
uint轉字符串
描述:uint 類型轉string類型
結構定義
function toString(uint _self) internal returns (string _ret) ;
示例
uint _uint = 1000;
string memory _ret= _uint.toString(); // _ret = 1000
uint轉十六進制
描述:uint 數據轉16進制string
結構定義
function toHexString(uint _self) internal returns (string _ret)
示例
uint _uint = 1000;
string memory _ret= _uint.toHexString(); // _ret = 0x3e8
uint轉十六進制(32字節)
描述:把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轉字符串
描述:int 類型轉字符串
結構定義
function toString(int _self) internal returns (string _ret);
示例
int _int = 1000;
string memory _ret= _uint.toString(); // _ret = "1000"
uint(特指address值) 轉 string
描述: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
描述: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
描述: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
addrerss轉鍵值對k-v
描述: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"
uint內存數據拷貝
此方法主要是由於合約之間調用不能使用字符串,因此將字符轉爲32字節整數傳遞
描述:uint的內存數據,以32字節向右對齊,拷貝到一個整數中
如果要傳一個小於32字節的字符串,就把字符串的內存向右對齊,存儲到這個整數中,出去後,再恢復成字符串
結構定義
function recoveryToString(uint _self) internal returns (string _ret);
示例
uint _uint = 1000;
string memory _ret= _uint.recoveryToString();
uint[]數組判斷
描述:判斷某個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
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
字符串轉int
描述:字符串類型轉爲整數類型
結構定義
function toInt(string _self) internal returns (int _ret) ;
示例
string memory _str1 = "1111";
int _ret= _str1.toInt(); // _ret = 1111
字符串轉address
描述:字符串類型轉爲address類型
結構定義
function toAddress(string _self) internal returns (address _ret);
示例
string memory _str1 = "0x8affd1952705d8a908e016695c6e454ad39a1c6f";
address _ret= _str1.toAddress(); // _ret = 0x8affd1952705d8a908e016695c6e454ad39a1c6f
字符串轉k-v鍵值對(memory類型)
描述:字符串組裝成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類型)
描述:字符串組裝成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"
}
}
字符用uint替代
描述:將一個長度長度小於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,該字符串內容本身爲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
智能合約開發教程視頻:區塊鏈系列視頻課程之智能合約簡介