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

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

簡介:上一節,我們介紹智慧合約開發中常用的Lib工具庫的第一部分。由於內容較長,工具庫我們將分兩部分介紹,本文將介紹Lib工具庫的第二部分:LibJson 、LibStack和LibLog。

LibJson

LibJson主要封裝了對JSON格式的字串一些操作;

支援直接呼叫、using for *;呼叫

注意:正如在Lib工具庫說明中提到的,LibJson 庫的使用稍微有點特殊: 不管是直接呼叫,還是using for*;方式呼叫,在合約方法中,如果要使用一次、或者多次LibJson庫中的方法,則在第一次使用LibJsos庫方法前,需要對被操作的json字串進行如下操作:

//字串入棧
LibJson.push(_json);
複製程式碼

在最後一個LibJsos庫方法之後,要進行如下操作

//出棧
LibJson.pop();
複製程式碼

示例

pragma solidity ^0.4.2;

import "./utillib/LibJson.sol";

contract TestManager {

    using LibJson for *;

    string[] public _arr;

    function test() constant returns(bool _ret) {
        string memory _json = "{\"errno\":27,\"hash\":\"0xf16a2a734ccf0456807e166ad310ec7767f71e8d4003154b73596741683c6433\",\"nodeId\":\"JZNCGP\",\"type\":1}";
       // step01: 字串入棧
       LibJson.push(_json);
       // step02: 操作字串,判斷自否為一個合法的json格式
       bool isJson = _json.isJson();   
       //或者直接呼叫 
       //bool isJson = LibJson.isJson(_json);

       _json.jsonRead("nodeId");     // "JZNCGP"
       // step03: 出棧
       LibJson.pop();
    }
}
複製程式碼
  • LibJson.push() 與 LibJson.pop() 一定是成對出現的;

  • 當對字串的操作結束後務必呼叫pop將棧中的元素移除掉;

JSON格式判斷

描述:判斷指定串是否為標準的JSON格式

結構定義

function isJson(string _json) internal constant returns(bool _ret);
複製程式碼

示例

string memory _json = "{\"errno\":27,\"hash\":\"0xf16a2a734ccf0456807e166ad310ec7767f71e8d4003154b73596741683c6433\",\"nodeId\":\"JZNCGP\",\"type\":1}";
bool _ret= _json.isJson();        //  _ret = true

複製程式碼

讀取JSON中key的值

描述:指定key讀取JSON串中的值

結構定義

function jsonRead(string _json, string _keyPath) internal constant returns(string _ret);
複製程式碼

示例

string memory _json = "{\"errno\":27,\"hash\":\"0xf16a2a734ccf0456807e166ad310ec7767f71e8d4003154b73596741683c6433\",\"nodeId\":\"JZNCGP\",\"type\":1}";
string memory _ret= _json.jsonRead("nodeId");        //  _ret = "JZNCGP"
複製程式碼

判斷JSON的key是否存在

描述:判斷JSON中的key是否存在

結構定義

function jsonKeyExists(string _json, string _keyPath) internal constant returns(bool _ret)

複製程式碼

示例

string memory _json = "{\"errno\":27,\"hash\":\"0xf16a2a734ccf0456807e166ad310ec7767f71e8d4003154b73596741683c6433\",\"nodeId\":\"JZNCGP\",\"type\":1}";
bool _ret= _json.jsonKeyExists("nodeId");        //  _ret = true
複製程式碼

uint[]陣列轉JSON字串

描述:將一個uint[]陣列轉為json格式字串

結構定義

function toJsonArray(uint[] storage _self) internal constant returns(string _json);
Copy
複製程式碼

示例

pragma solidity ^0.4.2;

import "LibJson.sol";

contract TestManager {

    using LibJson for *;

    uint[] public _arr;

    function test() constant returns(string _ret) {
            _arr.push(1);
            _arr.push(2);
            _ret = _arr.toJsonArray();    // _ret = [1,2]
    }
}
複製程式碼

string[]陣列轉JSON字串

描述:將一個uint[]陣列轉為json格式字串

結構定義

function toJsonArray(string[] storage _self) internal constant returns(string _json);
複製程式碼

示例

pragma solidity ^0.4.2;

import "LibJson.sol";

contract TestManager {

    using LibJson for *;

    string[] public _arr;

    function test() constant returns(string _ret) {
            _arr.push("1");
            _arr.push("2");
            _ret = _arr.toJsonArray();    // _ret = ["1","2"]
    }
}
複製程式碼

字串整形陣列轉uint[]

描述:將一個字串的整形陣列轉為uint[],如:"[1,3,4]"

結構定義

function fromJsonArray(uint[] storage _self, string _json) internal returns(bool succ);
複製程式碼

示例

pragma solidity ^0.4.2;

import "LibJson.sol";

contract TestManager {

    using LibJson for *;

    uint[] public _arr;

    function test() constant returns(string _ret) {
           string memory _json = "[1,2,3]";
           _arr.fromJsonArray(_json);    // _arr = [1,2,3],_arr.length = 3
    }
}
複製程式碼

字串陣列轉string[]

描述:將一個字串的整形陣列轉為string[],如:["1","3","4"]

結構定義

function fromJsonArray(uint[] storage _self, string _json) internal returns(bool succ);
複製程式碼

示例

pragma solidity ^0.4.2;

import "LibJson.sol";

contract TestManager {

    using LibJson for *;

    string[] public _arr;

    function test() constant returns(string _ret) {
           string memory _json = "[\"1\",\"2\",\"3\"]";
           _arr.fromJsonArray(_json);    // _arr = ["1","2","3"],_arr.length = 3
    }
}
複製程式碼

元素入棧

描述:當需要對JSON進行操作,如:isJson()、jsonRead()操作時需要先進行push()操作,與此同時當使用後一定使用pop()進行棧資料的移除;

結構定義

 function push(string _json) internal constant returns(uint _len) ;
Copy
複製程式碼

示例

pragma solidity ^0.4.2;

import "LibJson.sol";

contract TestManager {

    using LibJson for *;

    string[] public _arr;

    function test() constant returns(string _ret) {
           string memory _json = "{\"errno\":27,\"hash\":\"0xf16a2a734ccf0456807e166ad310ec7767f71e8d4003154b73596741683c6433\",\"nodeId\":\"JZNCGP\",\"type\":1}";
           LibJson.push(_json);
           _json.isJson();
           _json.jsonRead("type");        // return 1
           LibJson.pop();
    }
}
複製程式碼

元素出棧

描述:當需要對JSON進行操作,如:isJson()、jsonRead()操作時需要先進行push()操作,與此同時當使用後一定使用pop()進行棧資料的移除;

結構定義

function pop() internal constant;
複製程式碼

示例

pragma solidity ^0.4.2;

import "LibJson.sol";

contract TestManager {

    using LibJson for *;

    function test() constant returns(string _ret) {
           string memory _json = "{\"errno\":27,\"hash\":\"0xf16a2a734ccf0456807e166ad310ec7767f71e8d4003154b73596741683c6433\",\"nodeId\":\"JZNCGP\",\"type\":1}";
           LibJson.push(_json);
           _json.isJson();
           _json.jsonRead("type");        // return 1
           LibJson.pop();
    }
}
複製程式碼

LibStack

LibStack封裝了對棧的使用,合約中通過棧進行字串拼接操作。

僅支援直接呼叫

pragma solidity ^0.4.2;

import "./utillib/LibStack.sol";

contract TestManager {

    function test() constant returns(string _ret) {
        len = LibStack.push("{");
        len = LibStack.appendKeyValue("userAddr", "1");
        len = LibStack.appendKeyValue("name", "2");
        len = LibStack.append("}");
        _ret = LibStack.popex(len);
        // _ret = {"userAddr":"1","name":"2"}
    }
}
複製程式碼

說明:

  • 棧的使用開始前必須進行LlibStack.push();操作,如果沒有固定元素可push一個空串;

  • 每次入棧資料後會返回當前佔中元素長度;

  • 出棧時指定要出棧的長度,即可獲得棧中的字串資訊

入棧

描述:對一個棧使用前必須要做的事,push()呼叫就新開了一個棧空間使用,如果沒有固定元素可以push一個空字串:LibStack.push("");

結構定義

function push(string _data) internal constant returns(uint _len);
複製程式碼

示例

uint len = LibStack.push("");        // 返回當前棧中元素個數
複製程式碼

出棧

描述:當需要獲取棧中元素時呼叫popex()獲取棧中資料.

結構定義

function popex() internal constant returns(string _ret);
複製程式碼

示例

uint len = LibStack.push("");        // 返回當前棧中元素個數
len = LibStack,append("aaa");    // append 追加單個元素
string memory _ret = LibStack.popex(len);    // _ret = "aaa"
複製程式碼

向棧追加單個元素

描述:當棧開闢空間後向棧中追加單個元素

結構定義

function append(string _data) internal constant returns(uint _len);
複製程式碼

示例

uint len = LibStack.push("");        // 返回當前棧中元素個數
len = LibStack,append("aaa");    // append 追加單個元素
string memory _ret = LibStack.popex(len);    // _ret = "aaa"
複製程式碼

向棧追加k-v鍵值對

描述:當棧開闢空間後向棧中追加k-v鍵值對

結構定義

function appendKeyValue(string _key, string _val) internal constant returns (uint _len) ;
function appendKeyValue(string _key, uint _val) internal constant returns (uint _len) ;
 function appendKeyValue(string _key, int _val) internal constant returns (uint _len) ;
 function appendKeyValue(string _key, address _val) internal constant returns (uint _len);
複製程式碼

示例

uint len = LibStack.push("{");        // 返回當前棧中元素個數
len = LibStack,appendKeyValue("name","Tom");  
len = LibStack,appendKeyValue("age",1);
len = LibStack,appendKeyValue("creator",0x8affd1952705d8a908e016695c6e454ad39a1c6f);
len = LibStack,append("}");
string memory _ret = LibStack.popex(len);    
// _ret = {"name":"Tom","age":1,"creator":"0x8affd1952705d8a908e016695c6e454ad39a1c6f"}
複製程式碼

LibLog

LibLog主要封裝了日誌列印操作,在合約中的輸出日誌體現在日誌檔案中進行輸出 僅支援直接呼叫

LibLog LibLog主要封裝了日誌列印操作,在合約中的輸出日誌體現在日誌檔案中進行輸出 僅支援直接呼叫

日誌輸出(多元素)

描述:輸入一個字串進行日誌輸出

結構定義

function log(string _str) internal constant returns(uint _ret);
function log(string _str, string _str2, string _str3) internal constant returns(uint _ret);
function log(string _str, string _str2) internal constant returns(uint _ret);
複製程式碼

示例

LibLog.log("hello world");
LibLog.log("hello world","01");
LibLog.log("hello world","01","02");
複製程式碼

日誌輸出(不同型別)

描述:不同型別輸入日誌輸出

結構定義

// 字串 + 無符號整形
function log(string _str, uint _ui) internal constant returns(uint _ret);

// 字串 + 有符號整形
function log(string _str, int _i) internal constant returns(uint _ret);

// 字串 + 地址
 function log(string _str, address _addr) internal constant returns(uint _ret);
複製程式碼

示例

LibLog.log("hello world",111);
LibLog.log("hello world",131);
LibLog.log("hello world",0x8affd1952705d8a908e016695c6e454ad39a1c6f);
複製程式碼

參考內容:https://open.juzix.net/doc

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

相關文章