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

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章