簡介:上一節,我們介紹了智慧合約的開發範例,本節我們將詳解智慧合約開發中常用的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
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
智慧合約開發教程視訊:區塊鏈系列視訊課程之智慧合約簡介