链码(chaincode)是 Hyperledger Fabric 提供的智能合约,是上层应用与底层区块链平台交互的媒介。现阶段,Fabric 提供 Go、Java、Node.js 等语言编写的链码
Fabric 智能合约链码开发的基础,一句话总结起来就是:一个基类,两个查询,一个写入。
所有的链码都实现两个接口,init 和 invoke。
- Init(stubshim.ChaincodeStubInterface) :init用于合约初始化及升级初始化动作;
- Invoke(stubshim.ChaincodeStubInterface):Invoke是peer调用链码的入口函数;
init 接口
用于初始化合约,在整个链码的生命周期里,该接口仅仅执行一次。
invoke 接口
是编写业务逻辑的唯一入口,虽然只有一个入口,但是可以根据参数传递的不同自由区分不同业务逻辑,灵活性很高。比如应用开发者规定 Invoke 接口的第一个参数是合约方法名,剩余的 Invoke 参数列表是传递给该方法的参数,那么就可以在 Invoke 接口方法体中根据方法名的不同分流不同业务了。
编写链码还有一个非常重要的原则:不要出现任何本地化和随机逻辑。
fabric默认的状态数据库是个k-v库,常用到的方法
- 两个查询
- getState(k)获取单独的key对应的value值。
- rangeQueryState(k1,k2),获取k1开始,k2结束的所有k-v对象, 返回的是个Map<String,String>对象, 其中k1,k2按字典序排序
- 一个写入
- putState(k,v), 写入数据,此处要注意下,putState数据并不会马上落到账本上, 要等到第二段交易提交共识达成后,数据才会落地。