美文网首页
智能合约编写整理

智能合约编写整理

作者: 李孝伟 | 来源:发表于2018-05-24 17:02 被阅读126次

    智能合约最基础的函数GetState(key),PutState(key,bytes),kv方式存储数据;

    1. stub CreateCompositeKey 创建混合key
    虽然key可以自己定,但是官方推荐此方法;
    eg:
    creditkey, err:= stub.CreateCompositeKey("data_credit_info", []string{credit.Agent_code,credit.credit_code})
    创建一个类型为"data_credit_info",包含两个索引的key:credit.Agent_code,credit.credit_code;
    这样做的好处是,官方提供了根据部分key查询的数据的函数,详见函数3.
    
    1. stub GetQueryResult 函数
    参数:queryString string 查询条件
    eg. queryString := "{ \"selector\":{\"Object_type\":\"userinfo\"} }"
    selector是固定格式;
    Object_type为要查询json的的一个字段,后面可增加更多字段过滤;
    resultsIterator, err := stub.GetQueryResult(queryString)
    
    返回数据后需要手动关闭:
    defer resultsIterator.Close()
    
        for resultsIterator.HasNext() {
            queryResponse, err := resultsIterator.Next()
            if err != nil {
                return shim.Error(err.Error())
            }
            // Record is a JSON object, so we write as-is
            result := struct {
                UUID string `json:"uuid"`
                Object_type string `json:"object_type"`
            }{}
            err = json.Unmarshal(queryResponse.Value, &result)
            if err != nil {
                return shim.Error(err.Error())
            }
        }
    
    1. stub GetStateByPartialCompositeKey 数据查询函数
    resultsIterator, err = stub.GetStateByPartialCompositeKey("data_credit_info", []string{credit.Agent_code})
    or
    resultsIterator, err = stub.GetStateByPartialCompositeKey("data_credit_info", []string{})
    这个函数返回的结果跟GetQueryResult类似
    这个函数要跟putstate设置的key结合使用,查询类型为"data_credit_info",agent_code为credit.Agent_code的所有数据;
    注意!!!!
    这里其实是一种对Key进行前缀匹配的查询,也就是说,我们虽然是部分复合键的查询,但是不允许拿后面部分的复合键进行匹配,必须是前面部分。
    

    其他函数

    /*
    判断结构体是否为空,int未处理
     */
    func CheckStructIsEmpty(data interface{}) (int , string){
    
        t := reflect.TypeOf(data)
        v := reflect.ValueOf(data)
        b := bytes.Buffer{}
        isEmpty := 0
        for k := 0; k < t.NumField(); k++ {
            //fmt.Printf("%s -- %v \n", t.Field(k).Name, v.Field(k).Interface())
            switch v.Field(k).Interface().(type) {
            case string:
                if len(v.Field(k).String()) == 0 {
                    isEmpty = 1
                    b.WriteString(t.Field(k).Name)
                    b.WriteString(" 参数不能为空!")
                }
            case int:
                // TODO: deal for int
    
            }
        }
    
        return isEmpty,b.String()
    }
    
    

    整理中……

    相关文章

      网友评论

          本文标题:智能合约编写整理

          本文链接:https://www.haomeiwen.com/subject/kuvsjftx.html