Hyperledger Fabric链码Python开发包,支持Fabric 1.4和2.0。
Fabric-chaincode-python 开发包适用于Hyperledger Fabric区块链 Python链码的开发,支持Fabric 1.4和2.0。
Fabric-chaincode-ptyon开发包主要包含以下特性:
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链码演示 |
Wiz工具箱可以快速搭建一个简单的Fabric网络作为链码和应用开发环境, 该网络中仅包含单一的peer节点和orderer节点,主要特征如下:
启动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
结果如下:
在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
下面的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() ) #启动链码
Shim
的主要API清单如下:
ChaincodeSupportClient
的主要API清单如下:
ChaincodeStub
的主要API清单如下:
本站所提供软件包仅用于学习和研究,请依法合规使用。
本站所提供软件包均提供完整源码,使用前请认真阅读源代码和文档以确保充分理解软件包的设计与功能实现,本站不承担 因不当使用本站所提供软件包而造成的任何法律风险或财产损失责任。