Fabric链码开发包【Python】
Fabric-chaincode-python 开发包适用于Hyperledger Fabric区块链Python链码的开发,支持Fabric 1.4和2.0,官方下载地址:http://sc.hubwiz.com/codebag/fabric-chaincode-python/。
1、开发包概述
Fabric-chaincode-ptyon开发包主要包含以下特性:
- 完整覆盖Fabric官方开发包(go/java/node)提供的API接口
- 基于asyncio异步模型实现,并发性能更出色
- 内置wiz工具箱,可快速搭建Hyperledger Fabric开发环境
Fabric-chaincode-python开发包运行在Python 3.7+环境下,当前版本1.0.0,主要类/接口及关系如下图所示:
Fabric-chaincode-python开发包的主要代码文件清单如下:
代码文件 | 说明 |
---|---|
fabric_shim/ | fabric-chaincode-python开发包源码目录 |
fabric_shim/chaincode.py | 开发包入口Shim类 |
fabric_shim/support_client.py | ChaincodeSupportClient类 |
fabric_shim/stub.py | ChaincodeStub类 |
fabric_shim/iterators.py | 状态及历史查询结果迭代器实现类 |
fabric_shim/logger.py | 日志记录器实现类 |
fabric_shim/utils.py | 辅助工具类 |
fabric_shim/protos/ | Hyperledger Fabric协议实现目录 |
wiz/ | Hyperledger Fabric快速开发工具箱目录 |
wiz_env.sh | WIZ工具箱环境变量设置脚本 |
basic_demo.py | 最简版本的Python链码演示 |
counter_demo.py | 计数器Python链码演示 |
history_query_demo.py | 历史状态查询Python链码演示 |
composite_key_demo.py | 复合键的使用与查询Python链码演示 |
token_demo.py | 数字代币Python链码演示 |
couchdb_demo.py | peer节点采用couchdb作为状态库的Python链码演示 |
2、用Wiz工具箱快速启动Fabric网络
Wiz工具箱可以快速搭建一个简单的Fabric网络作为链码和应用开发环境,该网络中仅包含单一的peer节点和orderer节点,主要特征如下:
- 机构及MSPID:Org1/Org1MSP
- 通道名称:ch1
- 链码名称:wizcc
- 排序节点:127.0.0.1:7050
- 对等节点:127.0.0.1:7051/7052
启动Fabric网络需要使用三个终端,并分别为这三个终端设置wiz工具箱的环境变量:
~/fabric-chaincode-python$ source wiz_env.sh
__STEP 1__:在1#终端创建一个新目录devnet
用来初始化一个fabric项目:
~/fabric-chaincode-python$ mkdir devnet && cd devnet ~/fabric-chaincode-python/devnet$ wiz init
结果如下:
__STEP 2__:在1#终端使用wiz net reset
初始化Fabric网络的密码学资料和通道初始化交易资料:
~/fabric-chaincode-python/devnet$ wiz net reset
结果如下:
__STEP 3__:在1#终端使用wiz net start
启动Fabric网络的peer节点和orderer节点:
~/fabric-chaincode-python/devnet$ wiz net start
结果如下:
__STEP 4__:在2#终端使用wiz cc start
启动wiz工具箱预置的Python链码:
~/fabric-chaincode-python/devnet$ wiz cc start
结果如下:
__STEP 5__:在3#终端使用wiz ch start
命令创建通道ch1
并将peer节点加入通道:
~/fabric-chaincode-python/devnet$ wiz ch start
结果如下:
__测试链码__:在3#终端使用wiz admin
命令进入管理控制台:
~/fabric-chaincode-python/devnet$ wiz admin
结果如下:
使用peer chaincode query
命令测试预置链码的查询:
admin@org1> peer chaincode query -n wizcc -c '{"args":[]}' -C ch1
结果如下:
使用peer chaincode invoke
命令测试预置链码的交易:
admin@org1> peer chaincode invoke -n wizcc -c '{"args":[]}' -C ch1
结果如下:
3、运行开发包中的演示Python链码
在Hyperledger Fabric网络启动之后,我们就可以使用预置的演示链码直接替换devnet中的链码。
例如,要运行token_demo.py示例,首先在2#终端按ctrl+c
停止wiz预置链码的运行,然后进入fabric-chaincode-python根目录执行演示链码即可:
~/fabric-chaincode-python$ python3 token_demo.py
在3#终端的管理控制台测试余额查询和转账:
admin@org1> peer chaincode query -n wizcc -c '{"args":["balance","tommy"]}' -C ch1 admin@org1> peer chaincode invoke -n wizcc -c '{"args":["transfer","tommy","jerry","10"]}' -C ch1
4、Python链码开发示例
下面的Python代码使用Fabric-chaincode-python实现了一个简单代币的发行、转账与余额查询,说明详见注释部分:
from fabric_shim import Shim #引入fabric_shim class TokenChaincode: #定义链码 async def init(self,stub): #链码初始化处理 await stub.put_state('tommy',b'1000') #向tommy发行1000代币 await stub.put_state('jerry',b'1000') #向jerry发行1000代币 return Shim.success(b'init ok') #返回成功信息 async def invoke(self,stub): #链码交易处理 fcn, args = stub.get_function_and_parameters() #获取链码调用方法名和参数列表 if fcn == 'reset': #根据方法名进行路由 return await self.init(stub) if fcn == 'balance': return await self.balance(stub,args[0]) if fcn == 'transfer': return await self.transfer(stub,args[0],args[1],args[2]) return Shim.error(b'method not supported') #未知的方法名返回错误信息 async def balance(self,stub,account): #账户余额查询方法 value = await stub.get_state(account) #从账本读取余额 return Shim.success(b'balance => ' + value) #返回余额信息 async def transfer(self,stub,owner,to,value): #代币转账方法 value = int(value) owner_balance = await stub.get_state(owner) owner_balance = int(owner_balance) - value #扣除转出方余额 to_balance = await stub.get_state(to) to_balance = int(to_balance) + value #增加转入放余额 await stub.put_state(owner, #更新转出方状态 bytes(str(owner_balance),'utf-8')) await stub.put_state(to,bytes(str(to_balance),'utf-8')) #更新转入方状态 return Shim.success(b'transfer ok') #返回成功信息 Shim.start( TokenChaincode() ) #启动链码
5、Python链码开发包API清单
Shim
的主要API清单如下:
- __start()__:启动链码
- __success()__:创建成功响应对象
- __error()__:创建失败响应对象
ChaincodeSupportClient
的主要API清单如下:
- __chat()__:启动与peer节点的双向通信流
ChaincodeStub
的主要API清单如下:
- __get_function_and_parameters()__:获取链码调用方法名和参数列表
- __get_txid()__:获取链码调用交易的ID
- __get_channel_id()__:获取链码调用交易的通道ID
- __get_creator()__:获取链码调用交易的用户ID
- __get_transient()__:获取链码调用交易的暂态数据集
- __get_tx_timestamp()__:获取链码调用交易的时间戳
- __get_state()__:获取账本上指定键的状态
- __put_state()__:更新账本上指定键的状态
- __delete_state()__:删除账本上指定键的状态
- __set_state_validation_parameter()__:设置状态验证参数
- __get_state_validation_parameter()__:获取状态验证参数
- __get_state_by_range()__:获取账本上指定范围内的键的状态
- __get_state_by_range_with_pagination()__:分页获取账本上指定范围内的键的状态
- __get_query_result()__:获取节点富查询结果,仅在采用couchdb作为peer节点存储库是有效
- __get_query_result_with_pagination()__:分页获取节点富查询结果
- __get_history_for_key()__:获取账本上指定键的更新历史
- __invoke_chaincode()__:调用其他链码
- __set_event()__:触发链码事件
- __create_composite_key()__:创建复合键
- __split_composite_key()__:拆分复合键,返回复合键类型和组成属性值
- __get_state_by_partial_composite_key()__:使用部分复合键查询账本状态
- __get_state_by_partial_composite_key_with_pagination()__:使用部分复合键分页查询账本状态
- __get_private_data()__:获取指定私有数据集中的指定键的状态
- __get_private_data_hash()__:获取指定私有数据集中的指定键的状态哈希
- __put_private_data()__:更新指定私有数据集中的指定键的状态
- __delete_private_data()__:删除指定私有数据集中的指定键
- __set_private_data_validation_parameter()__:设置私有数据的验证参数
- __get_private_data_validation_parameter()__:获取私有数据的验证参数
- __get_private_data_by_range()__:获取指定私有数据集中指定范围的键的状态
- __get_private_data_by_partial_composite_key()__:使用部分复合键查询私有数据集
- __get_private_data_query_result()__:获取私有数据集的富查询结果,仅在启用couchdb时有效
Fabric链码Python开发包官方下载地址:http://sc.hubwiz.com/codebag/fabric-chaincode-python/

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
C#多线程(4):进程同步Mutex类
C#多线程(4):进程同步Mutex类 目录Mutex 类构造函数和方法系统只能运行一个程序的实例解释一下上面的示例接替运行进程同步示例另外Mutex 类Mutex 中文为互斥,Mutex 类叫做互斥锁。它还可用于进程间同步的同步基元。 Mutex 跟 lock 相似,但是 Mutex 支持多个进程。Mutex 大约比 lock 慢 20 倍。 互斥锁(Mutex),用于多线程中防止两条线程同时对一个公共资源进行读写的机制。 Windows 操作系统中,Mutex 同步对象有两个状态: signaled:未被任何对象拥有;nonsignaled:被一个线程拥有;Mutex 只能在获得锁的线程中,释放锁。 构造函数和方法Mutex 类其构造函数如下: 构造函数 说明Mutex() 使用默认属性初始化 Mutex类的新实例。Mutex(Boolean) 使用 Boolean 值(指示调用线程是否应具有互斥体的初始所有权)初始化 Mutex 类的新实例。Mutex(Boolean, String) 使用 Boolean 值(指示调用线程是否应具有互斥体的初始所有权以及字符串是否为互斥体的名称...
- 下一篇
C# 基础知识系列- 10 反射和泛型(二)
C# 基础知识系列- 10 反射和泛型(二) 前言这篇文章延续《C# 基础知识系列- 5 反射和泛型》,继续介绍C#在反射所开发的功能和做的努力。上一篇文章大概介绍了一下泛型和反射的一些基本内容,主要是通过获取对象的类型,然后通过这个类型对象操作对象。这一篇介绍一个在反射中很重要的内容:特性,以及上一篇未完成的内容——泛型在反射中的引用。 特性特性是一种类增强技术,配合解析对应的解析方法可以完成很多类原本没有的功能。特性本质是一种标签,可以标注在类、方法、属性等。它是类本身的一种信息扩展,就像生活中一个人只有一个身份证号,但是可以有多个身份一样,而这些多出来的身份对于类来说就是特性。特性虽然是对类的增强,但不局限于在类上做标记,属性、方法上都可以。 在C#中特性分为三种,位映射特性、自定义特性和伪自定义特性。 位映射特性,举个例子,在C#中一个类会有public、private、abstract(抽象类)、saled(不能继承)等修饰符,而这些修饰符在C#编译的过程中会生成一串二进制码,里面存放就是 是否是public、是否是private 等。这些就是位映射特性的一部分,位映射特性对...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS关闭SELinux安全模块
- Linux系统CentOS6、CentOS7手动修改IP地址
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Red5直播服务器,属于Java语言的直播服务器
- Docker使用Oracle官方镜像安装(12C,18C,19C)