天天看点

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

  • __chat()__:启动与peer节点的双向通信流

ChaincodeStub

  • __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开发包官方下载地址: