链码
Fabric的智能合约称为链码(chaincode),分为系统链码和用户链码。系统链码用来实现系统层面的功能,用户链码实现用户的应用功能。链码被编译成一个独立的应用程序,运行于隔离的Docker容器中。
和以太坊相比,Fabric链码和底层账本是分开的,升级链码时并不需要迁移账本数据到新链码当中,真正实现了逻辑与数据的分离,同时,链码采用Go、Java、Nodejs语言编写。
链码类型
系统链码:负责Fabric节点自身的处理逻辑, 包括系统配置、背书、校验等工作,系统链码仅支持Go语言, 在Peer节点启动时会自动完成注册和部署,系统链码共有五种类型:
– 配置系统链码(CSCC——Configuration System Chaincode):负责账本和链的配置管理
– 背书管理系统链码(ESCC——Endorsement System Chaincode):负责背书(签名)过程, 并可以支持对背书策略进行管理
– 生命周期系统链码(LSCC——Lifecycle System Chaincode):负责对用户链码的生命周期进行管理,链码生命周期包括安装、部署、升级、权限管理、获取信息等环节.
– 查询系统链码(QSCC——Query System Chaincode):负责提供账本和链的信息查询功能
– 验证系统链码(VSCC——Verification System Chaincode):交易提交前根据背书策略进行检查 验证过程:(1) 首先解析出交易结构, 并对交易结构格式进行校验;(2) 检查交易的读集合中元素版本跟本地账本中版本一致;(3) 检查带有合法的背书信息(主要是检查签名信息);(4) 通过则返回正确, 否则返回错误消息
用户链码:由应用开发人员使用Go( Java/JS)语言编写基于区块链分布式账本的状态及处理逻辑,运行在链码容器中, 通过Fabric提供的接口与账本平台进行交互
安装,实例化链码
安装链码,其中:ccPath是相对$GOPATH/src的路径;ccType为链码的编程语言,默认为golang,且支持node,car,java:
peer chaincode install -n ${ccName} -v ${ccVersion} -p ${ccPath} -l ${ccType}
链码安装并未产生交易,因此不会影响通道内的其它peer节点,可以说链码安装是一个本地操作。
实例化链码:
peer chaincode instantiate -o ${ordererAddr} -C ${channelName} -n ${ccName} -v ${ccVersion} -c ${InitArgs} -P ${EndorserPolicy}
其实链码实例化,就是一笔特殊的交易,链码在某个节点实例化后,实例化的信息就被广播到通道内的所有节点了。如果其它节点再次实例化,自然就会冲突。通道内的其它peer节点,只是同步了世界状态,并不需要调用被实例化链码的Init,也就不会创建镜像,并启动链码容器了。