LSCC---Lifecycle System Chaincode, 负责chaincode的全生命周期管理。
Invoke操作有INSTALL、DEPLOY(语义上的实例化)、UPGRADE、GETCCINFO、GETDEPSPEC、GETCCDATA、GETCHAINCODES、GETINSTALLEDCHAINCODES。
操作 | 参数 |
---|---|
INSTALL | 1.ChaincodeDeploymentSpec |
DEPLOY UPGRADE |
1.chainName 2.ChaincodeDeploymentSpec 3.SignaturePolicyEnvelope(endorsement policy) 4.escc 5.vscc |
GETCCINFO GETDEPSPEC GETCCDATA |
1.chainName 2.ccName |
GETCHAINCODES GETINSTALLEDCHAINCODES |
None |
- 验证SignedProposal是不是admin节点签署的(check时传入的ADMINS)。
- executeInstall()
- 检查cc名字和版本是否合法,不包含非法字符。
- 把ccPackage写入文件系统。
- 检查参数,如果空则赋值默认值,policy默认是被任意一个成员签署,escc和vscc默认就是系统的escc和vscc,暂不支持自己指定,因为后面会检测指定的cc是不是scc,而scc目前就是固定的这几个不能动态增加。
- executeDeploy()
- 检查cc名字和版本是否合法,不包含非法字符(以及ACL,access control,TODO)。
- 检查链码是否已经存在,就是已经被实例化。
- 获取ccPackage并转换成ChaincodeData。
- 验证实例化策略,ccPackage有两种,源码打包生成的,还有install时直接传入的,直接传入的包有可能是被签名的,被签名的ccPackage是被指定了实例化策略的,只有指定的身份才可以实例化这个cc,其他所有的没被签名的ccPackage默认任意一个ADMIN节点都可以实例化。平常用的install命令,本地传入地址和参数打包生成的ccPackage都是未被签名的。
- createChaincode(),检查指定的escc和vscc是不是scc(所以暂不支持自己的背书和验证链码),最后putState(),其中key是cc名字,value是序列化后的ChaincodeData。
- 跟DEPLOY类似,参考DEPLOY,多了一步检查版本号是不是跟旧的版本号不同。
- 检查通道Readers策略,是否有可读权限。
- 检查cc是否被实例化,成功则按照函数名返回相应信息。
- GETCCINFO返回cc名(成功获取ChaincodeData)。
- GETDEPSPEC返回序列化后的ChaincodeDeploymentSpec。
- GETCCDATA返回序列化后的ChaincodeData。
- 检查是不是ADMIN节点。
- GETCHAINCODES返回所有已经实例化的cc(对LSCC的state进行范围查询)。
- GETINSTALLEDCHAINCODES返回节点上所有安装的cc(不一定实例化)。