lscc.go

lccc.go

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

INSTALL

  • 验证SignedProposal是不是admin节点签署的(check时传入的ADMINS)。

  • executeInstall()

    • 检查cc名字和版本是否合法,不包含非法字符。

    • 把ccPackage写入文件系统。

DEPLOY

  • 检查参数,如果空则赋值默认值,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。

UPGRADE

  • 跟DEPLOY类似,参考DEPLOY,多了一步检查版本号是不是跟旧的版本号不同。

GETCCINFO GETDEPSPEC GETCCDATA

  • 检查通道Readers策略,是否有可读权限。

  • 检查cc是否被实例化,成功则按照函数名返回相应信息。

  • GETCCINFO返回cc名(成功获取ChaincodeData)。

  • GETDEPSPEC返回序列化后的ChaincodeDeploymentSpec。

  • GETCCDATA返回序列化后的ChaincodeData。

GETCHAINCODES GETINSTALLEDCHAINCODES

  • 检查是不是ADMIN节点。

  • GETCHAINCODES返回所有已经实例化的cc(对LSCC的state进行范围查询)。

  • GETINSTALLEDCHAINCODES返回节点上所有安装的cc(不一定实例化)。

Last updated