- 什么是chaincode
- chaincode是对逻辑编码,由通道上特定类型的事务调用的应用程序。
- chaincode在与背书节点进程隔离的安全docker容器中运行,通过应用程序提交的事务初始化和管理账本状态。
- 链码通常处理网络成员同意的业务逻辑,因此可以视为“智能合约”。
- 一个链码创建的状态仅适用于该链码,并且不能被另一个链码直接访问,其他链码只能在获得授权的情况下通过调用该链码简介访问其状态。
- peer、chaincode和ledger
- peer同时承载Chaincode和Ledger。由于peer是Ledger和Chaincode的宿主,因此应用程序和管理员访问这些资源时,必须与peer进行交互。首次创建peer时,既没有Ledger,也没有Chaincode。
- 一个peer节点可以同时托管多个Ledger和Chaincode。peer节点可以不通过Chaincode直接访问Ledger,但绝大多数peer节点都会对应至少一个Chaincode,通过Chaincode对Ledger进行查询或更新。
- chaincode触发
- chaincode实现Fabric中的Chaincode接口,Fabric区块链的外部应用程序可以通过invoke()函数调用链码(智能合约),提交事务提案,但需要具有相应的身份授权(CA证书授权)。
- 当链码接收到instance或upgrade事务时,调用Init函数,为链码执行必要的初始化,包括应用程序状态的初始化。
- chaincode通过实现ChaincodeStubInterface接口,访问和修改账本,以及链码之间相互调用。
- 链码的生命周期(Lifecycle System Chaincode ----LSCC)
- Package
- ChaincodeDeploymentSpec或CDS定义的链码
- 实例化策略
- 链码拥有者的签名
- 建立链码所有权
- 允许验证链码包内容
- 便于检测链码包是否被篡改
- 创建带签名的链码包:
- (peer chaincode package -n mycc -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 -v 0 -s -S -i "AND('OrgA.admin')" ccpack.out)
- CDS(ChaincodeDeploymentSpec--链码部署规则)---->单一拥有者
- 多签名(SignedCDS)(包含选项-s时,可以由多个所有者签名。当指定-s时,-S也必须指定)
- peer chaincode signpackage ccpack.out signedccpack.out
- 源码、名称和链码版本
- 实例化策略
- 所有者列表(通过背书定义)
- Install
- peer chaincode install -n asset_mgmt -v 1.0 -p filepath
- 简式安装
- 通过简单的CDS对链码进行安装,使用默认实例化策略,提供空的所有者列表
- 多签名安装
- 所有者对Chaincode串行签名,CLI将签名后的Chaincode打包为SignedCDS并发送给需要安装该chaincode的peer节点,peer调用LSCC中的安装方法对chaincode进行安装。
- Instantiate
- instantiate事务调用LSCC在channel上创建并实例化Chaincode(chaincode绑定channel)
- 一个chaincode可以在任意数量的channel上分别独立的操作(创建和实例化),每个channel的状态都是保持独立和隔离的
- instantiate事务的创建者必须满足SignedCDS中包含的chaincode的实例化策略,并且必须是channel的writer
- Instantiate事务到达peer节点时,peer节点根据chaincode实例化策略验证创建者的证书,并且将在该事务提交到Ledger之前的事务验证期内再次进行创建者证书验证。
- 设置背书策略----描述能被背书节点接受的事务执行结果。
- 使用"key"和“value”对chaincode进行状态初始化:peer chaincode instantiate -n sacc -v 1.0 -c '{"Args":["key","value"]}' -P "OR ('Org1.member','Org2.member')"
- Package
- Upgrade
- 链码可以随时通过修改SignedCDS中的version来进行升级(所有者,实例化策略为可选项),但链码名称必须相同,否则会被认为是完全不同的链码
- 链码升级必须安装到所需的peer节点上,新版本的链码将绑定到channel上,没有绑定新版本链码的channel将继续执行旧版本的chaincode,即升级事务只影响当前channel,绑定到多个channel的chaincode需要在需要升级的每个channel上执行upgrade事务。
- 升级过程中,不会自动删除旧版本,一个chaincode可能会有多个版本同时处于活动状态,因此用户必须在升级前将所有channel上的旧版本chaincode停止运行。
- 升级事务根据旧版chaincode的实例化策略进行身份验证,保证只有现有的成员可以对chaincode进行升级
- Stop 和 Start
- 启动和停止LSCC事务还没有实现,目前只能通过从每个背书节点中删除chaincode容器和SignedCDS包来手动停止chaincode。
- docker rm -f <container id>
- rm /var/hyperledger/production/chaincodes/<ccname>:<ccversion>
- 启动和停止LSCC事务还没有实现,目前只能通过从每个背书节点中删除chaincode容器和SignedCDS包来手动停止chaincode。
- CLI
- 在运行有peer节点的docker容器中运行命令:docker run -it hyperledger-peer bash
- peer chaincode --help
- System chaincode
- System chaincode构建在Peer节点的可执行文件中,在peer进程中运行,而不是像普通chaincode在一个隔离的容器中运行,因此不遵循LSCC。安装,实例化和升级也不适用与system chaincode。
- System chaincode的目的是实现peer与chaincode之间的GRPC通信成本快捷化,以及实现fabric中的大量系统行为。System chaincode只能通过peer使用二进制进行升级,必须注册一组编译的固定参数,并且没有背书策略
- 当前system chaincode列表
-
LSCC(生命周期系统链码)
处理chaincode生命周期请求(package,install,instantiate,upgrade)
CSCC(配置系统链码)
配置system chaincode处理peer端的通道配置
QSCC(查询系统链码)
提供Ledger查询API,如getting blocks
ESCC(背书系统链码)
通过签署事务提案响应来处理背书
VSCC(验证系统链码)
处理事务验证,包括背书策略检查和多版本并发控制
-
- 修改或替换system chaincode时必须小心,特别是LSCC、ESCC和VSCC,因为它们位于主要事务执行路径中。特别是VSCC,当一个块提交到peer进行验证时,channel中所有的peer都要进行相同的验证,以避免Ledger发散(非确定性),因此修改或替换VSCC时需要特别注意
Hyperledger Fabric chaincode
最新推荐文章于 2024-01-08 23:21:34 发布