Fabric基础架构原理(4):链码

昕阳小编 120 0

本文选自新书《区块链核心技术与应用》,略有删节。上一期介绍了Fabric基础架构的渠道,这一期介绍了Fabric-chain代码的智能合约。

智能合约可以在区尚力财经小编2022 块链环境中部署和运行,用一段代码来描述相关的业务逻辑。部署的智能合约可以& # 039;不要在区块链改装。智能合约的执行完全由代码决定,不受人为因素干扰。一般来说,参与者通过智能合同规定他们的权利和义务、触发合同的条件和结果。一旦智能合同在区块链环境中运行,就可以获得客观准确的结果。

在Fabric中,智能合约也叫chaincode,分为用户链码和系统链码,通常指用户链码。链是访问账簿的基本方法,一般是用Go等高级语言编写的代码,实现规定的接口。上层应用可以通过调用链码来初始化和管理账簿的状态。只要你有适当的权限,链码也可以互相调用。

1。链码的背书策略

背书策略可以在链码实例化时指定。当确认节点接收到交易时,节点学习相关的链码信息,然后检查链码的背书策略,以确定交易是否符合背书策略,如果符合,则将交易标记为合法。

背书策略可以分为委托人(P)和阈值(T)两部分,如下:

1)委托人指定哪些成员背书。

2)threshold接受两个输入,即阈值T和几个P的集合N & # 039;s,并且只要交易中包含了N中T成员的背书,该交易就被认为是合法的。

例如:[X] [X] T (1,& # 039;一& # 039;'B& # 039;)需要A和b的任何成员背书T (1,& # 039;一& # 039;T (2,& # 039;B& # 039;'C & # 039))需要会员A背书或会员B、C同时背书。

2。链码开发

开发过程中需要实现链码接口,事务类型决定了调用哪个接口函数。比如实例化和升级类型会调用链代码的Init接口,而invoke类型事务调用链代码的Invoke接口。代码的接口定义如下:(本文来自微信官方账号:Henry & # 039s注释)

类型链代码接口{init (stub链代码stub接口)pb.response invoke (stub链代码stub接口)pb.response}

接下来举例说明链代码的开发过程。例如,链码根据交易类型创建键值对并记录在账簿中,或者根据键名在账簿中查找相应的值。

请确保安装了Go区域设置,并且正确设置了GOPATH环境变量。

(1)创建链代码存储目录

创建keyValueStore目录存储链代码,进入目录

mkdir $ gopath/src/keyvaluestorecd $ gopath/src/keyValueStore

创建并编辑链代码文件keyValueStore.go

(2)链代码源代码分析

1)导入头文件。

链码必须依赖链码shim包和对等protobuf包,分别用于链码控制和数据传输。其次,KeyValueStore类型被定义为chaincode shim的载体。

包主

导入(

" fmt "

" github . com/hyperledger/fabric/core/chain code/shim "

" github.com/hyperledger/fabric/protos/同行& quot

)

type键值存储结构{

}

2)实现Init方法。

init方法通过shim获取实例化的链代码事务的相关信息。ChaincodeStubInterface,这个接口的GetStringArgs方法可以获取事务传递给链代码的参数。当链被实例化时,接收到两个参数,key和值,因此首先验证参数的数量。如果验证通过,则第一个和第二个参数分别作为键和值存储在帐簿中。

将状态保存到账簿中需要借助shim.ChaincodeStubInterface的PutState方法,由于账簿中的所有数据都是以键值对的形式存储的,所以该方法也只接受key和value两个参数,其中value为字节格式,也包含多个键值pa

It & # 039;值得注意的是,Init方法总是在链代码升级时被调用。编写升级后的链码时要注意Init方法的实现,避免重新初始化或覆盖上一版本的账簿状态。

3)实现调用方法。

类似于Init方法,invoke方法通过shim的GetFunctionAndParameters方法获取Invoke事务的参数。ChaincodeStubInterface,其中返回的fn和args分别是事务调用的特定函数名和对应的参数。此时,Invoke方法进一步判断下一次操作(set或get)的fn值,并将操作结果存储在result变量中返回操作结果。Fabric基础架构原理(4):链码-第1张图片-昕阳网

为了读写账本,链码还需要实现以下两个方法:

set:在账本中记录输入的键值对Fabric基础架构原理(4):链码-第2张图片-昕阳网

get:根据key

读取账本中对应的值4)实现get和put方法。

如前所述,invoke方法根据fn的值执行相应的get或put函数。这两个功能也需要垫片。访问账簿数据的ChaincodeStubInterface。

5)实现main函数main ():

链代码,shim。需要在main函数中调用Start()方法来部署链代码。Fabric基础架构原理(4):链码-第3张图片-昕阳网

(3)测试链码

链码的测试需要经过一个完整的Fabric网络,利用官方提供的例子可以快速搭建测试网络,从而简化链码开发过程。接下来是建立测试网络的步骤:Fabric基础架构原理(4):链码-第4张图片-昕阳网

1)安装示例代码库。

2)进入fabric-samples目录。

$ CD

$ gopath/src/github . com/hyperledger/fabric-samples

3)将新写入的chaincode放入fabric-samples的chaincode目录中。

$ CP-r

$ gopath/src/key value store。/chaincode

4)进入chaincode-docker-devmode目录,启动网络。在命令中将创建一个名为myc的通道。

$ CD chaincode-docker-devmode

$ docker-compose-f docker-compose-simple . yamlup-d

5)进入chain code容器,编译并运行链代码。

$ docker exec-it chain code

$ CD key value store go build

$ export CORE _ PEER _ ADDRESS=PEER:7051

$ export CORE _ chain code _ ID _ name=mycc:0

$。/keyvaluestore

$ exit

6)进入CLI容器并初始化链代码。链码ID为mycc,版本号为0,部署的通道名称为myc。

$ docker exec-it CLI bash

$ peer chain code install-p chain 尚力财经小编2022 code dev/chain code/key value store-n mycc-v 0

$ peer chain code instant-n mycc-v 0-c & # 039;{ & quotargs & quot: ['一& # 039;'10']}'-c myc

7)调用和查询链代码。

$ peer chain code query-n mycc-c ' { " Args "[& # 039;查询& # 039;'一& # 039;]} '-C myc

$ peer chain code invoke-n mycc-C ' { " Args "[& # 039;设置& # 039; '一& # 039; 20']}'-c myc

$对等链代码查询-n myc-c & # 039;{ & quotargs & quot: ['查询& # 039;'一& # 039;]}'-c myc

正常情况下,两次查询返回的结果分别为10和20。

开发链代码时,可以通过上述流程进行测试,但要避免使用相同的链代码id,以免链代码实例化失败。此外,对于链码升级,链码的ID应保持不变,新链码的版本号应高于之前实例化的版本号,并通过升级交易更新链码在渠道中的状态。

假设chaincode 尚力财经小编2022keyValueStore.go发生变化,最新的链码保存在$GOPATH/src/keyValueStoreNew下,升级链码的操作如下:

1)转到fabric-samples目录,将最新的链码复制到chaincode目录下。

$ CD $ gopath/src/fabric-samples

$ CP-r $ gopath/src/keyvaluestorenew。/chaincode

2)进入chaincode容器,编译并运行更新后的链代码。

$ docker exec-it chain code bash

$ CD key value store new go build

$ export CORE _ PEER _ ADDRESS=PEER:7051

$ export CORE _ chain code _ id _ name=mycc:1

$。/keyvaluestorenew

$ exit

3)进入cli容器,升级链代码。

$ docker exec-it CLI bash

$ peer chain code install-p chain code dev/chain code/keyValueStoreNew-n mycc-v1

$ peer chain code upgrade-n mycc-v1-C & # 039;{ & quotArgs & quot:['一& # 039;'10']}'-C myc

到此升级链码完毕,可以对最新的链码mycc进行操作十.

标签:

抱歉,评论功能暂时关闭!

微信号已复制,请打开微信添加咨询详情!