智能合约从入门到精通:Lib工具库(二)
  r5u89Y2tdVrY 2023年11月02日 46 0

简介:上一节,我们介绍智能合约开发中常用的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主要封装了日志打印操作,在合约中的输出日志体现在日志文件中进行输出 仅支持直接调用 日志输出(多元素) 描述:输入一个字符串进行日志输出 结构定义

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 智能合约开发教程视频:区块链系列视频课程之智能合约简介

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
r5u89Y2tdVrY