在Hyperledger Fabric中,安装和实例化链码是什么意思?它们之间有什么区别?

5
在Hyperledger Fabric文档中,有两个术语: 1. 在同行上安装链码; 2. 在通道上实例化链码。
这两者之间有哪些主要区别呢?文档中指出,一个链码可以安装在多个同行上,但只能实例化一次。我理解这一点是因为通道只需要有关通道的信息。
我正在遵循balance-transfer示例,在创建通道后,同行需要加入该通道。有两个同行加入了通道["peer0.org1.example.com", "peer0.org1.example.com"],因此当我实例化链码时,它会创建两个chaincode的Docker镜像。
dev-peer0.org1.example.com-chaincode-v0  
dev-peer1.org1.example.com-chaincode-v0

这两个图片到底意味着什么?
初始化链码难道不是为通道而做的吗?
还是说通道会在所有加入的同行上进行初始化?
实际上这个初始化是在哪里发生的呢?

谢谢!

2个回答

5
感谢@PaulO'Mahony和@kajuken提供的资源和解释。
以下是我的疑问总结:
  1. 链码在与需要与之交互的任何对等方相关联的Docker容器中运行。
  2. 链码安装在对等方上,然后在通道上实例化。

所有想要使用链码提交交易或读取数据的成员都需要在其对等方上安装链码。

  1. 实例化将输入链码使用的初始数据,然后启动已安装有链码的加入通道的对等方上的链码容器

请注意,只有一个网络成员需要实例化链码。如果已经在已实例化链码的通道上加入了安装有链码的对等方,则链码容器将自动启动。

链码安装到加入通道的每个对等方的文件系统中,然后必须在通道上实例化链码,以便对等方可以通过链码容器与账本进行交互。实例化执行链码的任何必要初始化。这通常涉及设置组成链码初始世界状态的键值对。

  1. 一旦安装了链码,对等节点可以在任何已经实例化的通道上使用相同的链码容器。

参考文献:
安装和实例化链码
实例化链码


0
这两张图片到底意味着什么? 初始化链码不是为通道而设吗?
是和不是。每个节点都需要安装相同版本的链码,因为每个人都需要能够执行和验证传入的查询/调用。
所以有两个步骤要做。
1. 在通道上的每个节点上安装链码 2. 在通道上实例化链码
这个初始化实际上发生在哪里?
因此,在每个节点都“知道”链码并且可以进行验证之后,链码的实例化最后发生。

抱歉,我认为你没有理解这个问题。安装是为了让对等节点贡献调用链码。但是实例化会向通道提供关于调用何种链码版本的信息。当你实例化它时,会创建两个Docker镜像,每个镜像适用于加入通道的每个对等节点。这就是这个问题所涉及的步骤。为什么会有多个镜像? - Shubham Chadokar
哦,那么我认为我们在互相误解。每个节点都有自己的ChainCode镜像来保护自己。失败或恶意代码可以在隔离环境中执行,不会影响节点。每个交易/提案将被定向到该镜像。 - kajuken
你的问题的答案在 Fabric 文档中 -> https://hyperledger-fabric.readthedocs.io/en/release-1.4/chaincode4noah.html?highlight=instantiate (顺便提一下,它们是实例化容器实例,而不是 Docker 镜像)。链码运行在与需要与之交互的任何对等方相关联的 Docker 容器中。通常,只需在需要从中访问链码的那些对等方上安装链码。特别地,该链码必须安装在接收该链码的背书请求的任何对等方上。对等方可以位于不同的组织中。 - Paul O'Mahony
@PaulO'Mahony,我的理解是,通道在已安装链代码的对等方上实例化链代码,而不是在通道上实例化?我理解的对吗?那么当来自不同组织的对等方加入通道并安装链代码时会怎样?因为实例化每个链代码只运行一次。 - Shubham Chadokar
1
@ShubhamChadokar 这个链接可以帮助你回答第一个问题。"[...]节点可能想要加入使用相同链码但具有不同网络成员集的多个通道,以便能够访问数据。节点只需安装一次链码,然后在任何已实例化该链码的通道上使用相同的链码容器。这种轻量级方法节省了计算和存储空间,并帮助您扩展网络。" - kajuken
@kajuken 谢谢你提供的链接,它真的帮了我解决了疑惑。 - Shubham Chadokar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接