1、开发包概述
Fabric-chaincode-python 开发包适用于Hyperledger Fabric区块链 Python链码的开发,支持Fabric 1.4和2.0。
Fabric-chaincode-ptyon开发包主要包含以下特性:
- 完整覆盖Fabric官方开发包(go/java/node)提供的API接口
- 基于asyncio异步模型实现,并发性能更出色
- 内置wiz工具箱,可快速搭建Hyperledger Fabric开发环境
Fabric-chaincode-python开发包运行在Python 3.7+环境下,当前 版本1.0.0,主要类/接口及关系如下图所示:
Fabric-chaincode-python开发包的主要代码文件清单参见官网说明:http://sc.hubwiz.com/codebag/fabric-chaincode-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工具箱的环境变量:
<code>~/fabric-chaincode-python$source
wiz_env.sh /<code>
STEP 1:在1#终端创建一个新目录devnet用来初始化一个fabric项目:
<code>~/fabric-chaincode-python$ mkdir devnet &&cd
devnet ~/fabric-chaincode-python/devnet$ wiz init /<code>
结果如下:
STEP 2:在1#终端使用wiz net reset初始化Fabric网络的密码学资料和通道 初始化交易资料:
<code>~/fabric-chaincode-python/devnet
$ wiz net reset /<code>
结果如下:
STEP 3:在1#终端使用wiz net start启动Fabric网络的peer节点和orderer节点:
<code>~/fabric-chaincode-python/devnet
$ wiz net start /<code>
结果如下:
STEP 4:在2#终端使用wiz cc start启动wiz工具箱预置的Python链码:
<code>~/fabric-chaincode-python/devnet
$ wiz cc start /<code>
结果如下:
STEP 5:在3#终端使用wiz ch start命令创建通道ch1并将peer节点加入通道:
<code>~/fabric-chaincode-python/devnet
$ wiz ch start /<code>
结果如下:
测试链码:在3#终端使用wiz admin命令进入管理控制台:
<code>~/fabric-chaincode-python/devnet
$ wiz admin /<code>
结果如下:
使用peer chaincode query命令测试预置链码的查询:
<code>admin@org1> peer chaincode query -n wizcc -c'{"args":[]}'
-C ch1 /<code>
结果如下:
使用peer chaincode invoke命令测试预置链码的交易:
<code>admin@org1> peer chaincode invoke -n wizcc -c'{"args":[]}'
-C ch1 /<code>
结果如下:
3、运行开发包中的演示Python链码
在Hyperledger Fabric网络启动之后,我们就可以使用预置的演示链码直接替换 devnet中的链码。
例如,要运行token_demo.py示例,首先在2#终端按ctrl+c停止wiz预置链码 的运行,然后进入fabric-chaincode-python根目录执行演示链码即可:
<code>~/fabric-chaincode-python$ python3 token_demo.py /<code>
在3#终端的管理控制台测试余额查询和转账:
<code>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 /<code>
4、Python链码开发示例
下面的Python代码使用Fabric-chaincode-python实现了一个简单代币的 发行、转账与余额查询,说明详见注释部分:
<code>from
fabric_shimimport
Shimclass
TokenChaincode
:async
def
init
(self,stub)
:await
stub.put_state('tommy'
,b'1000'
)await
stub.put_state('jerry'
,b'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) + valueawait
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() ) /<code>
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时有效