1、安装链码
import asyncio
from hfc.fabric import Client
import os
loop = asyncio.get_event_loop()
cli = Client(net_profile="/home/zhangzhang/network.json")
org1_admin = cli.get_user('org1.example.com', 'Admin')
# 告知客户端当前加入的链码id
cli.new_channel('mychannel')
gopath_bak = os.environ.get('GOPATH', '')
gopath = os.path.normpath(os.path.join(
os.path.dirname(os.path.realpath('__file__')),
'/root/project/chaincode'
))
os.environ['GOPATH'] = os.path.abspath(gopath)
# 安装链码,若成功返回true
responses = loop.run_until_complete(cli.chaincode_install(
requestor=org1_admin,
peers=['peer0.org1.example.com',
'peer1.org1.example.com'],
cc_path='github.com/task_cc',
cc_name='task_cc',
cc_version='v1.0'
))
注意链码路径,我的完整路径:
/root/project/chaincode/src/github.com/task_cc/task.cc.go
/src/github.com必须要有,否则报错
在Linux下打开终端,输入
peer chaincode list --installed
查询已安装的链码
2、实例化链码
import asyncio
from hfc.fabric import Client
loop = asyncio.get_event_loop()
cli = Client(net_profile="/home/zhangzhang/network.json")
org1_admin = cli.get_user(org_name='org1.example.com', name='Admin')
cli.new_channel('mychannel')
# 背书策略
policy = {
'identities': [
{'role': {'name': 'member', 'mspId': 'Org1MSP'}},
],
'policy': {
'1-of': [
{'signed-by': 0},
]
}
}
# 实例化的参数
# 实例化链码传入的参数为空,与链码中init()函数对应
args = []
# 下面函数会调用链码中的init函数进行实例化
responses = loop.run_until_complete(cli.chaincode_instantiate(
requestor=org1_admin,
channel_name='mychannel', # 通道的名称
peers=['peer0.org1.example.com'], # 指定在哪个peer上进行实例化,一个链码仅需在某个pee节点实例化一次即可
args=args,
cc_name='task_cc', # 链码的名称
cc_version='v1.0', # 链码的版本
cc_endorsement_policy=policy, # 当前链码所使用的背书策略
collections_config=None,
transient_map=None,
wait_for_event=True # 确保链码实例化成功
))
print(responses)
输出
实例化链码时,注意传入的参数args与所写的链码中init函数的参数一致,并且注意loop.run_until_complete函数内的字段与上面安装链码时一致
在Linux下打开终端,输入
peer chaincode list --instantiated -C mychannel
查询已初始化的链码