FISCO BCOS实践(二)使用PythonSDK部署和测试智能合约

FISCO BCOS实践:
(一)搭建单群组联盟链
(二)使用PythonSDK部署和测试智能合约(本章)
(三)部署和使用WeBASE管理平台

二、使用PythonSDK部署和测试智能合约

1. 简介

为了缩减学习成本,使用了FISCO BCOS的PythonSDK。(企业应用应该使用Java SDK,然而我并不会Java……)
Python SDK提供了访问 FISCO BCOS节点的Python API,支持节点状态查询、部署和调用合约等功能,基于Python SDK可快速开发区块链应用,目前支持 FISCO BCOS 2.0+。
官方文档见:Python SDK — FISCO BCOS v2.7.2 文档

2. 安装PythonSDK

2.1 安装依赖

sudo apt install -y zlib1g-dev libffi6 libffi-dev wget git

除了上述软件包,还应该安装python3和pip3。
官方文档说明依赖的Python环境:python 3.6.3或3.7.x,我的Ubuntu虚拟机安装的是Python 3.6.9,目前看来没有出现问题。

注意,仅仅安装了python3还不够,必须要将默认的python命令指向python3而不是python2
这里提供一个方法:Ubuntu将python命令默认指向python3 - (jianshu.com)

官方文档中提供了一个安装python 3.7.3的虚拟环境的方法,不过我尝试之后失败了,可能是网络的原因。总而言之,如果自己本机上面就是python 3.6.3或3.7.x的环境,就不需要安装这个了。

2.2 安装Python SDK

接下来,拉取pythonSDK的源代码并安装Python SDK依赖:

#进入项目目录
cd ~/myProject/Fisco

#拉取源代码
git clone https://github.com/FISCO-BCOS/python-sdk
# 若因为网络问题导致长时间无法执行上面的命令,可以使用以下命令:
git clone https://gitee.com/FISCO-BCOS/python-sdk

#安装Python SDK依赖
pip install -r requirements.txt
# 若因为网络问题导致长时间无法执行上面的命令,可以使用以下命令:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt

安装Python SDK依赖这一步非常容易出错。(总之推荐使用最底下的那个使用清华源的命令)

3. 智能合约的书写和配置

3.1 写智能合约并debug

使用了FISCO BCOS官方提供的CRUD功能。
官方文档见:FISCO BCOS CRUD使用指南 — FISCO BCOS v2.7.2 文档 (fisco-bcos-documentation.readthedocs.io)
python-sdk/contracts文件夹下有已经写好的sol文件,如Asset.sol,用CRUD实现了简单的账户转账功能,可以直接用来测试。)

仿照Asset合约,写一个简单的solidity智能合约DomainInfo.sol,实现了以下函数:

    function createTable() private{}
    function openTable() private view returns(Table){}
    function select(string DomainID) public constant returns(int256, string, string){}
    function register(string DomainID, string Hash, string URL) public returns (int256){} 
    function change(string DomainID, string Hash, string URL) public returns (int256){}
    function remove(string DomainID) public returns (int256){}   

接下来,把DomainInfo.sol文件放入remix中,在remix中进行debug。
注意,记得把python-sdk/contracts文件夹下的Table.sol也放进去。
由于Remix - Ethereum IDE经常连得很慢或者连不上,所以可以国内的Remix - 智谷 (zhiguxingtu.com)来进行调试。

由于FISCO BCOS CRUD是以太坊不具有的功能,所以这个合约不能在remix上部署,部署会显示错误。在remix中只要把所有提示的error改正即可。

3.2 放置智能合约

DomainInfo.sol文件放入~/myProject/Fisco/python-sdk/contracts目录下。
在初始化Python SDK时,将对contracts/目录下的sol代码进行编译。

注:也可以直接使用下一步《部署和使用WeBASE管理平台》中的WeBASE管理平台来进行部署和测试,不过由于是PythonSDK的实践,所以这里尝试使用python-sdk来测试。

4. 配置和初始化Python SDK

4.1 初始化配置

# 该脚本执行操作如下:
# 1. 拷贝client_config.py.template->client_config.py
# 2. 下载solc编译器
bash init_env.sh -i

若没有执行以上初始化步骤,需要将contracts/目录下的sol代码手动编译成bin和abi文件并放置于contracts目录,才可以部署和调用相应合约。合约编译可以使用remix。

4.2 配置Channel通信协议

在节点目录(~/MyProject/Fisco/nodes/192.168.171.141/node0)下的 config.ini 文件中获取各项配置:

[rpc]
    channel_listen_ip=192.168.171.141
    channel_listen_port=20200
    jsonrpc_listen_ip=192.168.171.141
    jsonrpc_listen_port=8545

切换到python-sdk目录(~/MyProject/Fisco/python-sdk),修改client_config.py文件中channel_host为实际的IP,channel_port为上步获取的channel_listen_port

# --------------------------------------
    # configure below
    # ---------client communication config--------------
    client_protocol = "channel"  # or PROTOCOL_CHANNEL to use channel prototol
    # client_protocol = PROTOCOL_CHANNEL
    remote_rpcurl = "http://192.168.171.141:8545"  # 采用rpc通信时,节点的rpc端口,和要通信的节点*必须*一致,如采用channel协议通信,这里可以留空
    channel_host = "192.168.171.141"  # 采用channel通信时,节点的channel ip地址,如采用rpc协议通信,这里可以留空
    channel_port = 20200  # 节点的channel 端口,如采用rpc协议通信,这里可以留空
    channel_ca = "bin/ca.crt"  # 采用channel协议时,需要设置链证书,如采用rpc协议通信,这里可以留空
    channel_node_cert = "bin/sdk.crt"  # 采用channel协议时,需要设置sdk证书,如采用rpc协议通信,这里可以留空
    channel_node_key = "bin/sdk.key"  # 采用channel协议时,需要设置sdk私钥,如采用rpc协议通信,这里可以留空
    fiscoChainId = 1  # 链ID,和要通信的节点*必须*一致
    groupid = 1  # 群组ID,和要通信的节点*必须*一致,如和其他群组通信,修改这一项,或者设置bcosclient.py里对应的成员变量

官方文档:配置说明 — FISCO BCOS v2.7.2 文档

4.3 配置证书

若节点与python-sdk位于不同机器,需要将节点sdk目录下所有相关文件拷贝到bin目录。
现在,节点与sdk位于在相同机器,所以直接拷贝节点证书到SDK配置目录。

cp ~/MyProject/Fisco/nodes/192.168.171.141/sdk/* ~/MyProject/Fisco/python-sdk/bin/

接下来,需要检查client_config.py中的证书路径:

channel_node_cert = "bin/sdk.crt"  # 采用channel协议时,需要设置sdk证书,如采用rpc协议通信,这里可以留空
channel_node_key = "bin/sdk.key"   # 采用channel协议时,需要设置sdk私钥,如采用rpc协议通信,这里可以留空

一般来说这个是不用修改的,但如果若sdk证书和私钥文件名是node,则路径分别为bin/node.crtbin/node.key,那么就需要做相应修改。

4.4 检查PythonSDK是否可以使用

./console.py getNodeVersion

若PythonSDK配置成功,则上述命令输出结果为:
getNodeVersion

4.5 开启命令行自动补全

Python SDK引入argcomplete支持命令行补全,运行如下命令开启此功能(仅需设置一次,设置之后每次登陆自动生效)。

echo "eval \"\$(register-python-argcomplete ./console.py)\"" >> ~/.bashrc
source ~/.bashrc

5. 测试智能合约

PythonSDK控制台的官方文档见:控制台 — FISCO BCOS v2.7.2 文档
可以参考使用其中的命令。
注:以下均在~/MyProject/Fisco/python-sdk目录下操作。

5.1 部署智能合约

#./console.py deploy [contract_name] [save]
./console.py deploy DomainInfo save

部署合约DomainInfo,并将合约地址写入历史记录文件。
合约地址将保存在bin/contract.ini文件中。

5.2 测试智能合约

#调用合约接口,并解析返回结果
./console.py call [contract_name] [contract_address] [function] [args]
#发送交易调用指定合约的接口,交易结果会写入区块和状态:
./console.py sendtx [contract_name] [contract_address] [function] [args]

进行测试后,确认合约部署成功,设计的各项功能都可以使用。

在下一章中,将部署和使用WeBASE管理平台。

你可能感兴趣的:(FISCO BCOS实践(二)使用PythonSDK部署和测试智能合约)