FISCO BCOS即拆即用的“Python区块链盒子”
作者为Python开发者,将FISCO BCOS Python SDK封装成镜像,以提升配置环境的速度,提高易用性。
前言
作为一个 Python 开发者,我一直想通过 Python 去了解区块链。机缘巧合下,在 2019 年一次开源年会上,我接触并加入了 FISCO BCOS 开源社区,此后,一直用课余时间琢磨 FISCO BCOS 的 Python-SDK。
在配置环境的时候,我耗费了一些时间,因此也萌生了将整个框架封装成一个 docker 镜像的想法,我为它取名“Python 区块链盒子”,就像 Minecraft 的“工作台”一样, 可以提升配置环境的速度,提高易用性。有了这样的想法,我便开始利用课余的时间着手去编写 Dockerfile。
我把搭建好的 docker 镜像分享给周围的同学体验,“即拆即用”的特性反响很好👌,大家不会因为环境配置难而退怯,能像Minecraft里的Steve一样,放下“工作台”就可以制造出一堆有用的工具出来。
什么是“Python 区块链盒子”?
在回答这个问题之前,先来了解一下 Python-SDK。这是由 FISCO BCOS 开源,帮助开发者运用 Python 语言开发区块链应用的组件。既然是通过 Python 语言开发,我相信它将有持续不断的生命力。
Python 的阅读难度相对比较低,特别方便学生、初学者通过 Python-SDK 去了解、学习区块链。
可尝试按以下环境要求安装搭建。
Python 环境:python 3.6.3, 3.7.x
FISCO BCOS 节点:请参考 FISCO BCOS 安装搭建
https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/installation.html
关于 Python-SDK,可点击参考 FISCO BCOS 团队推出的开发教程。
《麻雀虽小五脏俱全 | 从 Python-SDK 谈谈 FISCO BCOS 多语言 SDK》
“Python 区块链盒子”相当于将配置好的 Python-SDK 和部署好的区块链打包成一个包裹,类似于将一个大房子整理成一辆房车。通过这种方式,用户无需关注环境配置问题,可减少部署时间——不用一分钟就能获得镜像,方便开发者快速上手使用,便于自动化运维。
你也可以尝试将这个服务和 JenKins 结合,进一步优化运维过程。
“Python 区块链盒子”可以当成 Python 区块链开发的工作台,一个现拆现用的工具箱,而且可以保证开发环境的整洁,最重要的是它很轻,就像 Minecraft 里的工作台。
只要你有一台计算机,就可以随时随地打开这个工具箱。安装工具箱的过程也变成了享受:只需一行代码就能上手直接研究开发,不必过多关注环境配置的繁杂,能节省大量时间,解放双手。
获得并运行“Python 区块链盒子”
可以通过以下部署来获得这个“盒子”。
docker run -it -p 20200:20200 --name python_sdk fiscoorg/playground:python_sdk
进入容器后,首先需要启动节点,启动节点后就可以“食用”了。在这个过程中,请注意不要使用 sh。
bash /root/fisco/nodes/127.0.0.1/start_all.sh
随后,在/python_sdk 中进行调试,调试过程中的小贴士:console.py 添加了 tab 自动补全。
# 查看 SDK 使用方法
./console.py usage
# 获取节点版本
./console.py getNodeVersion
bash-5.0# ./console.py getNodeVersion
INFO >> user input : ['getNodeVersion']
INFO >> getNodeVersion >> { "Build Time": "20190923 13:22:09", "Build Type": "Linux/clang/Release", "Chain Id": "1", "FISCO-BCOS Version": "2.1.0", "Git Branch": "HEAD", "Git Commit Hash": "cb68124d4fbf3df563a57dfff5f0c6eedc1419cc", "Supported Version": "2.1.0" }
完成这些之后就成功了,前前后后,相当于在几秒内就搭建了一个开源的区块链框架。你可以把自己的合约放到/python-sdk/contracts 中,更多关于 Python-SDK 的使用方法可以参考以下链接。
https://github.com/FISCO-BCOS/python-sdk
这个即拆即用的“区块链盒子”对于要使用 Python 来开发区块链应用或者学习区块链的开发者很有帮助。开发者可以通过调用/python-sdk/client 中的函数使用 ./console.py 命令行并与盒子中正在运行的区块链进行交互。
下面将会以 Python-Flask 开发作为例子,实现调用 HelloWorld 合约的功能。
step1 进入容器
docker run -it -p 20200:20200 -p 80:80 --name flask_web fiscoorg/playground:python_sdk
step2 启动节点
bash /root/fisco/nodes/127.0.0.1/start_all.sh
step3 部署 HelloWorld 合约
/python-sdk/contract 下存放了 HelloWorld.sol,可以直接使用这个合约进行测试。
首先,查看 HelloWorld.sol 合约的内容。
pragma solidity ^0.4.24;
contract HelloWorld{
string name;
constructor() public{
name = "Hello, World!";
}
function get() constant public returns(string){
return name;
}
function set(string n) public{
name = n;
}
}
可以通过 get 接口返回字符串 name 的值,通过 set 更新 name 的值。有 Solidity 编程基础的开发者还可以自己定制合约内容。
然后,就可以部署 HelloWorld 合约。
$ ./console.py deploy HelloWorld save
INFO >> user input : ['deploy', 'HelloWorld', 'save']
backup [contracts/HelloWorld.abi] to [contracts/HelloWorld.abi.20190807102912]
backup [contracts/HelloWorld.bin] to [contracts/HelloWorld.bin.20190807102912]
INFO >> compile with solc compiler
deploy result for [HelloWorld] is:
{
"blockHash": "0x3912605dde5f7358fee40a85a8b97ba6493848eae7766a8c317beecafb2e279d",
"blockNumber": "0x1",
"contractAddress": "0x2d1c577e41809453c50e7e5c3f57d06f3cdd90ce",
"from": "0x95198b93705e394a916579e048c8a32ddfb900f7",
"gasUsed": "0x44ab3",
"input": "0x6080604052...省略若干行...c6f2c20576f726c642100000000000000000000000000",
"logs": [],
"logsBloom": "0x000...省略若干行...0000",
"output": "0x",
"status": "0x0",
"to": "0x0000000000000000000000000000000000000000",
"transactionHash": "0xb291e9ca38b53c897340256b851764fa68a86f2a53cb14b2ecdcc332e850bb91",
"transactionIndex": "0x0"
}
on block : 1,address: 0x2d1c577e41809453c50e7e5c3f57d06f3cdd90ce
address save to file: bin/contract.ini
完成后可得到 HelloWord 合约部署的地址,通过这个地址调用函数接口。
step4 在/python-sdk 文件夹下编辑 app.py
$ vi app.py
# -*- coding:utf-8 -*-
from client.common import transaction_common
from flask import Flask, request
from jinja2 import escape
app = Flask(__name__)
tx_client = transaction_common.TransactionCommon("0x2d1c577e41809453c50e7e5c3f57d06f3cdd90ce","contracts","HelloWorld")
# tx_client = transaction_common.Transaction_Common("地址","合约路径","合约名称")
@app.route('/')
def index():
'''
调用 get 接口,获得 HelloWorld 的字符串
'''
new_str = request.args.get('new_str')
# 通过 new_str 的值更新 HelloWorld 的字符串
if new_str:
tx_client.send_transaction_getReceipt("set",(new_str,))
# 若 new_str 不为空则更新字符串
return escape(str(tx_client.call_and_decode("get")))
if __name__ == '__main__':
app.run(host="0.0.0.0", port=80)
step5 安装 app.py 依赖/运行程序
pip install flask
python app.py
这样就通过 Python-Flask 框架实现了调用 HelloWorld 合约,通过调用 get 接口查看字符串,调用 set 接口更新字符串。
FISCO BCOS 的 Python-SDK 十分适合像我这样的学生党或者初学者去研究和了解区块链技术。十分期待更多开发者参与其中,用它搭建出更多有趣好玩的开源项目。
Dockerfile 地址请参考文末,最近我也会对其做一些更新,提升其操作易用性,最新操作手册和消息将在GitHub上发布,欢迎大家关注。
更多Python Demo请参考:
https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/sdk/python_sdk/demo.html
3. 提交 pr 体验
关于如何在 FISCO BCOS 中提交 pr 可点击参考开源社区整理的内容,这里不多做说明。
我想分享一下个人提交 pr 的体验,整个过程既新奇又有趣。
萌生“区块链盒子”的 idea 之后,我很快就编写了第一个 Dockerfile,随即就提交了 pr。很快社区的小哥哥石翔就回复了我,刚开始我以为是国外友人,就一直用" Poor English "和他交流。
他十分欢迎我的pr,还不断给我👍点赞和支持,他不但解决了许多在配置过程中的问题,还时不时分享一些小故事鼓励我。
在合并我的pr过程中,十分感谢团队的热情帮助😄,及时向我提出review意见,并细心给我介绍需要添加的内容功能,这让我充分感受到 FISCO BCOS 社区和睦共处、互帮互助的氛围。
目前,“Python 区块链盒子”还有一些有待优化的地方,例如,每次启动一个容器都需要手动操作,启动节点的条件是-->机器暴露所需端口,默认是 20200, 8045, 30300。
后期可能会考虑对默认启动节点的功能进行优化,添加数据卷,以及优化容器大小,使 fiscoorg/playground:python_sdk 更精致。
如果你有不错的优化想法,欢迎提交 pr,来一次有趣新奇的 pr 体验😄
参考链接
Dockerfile:
https://github.com/FISCO-BCOS/python-sdk/blob/master/Dockerfile
如对这个"盒子"有更多的问题或建议,欢迎加入FISCO BCOS技术交流群,与作者深入探讨。
进群请长按二维码添加小助手
微信ID:FISCOBCOS010
FISCO BCOS的代码完全开源且免费
下载地址↓↓↓
https://github.com/FISCO-BCOS/FISCO-BCOS