我看到以下ref文章中的“发生了什么 - 完全在链代码 - 部署 - 并调用查询在超级边缘” .
对于“注册”链码,链码作者是否必须先将链码注册到ValidationPeer,然后其他节点才能在网络中找到链码并将源码下载到本地并构建docker镜像?如果之后多次部署相同的链代码会发生什么情况,它会覆盖以前的状态吗?
参考:What happened exactly on chaincode deploy and invoke , query, in Hyperledger?
在“部署”期间,链代码以事务的形式提交给分类帐,并分发到网络中的所有节点 . 每个节点都会创建新的Docker容器,并嵌入此链代码 . 在该容器启动之后将执行Init方法 .
在“查询”期间 - 链代码将读取当前状态并将其发送回用户 . 此交易未保存在区块链中 .
在“调用”期间 - chaincode可以修改分类帐中变量的状态 . 每个“调用”事务都将添加到分类帐中的“块” .
2 回答
没有看到链代码级别的“注册”功能 . 我可以做一个假设(请纠正我,如果我错了)我们正在谈论核心API方法“Registrar”
链代码的作者使用“注册器”通过验证或非验证对等体登录网络 . 要登录,作者应通过提供EnrolmentID和EnrolmentPassword确认其身份 . 如果ID和密码正确,将为此特定作者生成新的注册和交易证书 .
从这时起,作者可以将链代码部署到网络中 . “部署”请求将发送给其中一个对等方 . 该对等体将创建“事务”,其中包含有关“链码的路径”,“init参数”,“链码源代码”的信息 . 然后peer将计算此事务的HASH代码,如下所示:
此哈希稍后将用作链代码名称 .
VP保持与网络中所有其他VP的开放连接,并可以向所有这些VP广播事务(有关更多详细信息,请参阅共识说明) .
每个对等体都将使用来自事务的信息来创建部署的链代码所需的本地docker镜像 . 启动新的docker容器,然后执行Init方法 .
如果您尝试再次部署相同的链代码,Fabric将检测已部署具有此类名称的链代码并跳过初始化 .
如果您更改部署请求中的任何内容(路径,参数,链代码中的任何符号),则peer将生成另一个哈希并将部署新的链代码(以前的版本不会受到影响) .
从技术上讲,REGISTER是Deploy事务的一部分
Chaincode提供了Deploy,Invoke,Query方法/ API来与它进行交互 . 当您谈到部署chiancode时,您实际上是在谈论在链代码上调用Deploy方法的最终用户(或应用程序) .
Peer处理Deploy事务,在Docker容器中启动链代码,但Deploy事务处理不会在此处结束 . 在链代码容器上有一个垫片层,它实际上与同行进行通信 . 填充层和对等体之间的这种通信由ChaincodeMessage控制 . 此声明定义了不同类型的ChaincodeMessage:
现在引用来源http://hyperledger-fabric.readthedocs.io/en/latest/protocol-spec/#33-chaincode:
因此,你得到
之后您的链码实际上已准备好接收查询和调用 .