智慧合約從入門到精通:Lib工具庫(一)

區塊鏈技術發表於2018-07-06

簡介:上一節,我們介紹了智慧合約的開發範例,本節我們將詳解智慧合約開發中常用的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

智慧合約開發教程視訊:區塊鏈系列視訊課程之智慧合約簡介

相關文章