Hyperledger Fabric 链码API的介绍

网址

https://godoc.org/github.com/hyperledger/fabric/core/chaincode/shim

参数读取API

  • GetFunctionAndParameters 提取调用链码交易中的参数,其中第一个作为被调用的函数名称,剩下的参数作为函数的执行参数

func (stub *ChaincodeStub) GetFunctionAndParameters() (function string, params []string)

# {"Args":["set","tom","100"]}
fn, args := stub.GetFunctionAndParameters()
fmt.Println(fn, args)

# 输出结果
set ["tom", "100"]

  • GetStringArgs 提取链码交易的指定参数

func (stub *ChaincodeStub) GetStringArgs() []string

# {"Args":["set","tom","100"]}

args = stub.GetStringArgs()
fmt.Println(args)

# 输出结果
["set","tom","100"]

账本状态交互API

  • PutState 在账本中添加或更新一对键值。

func (stub *ChaincodeStub) PutState(key string, value []byte) error

err := stub.PutState("str",[]byte("hello"))
if err != nil {
fmt.Println("str PutState error: "+err.Error())
}else{
fmt.Println("str PutState success!")
}

  • GetState 负责查询账本,返回指定键的对应值

func (stub *ChaincodeStub) GetState(key string) ([]byte, error)

strValue , err := stub.GetState("str")
if err != nil {
fmt.Println("str GetState error: "+err.Error())
}else {
fmt.Printf("str value: %s \n",string(strValue))
}
# 输出结果
str value: hello

  • DelState 删除一对键值

func (stub *ChaincodeStub) DelState(key string) error

err = stub.DelState("str")

  • GetStateByRange 查询指定范围内的键值,startKey为起始key,endKey为终止key

func (stub *ChaincodeStub) GetStateByRange(startKey, endKey string) (StateQueryIteratorInterface, error)

err := stub.PutState("str",[]byte("hello"))
err = stub.PutState("str1",[]byte("hello1"))
err = stub.PutState("str2",[]byte("hello2"))
resultIterator , err := stub.GetStateByRange("str" , "str2")

defer resultIterator.Close()
fmt.Println("-----start resultIterator-----")
for resultIterator.HasNext() {
item, _ := resultIterator.Next()
fmt.Println(string(item.Value))
}
fmt.Println("-----end resultIterator-----")
# 运行结果
-----start resultIterator-----
hello
hello1
-----end resultIterator-----

  • GetHistoryForKey 返回某个键的历史记录

func (stub *ChaincodeStub) GetHistoryForKey(key string) (HistoryQueryIteratorInterface, error)

historyIterator,err := stub.GetHistoryForKey("str")
defer historyIterator.Close()
fmt.Println("-----start historyIterator-----")
for resultIterator.HasNext() {
item, _ := historyIterator.Next()
fmt.Println(string(item.TxId))
fmt.Println(string(item.Value))
}
fmt.Println("-----end historyIterator-----")

其他API

  • CreateCompositeKey 给定一组属性,将这些属性组合起来构造一个复合键

func (stub *ChaincodeStub) CreateCompositeKey(objectType string, attributes []string) (string, error)

indexName := "sex~name"
indexKey , err := stub.CreateCompositeKey(indexName,[]string{"boy","xiaowang"})

value := []byte{0x00}
stub.PutState(indexKey,value)
fmt.Println(indexKey)
indexKey , err = stub.CreateCompositeKey(indexName,[]string{"boy","xiaoli"})
stub.PutState(indexKey,value)
fmt.Println(indexKey)
indexKey , err = stub.CreateCompositeKey(indexName,[]string{"girl","xiaofang"})
fmt.Println(indexKey)
stub.PutState(indexKey,value)
# 运行结果
sex~nameboyxiaowang
sex~nameboyxiaoli
sex~namegirlxiaofang

  • SplitCompositeKey 给定一个复合键,将其拆分为复合键所用的属性

func (stub *ChaincodeStub) SplitCompositeKey(compositeKey string) (string, []string, error)


  • GetStateByPartialCompositeKey 根据局部的复合键返回所有的匹配的键值

func (stub *ChaincodeStub) GetStateByPartialCompositeKey(objectType string, attributes []string) (StateQueryIteratorInterface, error)

resultIterator,err = stub.GetStateByPartialCompositeKey(indexName, []string{"boy"})
defer resultIterator.Close()
fmt.Println("-----start resultIterator-----")
for resultIterator.HasNext() {
item, _ := resultIterator.Next()

objectType, compositeKeyParts, err := stub.SplitCompositeKey(item.Key)
if err != nil {
return shim.Error(err.Error())
}
fmt.Println("objectType: "+objectType)
fmt.Println("sex : "+compositeKeyParts[0])
fmt.Println("name : "+compositeKeyParts[1])
}
fmt.Println("-----end resultIterator-----")
# 运行结果
-----start resultIterator-----
objectType: sex~name
sex : boy
name : xiaoli
objectType: sex~name
sex : boy
name : xiaowang
-----end resultIterator----

  • GetQueryResult 对状态数据库进行富查询,仅有couchDB支持

func (stub *ChaincodeStub) GetQueryResult(query string) (StateQueryIteratorInterface, error)

resultIterator , err = stub.GetQueryResult("{\"selector\": {\"sex\": \"boy\"}}" )

defer resultIterator.Close()
fmt.Println("-----start resultIterator-----")
for resultIterator.HasNext() {
item, _ := resultIterator.Next()
fmt.Println(string(item.Value))
}
fmt.Println("-----end resultIterator-----")

  • InvokeChaincode 调用另一个链码中的Invoke方法

func (stub *ChaincodeStub) InvokeChaincode(chaincodeName string, args [][]byte, channel string) pb.Response

# chaincode_example02 中 a向b 转账
trans:=[][]byte{[]byte("invoke"),[]byte("a"),[]byte("b"),[]byte("11")}
stub.InvokeChaincode("mycc",trans,"mychannel")

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,100评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,308评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,718评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,275评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,376评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,454评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,464评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,248评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,686评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,974评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,150评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,817评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,484评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,140评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,374评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,012评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,041评论 2 351

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,776评论 0 38
  • 首先巴拉巴拉一下golang反射机制的三个定律 1.反射可以从接口类型到反射类型对象 2.反射可以从反射类型对象到...
    吃猫的鱼0阅读 2,905评论 0 1
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,605评论 18 399
  • 1. JavaScript 定义了几种数据类型? 哪些是原始类型?哪些是复杂类型?原始类型和复杂类型的区别是什么...
    冰滩波纹阅读 115评论 0 0