智能合约编写整理

智能合约最基础的函数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()
}

整理中……

你可能感兴趣的:(智能合约编写整理)