智能合约是区块链中一个非常重要的概念和组成部分。在Fabric中内成为Chaincode,中文翻译为链码。涉及到链码地方都是 Chaincode.
Fabric中的Chaincode包含了一个Chaincode代码和Chaincode管理命令这两部分。
Fabric的Chaincode是一段运行在容器中的程序。Chaincode是客户端程序和Fabric之间的桥梁。
通过Chaincode客户端程序可以发起交易,查询交易。
Chaincode是运行在Dokcer容器中,因此相对来说安全。
目前支持 java,node,go,go是最稳定的。其他还在完善。
Chaincode管理命令主要用来对Chaincode进行安装,实例化,调用,打包,签名操作。
Chaincode命令包含在Peer模块中,是peer模块中一个子命令, 该子命令的名称 是chaincode.该子命令是 peer chaincode
首先创建一个目录存放Chaincode的代码。建议放在$GOPATH指定的路径中。
真的勇士敢于直面惨淡的人生,敢于正视淋漓的鲜血
Chaincode需要引入一个写Fabric提供的一些系统包,这些系统提供了Chaincode和Fabric进行通信的接口。
在引入包中, shim提供了Fabric系统提供的上下文环境,包含了Chaincode和Fabic交互的接口。在Chaincode中,执行赋值,查询,等功能都是需要通过shim.
每个chaincode必须需要定义一个结构体,结构体的名称可以是任意符合Golang命名规范的字符串。
chaincode结构体是chaincode的主体结构。chaincode结构体需要实现Fabric提供的接口 peer,其中必须实现的两个方法是:
Init方法是系统初始化方法,当执行命令 peer chaincode instantiate实例化chaincode的时候回调用该方法,同时命令中-c选项后面内容会作为参数传入Init方法中。实例化chaincode实例化命令:
上面命令传入4个参数。注意命令中Args后面一共5个参数,其中一个参数init是固定值,后面 的才是参数。
参数是没有限制的。 可以采用json格式传递
Invoke 方法的主要作用是写人数据 ,比如发起交易等。
在执行命令peer chaincode invoke 的时候系统会调用该方法, 同时会把命令中-c中参数传入方法中。
传入三个参数, 注意Args后面数据中的第一个值 invoke 是默认的固定参数。
shim 主要负责和客户端进行通信。
Success 方法负责将正确的消息返回给调用Chaincode的客户端。
Error方法将错误的信息返回给调用Chaincode的客户端。
LogLevel方法负责修改Chaincode中运行日志的级别。
在shim包中有个一个接口ChaincodeStublnte 。在Invoke方法和Query方法中该接口作为参数传入方法中。
ChaincodeStublnte 提供了一组方法。
一个命令来测试GetFunctionAndParameters方法是怎样接收客户端传递过来的参数。
Chaincode是通过peer模块的Chaincode子命令来完成相关部署的工作。执行命令 peer chain-help:
Chaincode命令的公用选项
instal命令成功后,会在peer模块的数据文件中生成一个-n参数和一个-v参数组成的文件。
在该路径下面会发现一个名为:qlkszzncc.1.1的类似的文件。这个文件就是 Chaincode打包之后的文件。
命名执行完成之后会启动Chain运行的Docker镜像,同时还会对Chaincode进行初始化。
- C -----channelID-----当前命命令运行的通道。默认是 testchainid
- c -----ctor-----JSON格式的构造参数。默认值是{}
- E -----escc -----应用于当前Chaincode的系统背书Chaincode的名字
- l -----lang-----编写Chaincode的变成语言,默认值是Golang
- n-----name-----Chaincode的名称
- P-----policy-----当前的Chaincode的背书策略
- v-----version-----当前操作的Chaincode的版本,
- V-----vscc-----当前Chaincode调用的验证系统Chaincode的名字
区块链最重要的一个特点是:去中心化。所有参与者集体维护公共账本。
Fabaric 中对数据参与方对数据的确认是真实通过Chaincode来进行的。
在Fabric中有一个非常重要的概念成为Endorsement中文名为背书。
什么是背书呢?
背书就是仪表交易被确认的过程。大概意思就是交易你必须背会一本书才能操作。
背书策略被用来指示对相关的参与方如何对交易进行确认。当一个节点接收到一个交易请求的时候,会调用vscc系统(系统Chaincode,专门负责处理背书相关的操作)与交易的Chaincode共同来验证交易的合法性。在vscc和交易的 Chaincode共同对交易的确认中,通常会做一下的校验。
背书策略是第二和第三的一种方式。
背书策略的设置是通过Chaincode部署时instantiate命令中的-p参数来设置的。
上面的命令是对Chaincode进行实例化的操作。我们提取-p后面的参数:
这个参数包说明是当前Chaincode发起的交易,需要组织编号为 Org1MSP的组织编号为Org2MSP的组织中的任何一个用户共同参与交易的确认并且同意。这样交易才能生效并且记录到 区块链中。
通过上述背书策略的示例我们可以知道背书策略是通过一定的关键字和系统的属性组成的。
背书拆解:
and 参与背书者之间的关系,and表示所有参与方的任何一方参与背书即可完成交易的确认。还可以使用OR,如果使用OR表示参与方的任何一方参与背书即可完成交易的确认。
OrglMSP.m mber 这是表示参与背书的组织和组织中参与背书的用户。Org1MSP表示组织的编号。这个值是怎么来的呢
在cryptoge模块中,给模块根据配置文件生成系统的配置和账号信息。在cryptogen的配置文件有一个节点 Organizations-ID,该节点的值就是该组织的编号。也是在配置背书策略时需要使用到的组织的额编号。member泛指组织内的任何一个用户,淡然也可以是组织某个具体的用户
背书的而编写规则
按照背书规则而进行背书交易,只需要经过一个组织中的任何一个成员验证 就可以生效
按照第三种规则进行别墅交易的方法有两个让交易生效。
还有一点需要注意,就是背书规则只是针对Chain中写入数据的操作进行校验,对于查询类的操作不需要背书。
Fabric中的背书发生在客户端。需要进行相关的代码的编写才能完成整个背书的操作。