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.crt
和bin/node.key
,那么就需要做相应修改。
4.4 检查PythonSDK是否可以使用
./console.py getNodeVersion
若PythonSDK配置成功,则上述命令输出结果为:
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管理平台。