当前位置: 首页 > news >正文

Fabric系列 - 链码-内部链码的特性

(1)Fabric repo下的案例

Chaincode(1.4的目录结构)

fabric/examples/chaincode/go
├── example02			#一个简单的转账合约
├── eventsender			#发送事件通知
├── passthru			#调用其他链码(或者其他channel的链码)

example02 (转账)

一个简单的转账合约。该链码简单实现了两方的转账功能,很适合初学者上手。

eventsender (发送事件通知)

展示如何在链码中发送事件通知,以进行交易确认或审计

注意: 每笔交易只能发送一个事件

stub.SetEvent("evtsender", []byte(tosend))

passthru (调用其他链码 或 其它channel的链码)

该链码实现了一个简单的链码“网关”,其对外暴露的Invoke接口允许用户调用其他链码(指定ID、方法和参数),并将调用结果返回用户。

调用其他链码需要使用stub.InvokeChaincode方法。该方法用于调用另一个链码中的Invoke方法,格式为:

InvokeChaincode(chaincodeName string,args[][]byte,channel string)pb.Response

其中,chaincodeName为链码ID;args为调用参数;channel为调用的链码所在通道。如果channel为空,则默认为当前通道。

注意,stub.InvokeChaincode方法目前仅限于读操作,同时不会生成新的交易。

(2)fabric-samples下的案例

fabric-samples/chaincode/README.md
├── abac				#基于属性的权限控制
├── marbles02			#资产权属管理 (包含 分页范围查询 的用例)
├── marbles02_private	#私密数据(允许通道内指定若干组织访问特定私密数据)

marbles02 (资产权属管理)

以大理石的权属管理为例,介绍如何在链码中定义资产,以及资产的创建、查询、转移所有权等操作。

abac (基于属性的权限控制)

fabric基于证书属性的权限控制, 官方有使用案例
v1.4.8 https://github.com/hyperledger/fabric-samples/tree/v1.4.8/chaincode/abac
v2.2.1 https://github.com/hyperledger/fabric-samples/tree/v2.2.1/asset-transfer-abac

展示如何在链码中利用证书属性对访问权限进行细粒度控制

链码中进行权限控制需要通过客户端身份库github.com/hyperledger/fabric-chaincode-go/pkg/cid. 该库提供了获取调用者的MSP ID和身份属性的相关方法

通过调用cid.AssertAttributeValue方法,确定调用者是否有abac.init属性。调用者的属性是通过Fabric CA进行添加的

#通过sdk注册时添加属性
fabric-ca-client register ... --id.attrs 'abac.init=true'#合约中检查
cid.AssertAttributeValue(stub, "abac.init", "true")

marbles02_private (私密数据)

fabric支持私密数据的合约功能, 官方有使用案例
v1.4.8 https://github.com/hyperledger/fabric-samples/tree/v1.4.8/chaincode/marbles02_private
v2.2.1 https://github.com/hyperledger/fabric-samples/tree/v2.2.1/chaincode/marbles02_private

Fabric 1.2版本引入了私密数据功能,允许通道内指定若干组织访问特定私密数据。通过示例介绍如何在链码中使用私密数据

定义私密数据 collections_config.json

[{"name": "collectionMarbles","policy": "OR('Org1MSP.member', 'Org2MSP.member')","requiredPeerCount": 0,"maxPeerCount": 3,"blockToLive":1000000,"memberOnlyRead": true
},{"name": "collectionMarblePrivateDetails","policy": "OR('Org1MSP.member')","requiredPeerCount": 0,"maxPeerCount": 3,"blockToLive":3,"memberOnlyRead": true}
]

读写私密数据

stub.PutPrivateDatastub.GetPrivateData

(3)链码升级(2.0)

在 chaincode更新代码后,需要把新的代码通过install交易安装到正在运行该 chaincode的 peer 上,安装时需注明比先前版本更高的版本号,接下来向任意一个安装了新代码的 peer 发送 upgrade 交易就能更新 chaincode,chaincode 在更新前的状态也会得到保留

version与sequence

  • **version:**与给定链码包关联的版本号或值。如果升级链码二进制文件,则还需要更改链码版本。
  • **Sequence:**链码被定义的次数。该值是一个整数,用于跟踪链码升级。例如,当您第一次安装和批准链码定义时,序列号将为 1。当您下次升级链码时,序列号将增加到 2。
  • Fabric 链码生命周期使用链码定义中的Sequence来跟踪升级。所有频道成员都需要将序列号加一并批准新定义以升级链码。version 参数用于跟踪链码二进制文件,只有在升级链码二进制文件时才需要更改。

升级步骤

  1. 重新打包链码(升级链码文件情形)
  2. 重新安装链码(升级链码文件情形)
  3. 组织同意新的链码定义:
    (1) 升级链码文件:需要更新链码定义中的链码版本和package ID
    (2)仅仅更新背书策略:无需执行1,2
    无论哪种情况,每次升级sequence都需要加1
  4. 提交链码定义:当足够数量的通道成员批准了新的链码定义时,一个组织可以提交新定义以将链码定义升级到通道。 作为生命周期过程的一部分,没有单独的升级命令
  5. 如果您要求在链码定义中执行Init函数,则需要在成功提交新定义后再次调用Init函数来初始化升级的链码
    • 注意:在升级过程中,chaincode的Init函数会被调用以执行数据相关的操作,或者重新初始化数据;所以要多加小心避免在升级chaincode时重设状态信息。

链码的背书策略的升级

基本每个都是痛点。尤其背书策略的升级,这是目前链码管理最为人诟病的地方。背书策略在链码实例化时指定,一旦通道成员发生变化就必须更新背书策略,而更新背书策略又需要所有成员进行链码升级。现在一个默认的背书策略就可以解决所有问题,有特殊背书需求,也可以仅升级背书策略就行。而去中心化的链码部署/升级过程也更加的”区块链“了,不再是一言堂。


往期精彩回顾:
区块链知识系列
密码学系列
零知识证明系列
共识系列
公链调研系列
BTC系列
以太坊系列
EOS系列
Filecoin系列
联盟链系列
Fabric系列
智能合约系列
Token系列

相关文章:

Fabric系列 - 链码-内部链码的特性

(1)Fabric repo下的案例 Chaincode(1.4的目录结构) fabric/examples/chaincode/go ├── example02 #一个简单的转账合约 ├── eventsender #发送事件通知 ├── passthru #调用其他链码(或者其他channel的链码)example02 (转账) 一个简单的转账合约。该链码简单实…...

NetApp SnapCenter 备份管理 ——借助应用程序一致的数据备份管理,简化混合云操作

NetApp SnapCenter 简单、可扩展、赋权:跨 Data Fabric 的企业级数据保护和克隆管理 主要优势 • 利用与应用程序集成的工作流和预定义策略简化备份、恢复和克隆管理。 • 借助基于存储的数据管理功能提高性能和可用性,并缩短测试和开发用时。 • 提供基…...

Java内置队列和高性能队列Disruptor

一、队列简介 队列是一种特殊的线性表,遵循先入先出、后入后出(FIFO)的基本原则,一般来说,它只允许在表的前端进行删除操作,而在表的后端进行插入操作,但是java的某些队列运行在任何地方插入删…...

比特数据结构与算法(第四章_下)二叉树的遍历

本章将会详细讲解二叉树遍历的四种方式,分别为前序遍历、中序遍历、后续遍历和层序遍历。在学习遍历之前,会先带大家回顾一下二叉树的基本概念。学习二叉树的基本操作前,需要先创建一颗二叉树,然后才能学习其相关的基本操作&#…...

chatGPT是什么

2022年11月,人工智能公司OpenAI推出了一款聊天机器人:ChatGPT。它能够通过学习和理解人类语言来进行对话,还能与聊天对象进行有逻辑的互动。除了聊天,ChatGPT还能够根据聊天对象提出的要求,进行文字翻译、文案撰写、代…...

jenkins漏洞集合

目录 CVE-2015-8103 反序列化远程代码执行 CVE-2016-0788 Jenkins CI和LTS 远程代码执行漏洞 CVE-2016-0792 低权限用户命令执行 CVE-2016-9299 代码执行 CVE-2017-1000353 Jenkins-CI 远程代码执行 CVE-2018-1000110 用户枚举 CVE-2018-1000861 远程命令执行 CVE-2018…...

用canvas画一个炫酷的粒子动画倒计时

前言 😆 这是一篇踩在活动尾声的文章,主要是之前在摸鱼社群里有人发了个粒子动画的特效视频,想着研究研究写一篇文章出来看看,结果这一下子就研究了半个多月。 😂 下面就把研究成果通过文字的形式展现出来吧&#xf…...

Java技术学习——Maven相关知识

一、什么是Maven? Maven是Apache软件基金会组织维护的一款专门为Java项目提供构建和依赖管理支持的工具。 1.1 构建 构建过程包含的主要环节如下: 清理:删除上一次构建的结果,为下一次构建做好准备编译:Java源程序…...

C++ 认识和了解C++

1.在使用C语言写代码的时候开头要用到的是&#xff1a; #include<iostream> using namespace std;不可以写成这样&#xff1a; #include iostream.h&#xff08;1&#xff09;iostream是输入输出流类&#xff0c; istream输入流类 cin >> ostream输出流类 cout &…...

u盘误删的文件怎么找回

u盘误删的文件怎么找回?u盘的特点之一就是极其便携&#xff0c;可以容纳各种格式的数据和文件&#xff0c;需要时可以直接使用。每次使用都会或多或少的存放一些文件&#xff0c;但有使用就会有删除&#xff0c;为了不影响使用性&#xff0c;清理存储空间是必要的。清理中如果…...

二分查找由浅入深--算法--java

二分查找写在开头算法前提&#xff1a;算法逻辑算法实现简单实现leftright可能超过int表示的最大限度代码分析和变换更多需求&#xff1a;求索引最小的值java二分API应用基础题思考难度方法写在开头 二分查找应该是算比较简单的这种算法了&#xff0c;我本以为还可以。但有时候…...

【学习】笔记本电脑重新安装系统win10

安装系统有很多方法: 软件安装制作启动u盘本文使用的方法就是启动盘安装: 1.首先下载iso镜像文件: msdn我告诉你:MSDN, 我告诉你 - 做一个安静的工具站 (itellyou.cn) 2.下载启动盘制作工具: 制作启动盘rufus:Rufus - 轻松创建 USB 启动盘 3.官网下载: https://do…...

RocketMQ的一些使用理解

1.RocketMQ的生产者生产负载策略&#xff08;3种&#xff09; (1)SelectMessageQueueByHash &#xff08;一致性hash&#xff09; (2)SelectMessageQueueByMachineRoom &#xff08;机器随机&#xff09; (3)SelectMessageQueueByRandom &#xff08;随机&#xff09; 第1种一…...

Java枚举详解

一.枚举 1.为什么有枚举&#xff1f; 如果我们的程序需要表示固定的几个值&#xff1a; 比如季节&#xff1a;spring (春)&#xff0c;summer(夏)&#xff0c;autumn(秋)&#xff0c;winter(冬) 用常量表示&#xff1a; public static final int SEASON_SPRING 1;public st…...

虚拟机上安装openKylin详细步骤总结

一、创建虚拟机 首先获取操作系统安装镜像文件&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1tSuXmDk2ZILR4ieee6iImw?pwdcy47 提取码&#xff1a;cy47 &#xff08;1-1&#xff09;进入新虚拟机创建向导&#xff0c;选择“自定义”&#xff1a; &#xff08;1-…...

夜天之书 #74 企业开源的软件协议模型实践(Part 2)

在上一篇文章中&#xff0c;我介绍了企业开源的完全开放源码策略及其风险。完全开放源码&#xff0c;即以符合开源定义的软件协议发布企业自研软件的情形。本文介绍应对完全开放源码后的风险的第一种策略&#xff1a;提高市场占有率与开放标准。与其说是策略&#xff0c;不如说…...

2.webpack实时打包

简介 上一章已经实现了使用 webpack 构建了一个简单的项目&#xff1b;但是我们发现&#xff0c;每次修改了 index.js 需要重新执行 cnpm run dev 命令重新构建 main.js&#xff1b;这在开发阶段是无法忍受的&#xff0c;因为这样调式将浪费大量的时间&#xff1b;还好 webpac…...

KingbaseES V8R3 表加密

前言 透明加密是指将数据库page加密后写入磁盘&#xff0c;当需要读取对应page时进行加密读取。此过程对于用户是透明&#xff0c; 用户无需干预。 该文档进行数据库V8R3版本测试透明加密功能&#xff0c;需要说明&#xff0c;该版本发布时间早于V8R6&#xff0c;所以只能进行表…...

2 为社么软件架构很重要?

2 为社么软件架构很重要&#xff1f; 啊&#xff0c;建造&#xff0c;建造&#xff01; 这是所有艺术中最崇高的艺术。 — 亨利沃兹沃思朗费罗 如果架构是答案&#xff0c;那么问题是什么&#xff1f; 本章从技术角度重点介绍架构的重要性。我们将研究面包师的十几个最重要…...

Python 之 Pandas merge() 函数、set_index() 函数、drop_duplicates() 函数和 tolist() 函数

文章目录一、merge() 函数1. inner2. left 和 right3. outer二、set_index() 函数三、drop_duplicates() 函数四、tolist() 函数五、视频数据分析案例1. 问题要求2. 解决过程在最开始&#xff0c;我们先导入常规的 numpy 和 pandas 库。 import numpy as np import pandas as …...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

springboot 日志类切面,接口成功记录日志,失败不记录

springboot 日志类切面&#xff0c;接口成功记录日志&#xff0c;失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...

C++--string的模拟实现

一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现&#xff0c;其目的是加强对string的底层了解&#xff0c;以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量&#xff0c;…...