Hyperledger Fabric 链码生命周期

article/2025/10/3 7:04:21

目录

一、什么是链码

二、部署链码

2.1 安装和定义链码

2.1.1 打包智能合约

2.1.2 peer节点安装链码

2.1.3 组织批准链码

2.1.4 将链码提交到通道

2.2 升级链码

总结


一、什么是链码

ChainCode(链码)是一个程序,用Go、Node.js或Java编写,实现了规定的接口。ChainCode运行在一个安全的Docker容器中与背书节点相隔离,ChainCode通过应用程序提交的交易来初始化和管理账本状态。

链码通常处理由网络成员同意的业务逻辑,因此可以被视为“智能合约”。由链码创建的分类账本更新仅限于该链码,别的链码无法直接访问,但是,在同一个网络中,如果获得适当的权限,链码就可以调用另一个链码来访问其状态。

二、部署链码

Fabric 链码生命周期是一个过程,它允许多个组织对于在通道上的链码在使用之前就如何操作链码达成一致,我们使用Fabric生命周期来操作部署和操作链码:

2.1 安装和定义链码

Fabric 链码生命周期要求组织同意定义链码的参数,例如名称、版本和链码背书策略,通道成员通过以下四个步骤达成一致,但是并非频道上的每个组织都需要完成每个步骤。

  1. 打包智能合约:这一步可以由一个组织完成,也可以由每个组织完成。
  2. 将链码安装在peer节点上:每个要使用链码来为交易背书或查询账本的组织都需要完成此步骤。
  3. 组织批准链码:每个要用链码的组织都需要完成此步骤。链码定义需要得到足够数量的组织的批准才能满足通道的 LifecycleEndorsement 政策(默认为多数),然后才能在通道上启动链码。
  4. 将链码提交到通道:一旦通道上所需数量的组织获得批准,将由一个组织提交事务。提交者首先从已批准的组织中收集足够多的peer节点的背书,然后提交交易以提交链码。

2.1.1 打包智能合约

chaincode 需要打包在一个 tar 文件中,然后才能安装到peer节点上,可以使用 Fabric peer 二进制文件、Node Fabric SDK 或第三方工具(例如 GNU tar)打包链码。当你创建一个链码包时,你需要提供一个链码包标签来创建一个简洁易读的包描述。

如果使用第三方工具打包链码,则生成的文件需要采用以下格式。Fabric peer 二进制文件和 Fabric SDK 将自动以这种格式创建文件。

  • 链码需要打包在一个 tar 文件中,以.tar.gz文件扩展名结尾。

  • tar 文件需要包含两个文件(无目录):一个元数据文件“metadata.json”和另一个包含链代码文件的 tar“code.tar.gz”。

  • “metadata.json”包含指定链码语言、代码路径和包标签的 JSON。可以在下面看到元数据文件的示例:

{"Path":"fabric-samples/asset-transfer-basic/chaincode-go","Type":"golang","Label":"basicv1"}

 链码由 Org1 和 Org2 分别打包。这两个组织都使用 MYCC_1 作为他们的包标签,以便使用名称和版本来识别包。组织没有必要使用相同的包标签。

2.1.2 peer节点安装链码

只有安装了链码的peer节点才可以执行交易和背书交易,无论是CLI还是SDK,都需要用Peer Administrator来完成此步骤。在安装链码后将构建链码,如果链码有问题,就会返回构建错误。建议组织只需要打包一次链码,然后再属于组织的需要安装的peer节点上安装相同的链码包,如果通道想要确保每个组织运行相同的链码,一个组织就完成打包工作然后发送给通道内的其他成员。

成功的安装命令将返回一个链码包标识符,它是包标签与包的哈希组合。此包标识符用于将安装在peer节点上的链码包与组织批准的链码定义相关联, 为下一步保存标识符,还可以通过使用 Peer CLI 查询安装在对等方上的包来查找包标识符。

 Org1 和 Org2 的 peer 管理员在加入频道的 peer 上安装链码包 MYCC_1。安装链码包会构建链码并创建一个包标识符 MYCC_1:hash。

2.1.3 组织批准链码

当通道成员批准链码定义时,批准是由其接受的链码参数的组织的投票。这些经批准的组织定义允许通道成员在链码用于通道之前就其达成一致,链码定义包括以下参数,这些参数需要在组织之间保持一致:

  • 名称:应用程序在调用链码时将使用的名称。

  • 版本:与给定链码包关联的版本号或值。如果你升级链码二进制文件,你还需要更改链码版本,版本可以包含任何字符,但通常使用诸如v1.v2.v3的格式,peer节点不会检查版本,它只是一个指标,旨在帮助组织在更新其链码逻辑时进行协调。

  • 序列:在通道上定义链码的次数。该值是一个整数,用于跟踪链码升级。例如,第一次在通道上批准并提交链码定义时,必须将序列号设置为 1。当下次升级链码或更新链码定义时,将序列号增加为 2,序列号由peer节点使用,以确保所有组织都与其批准和提交的链码定义保持同步。

  • 背书政策:哪些组织需要执行和验证交易输出。背书策略可以表示为传递给 CLI 的字符串,也可以引用通道配置中的策略。默认情况下,背书策略设置channel/Application/Endorsement,默认要求通道中的大多数组织对交易进行背书。

  • 集合配置:与链码关联的私有数据集合定义文件的路径。有关私有数据集合的更多信息,请参阅私有数据架构参考。

  • ESCC/VSCC 插件:链码要使用的自定义背书或验证插件的名称。

  • 初始化:如果使用Fabric ChainCode Shim API提供的低级API,则链码需要包含用于初始化链码的Init函数。chaincode接口需要此函数,但不一定需要由你的应用程序调用,当你批准链码定义时,你可以指定是否Init必须在调用之前调用。如果你指定这Init是必需的,Fabric 将确保Init在链码中的任何其他函数之前调用该函数并且只调用一次,请求执行Init函数允许你实现在初始化链码时运行的逻辑,例如设置一些初始状态。每次增加链码的版本时,都需要调用init才能初始化链码,假设链码定义递增版本指示所需的Init。

链码定义还包括包标识符。这是每个想要使用链码的组织的必需参数,所有组织的包 ID 不必相同,组织可以在不安装链码或在定义中包含标识符的情况下批准链码定义。

每个想要使用链码的通道成员都需要为其组织批准链码定义,此批准需要提交给排序服务,然后分发给所有peer。此批准需要由你的组织管理员提交,成功提交批准事务后,批准的定义将存储在可供组织的所有peer使用的集合中。因此,即使你有多个peer节点,你的组织也只需批准一次链码。

Org1 和 Org2 的组织管理员为其组织批准 MYCC 的链码定义。链码定义包括链码名称、版本和背书策略等字段。由于两个组织都将使用链码来背书交易,因此两个组织的批准定义都需要包含 packageID。 

2.1.4 将链码提交到通道

一旦足够数量的通道成员批准了链码定义,一个组织就可以将该定义提交给通道。在使用 peer CLI 将定义提交到通道之前,你可以使用该 checkcommitreadiness命令根据哪些通道成员已批准定义来检查提交链代码定义是否应该成功。提交交易提案首先发送给通道成员的peer,他们查询为其组织批准的链码定义,如果他们的组织批准,则认可该定义。然后将事务提交给orderer,然后将链码定义提交给通道,提交定义事务需要以组织的管理员的身份提交。

需要批准定义才能成功提交到通道的组织数量由 Channel/Application/LifecycleEndorsement策略控制。默认情况下,此策略要求通道中的大多数组织认可交易,LifecycleEndorsement 策略与链码背书策略是分开的。例如,即使链码背书策略只需要一个或两个组织的签名,大多数通道成员仍然需要根据默认策略批准链码定义,提交通道定义时,你需要针对通道中足够多的peer组织来满足你的 LifecycleEndorsement 策略。

你还可以将Channel / Application / LifeCycleEndoseMent策略设置为签名策略,并明确指定通道上可以批准链码定义的组织集。这允许你创建一个通道,其中选定数量的组织充当链码管理员并管理通道使用的业务逻辑。如果你的频道拥有大量 Idemix组织,你也可以使用签名策略,这些组织无法批准链码定义或背书链码,并可能因此阻止频道达到多数。

来自 Org1 或 Org2 的一位组织管理员将链码定义提交到通道。频道上的定义不包括 packageID。

在将链码定义提交到通道后,链码容器将在已安装链码的所有peer节点上启动,从而允许通道成员开始使用链码,链码容器可能需要几分钟才能启动,你可以使用链码定义来要求调用Init函数来初始化链码。如果Init请求调用函数,则链码的第一次调用必须是对该Init函数的调用,函数的调用Init受链码背书策略的约束。

2.2 升级链码

你可以使用与安装和启动链码相同的 Fabric 生命周期过程来升级链码,你可以升级链码二进制文件,或仅更新链码策略,按照以下步骤升级链码:

  1. 重新打包链码:如果你正在升级链码二进制文件,则只需完成此步骤。

    Org1 和 Org2 升级链码二进制文件并重新打包链码,两个组织都使用不同与之前的包装标签。 

  2. 在你的对等节点上安装新的链码包:同样,如果你要升级链码二进制文件,则只需完成此步骤。安装新的链码包将生成一个包 ID,需要将其传递给新的链码定义,你还需要更改链码版本,生命周期过程使用该版本来跟踪链码二进制文件是否已升级。

    Org1 和 Org2 将新软件包安装到它们的对等节点上。安装会创建一个新的 packageID。 

  3. 批准新的链码定义:如果要升级链码二进制文件,则需要更新链码定义中的链码版本和包 ID。你还可以更新你的链码背书策略,而无需重新打包你的链码二进制文件,通道成员只需批准新策略的定义,新定义需要将定义中的序列变量加一。

    Org1 和 Org2 的组织管理员为其各自的组织批准新的链码定义,新定义引用新的 packageID 并更改链码版本,由于这是链码的第一次更新,因此序列从一增加到二。

  4. 将定义提交到通道:当足够数量的通道成员批准新的链码定义时,一个组织可以提交新定义以将链码定义升级到通道,作为生命周期过程的一部分,没有单独的升级命令。

    Org1 或 Org2 的组织管理员将新的链码定义提交到通道。

提交链码定义后,将使用升级后的链码二进制文件中的代码启动一个新的链码容器。如果你在链码定义中请求执行该函数,则需要在新定义成功提交后再次Init调用该函数来初始化升级后的链码。如果在不更改链码版本的情况下更新了链码定义,则链码容器将保持不变,并且您无需调用Init函数。

将新定义提交到通道后,每个对等点将自动启动新的链码容器。

Fabric 链码生命周期使用链码定义中的序列来跟踪升级。所有通道成员都需要将序列号加一并批准新定义以升级链码。version 参数用于跟踪链码二进制文件,只有在升级链码二进制文件时才需要更改。


总结

参考:Fabric chaincode lifecycle — hyperledger-fabricdocs main documentation


http://chatgpt.dhexx.cn/article/bCoRYaot.shtml

相关文章

matlab freeman链码,对Freeman链码分析的角点检测算法

图像中的角点是图像的重要特征, 具有旋转不变性, 决定了图像形状, 可以降低图像信息的存储效率, 在目标跟踪, 目标检测, 图像匹配, 图像轮廓拟合等领域都有重要的应用价值. 近几十年来, 国内外学者提出的图像角点检测算法[, 各有各的优缺点, 大致可分为三大类: 基于灰度强度的角…

Fabric链码升级

一、修改链码,上传 二、打包链码 1、设置组织1环境变量 export PATH${PWD}/../bin:$PATH export FABRIC_CFG_PATH$PWD/../config/ # Environment variables for Org1 export CORE_PEER_TLS_ENABLEDtrue export CORE_PEER_LOCALMSPID"Org1MSP" export C…

图像特征-链码(Freeman code)

目录 引言链码编程实现轮廓提取链码计算 总结 引言 本文介绍了图像的形状特征–链码,以及通过python和opencv实现的链码提取方法。所有opencv的版本为3.4.2,已经移除了直接返回链码的选项。 链码 链码用于描述图像的形状特征,首先需要获得图像…

Java知识扫盲——向上转型(类向上转型、接口向上转型)以及向上转型的优势、灵活运用

目录 普通类示例 抽象类的向上转型, 接口向上转型: 作用:使用向上转型可以,提高代码的简洁性、灵活性、适用性。 普通类示例 父类: package 普通类向上转型;public class Father {public int age 48;public void…

java 向上转换_java的向上转型总结

在《think of java》中对向上转型有着如下的描述 看完之后很蒙圈,所以自己在网上找了一些描述,并自己做了简单的总结 简单的例子 class A{ public void A1(){ System.out.println("父类方法1"); } public void A2(){ System.out.println("…

JAVA中多态以及向上转型向下转型、重写的讲解

重写 重写(override):也称为覆盖。重写是子类对父类非静态、非private修饰,非final修饰,非构造方法等的实现过程 进行重新编写, 注意!!!返回值和形参都不能改变。 重写的好处在于子类可以根据需要&#x…

JAVA中的向上转型和向下转型

一、向上转型和向下转型 向上转型和向下转型是在JAVA继承操作中用到的东西,在讲到转型之前我们需要认识到继承过程中的对象类型转换,这种转换有两个特点: 1.这是继承过程中发生的操作 2.新类是现有类的一种类型。这种说法主要是因为现有类的方…

java转型 内存_Java向上转型及内存分析

学习设计模式的时候,发现很多模式都用到了向上转型(eg. 工厂方法)。而我对向上转型(upcasting)的机制并不十分熟悉。这篇文章将深入分析向上转型的机制、内存分析。 概念 先从几个基本概念开始: 1. Java中的引用类型(reference type) Java中的数据类型分…

java向上转型_Java向上转型和向下转型

一、向上转型 简单的说向.上转型就是:将-一个子类类型的对象赋值给- -个父类类型的变量, 基本的实现语法: 父类类型变量new 子 类类型(); DEMO:向上转型 发现了可以使用父类类型的变量调用子类覆写了父类的方法,但是为什么不调用Worker的say()方法呢?原…

C++ 向上转型

在 C 中经常会发生数据类型的转换,例如将 int 类型的数据赋值给 float 类型的变量时,编译器会先把 int 类型的数据转换为 float 类型再赋值;反过来,float 类型的数据在经过类型转换后也可以赋值给 int 类型的变量。 数据类型转换…

java 对象向上转型_JAVA对象向上转型和向下转型

今天做了一个测试的题目,发现自己还是很多问题没有静下心来做。很多问题是可以自己解决的但是自己一是没有读清题意,二是自己心里太急躁了。所以这个要自己应以为鉴! 对象的转型问题其实并不复杂,我们记住一句话:“父类…

java 向上转型_Java 转型问题(向上转型和向下转型)

Java 转型问题其实并不复杂,只要记住一句话:父类引用指向子类对象。 什么叫父类引用指向子类对象? 从 2 个名词开始说起:向上转型(upcasting) 、向下转型(downcasting)。 举个例子:有2个类,Father 是父类&a…

java向上转型_Java向上转型

向上类型转换: 1.可以通过父类引用变量调用的方法是子类覆盖或继承父类的方法。 2.父类引用变量无法调用子类新增成员变量和新增成员方法。 举个例子 public classAnimal { public voidsleep() { System.out.println("Animal sleep"); } public voidjump(…

向上转型与向下转型(超详细)

本文利用代码例子解释向上转型与向下转型,文末有举例整合原代码。 首先,我们要知道:转型发生在继承后,也就是父类子类存在的前提下。其次,我们要清楚:向下转型的前提是已经发生了向上转型,向下转…

java向上转型

我们知道按照现有类的类型来创建新类的方式为继承。 换句话说 “新类是现有类的一种类型” 因为继承可以确保父类中所有的方法在子类中也同样有效,所以能够向父类发送的所有信息也同样可以向子类发送。 这儿有一个例子: public class Test {public sta…

类中的向上转型与向下转型详解

我们的类与类之间会存在继承关系,子类继承父类,一个父类可以有多个子类,例如Animal类就可以有Cat子类,Dog子类,等等。那么我们在运用的时候根据不同的场景会出现向上转型和向下转型的情况。 一、向上转型 1、Animal a…

【基础知识】向上转型和向下转型

向上转型和向下转型的利弊 一、向上转型 好处:隐藏了子类型,提高了代码的扩展性。 坏处:只能使用父类的功能,不能使用子类特有功能,功能被限定。 使用场景:不需要面对子类型,通过提高扩展性&am…

Java向上转型的作用(有详细代码介绍)

今天看到一道Java的练习题,题目如下 当时对于主函数中 Car car (Car) new Benz(); 不是很理解,也并不知道有什么意义,因为如果仅仅写Car car new Benz(); 程序运行结果是一样的。 在经过阅读书籍和查看别的博主写的关于向上向下转型的…

MATLAB三维数组转为二维数组(时间序列分析中很有用)

在MATLAB中三维数组转二维的方法 一、写该程序的初衷 在处理时间序列遥感数据的时候,我之前的做法是: 将时间序列数据读取为三维矩阵;将该数据保存为BIP格式;在每个像元上进行循环,取出其第三维(比如有46…

Matlab一维数组及其应用

目录 1.一维数组 2.与一维数组相关的函数 3.一维数组在二维绘图中的应用 4.在已存在的图形上添加新图形 5.在一个图形窗口中绘制多个子图 6.一维数组在一元多项式运算中的应用 1.一维数组 数值数组(简称为数组)是Matlab中最重要的一种内建数据类型。数组运算是Matlab软件…