46
社区成员




Brownie是一个开源的基于python的智能合约开发框架,建立在web3.py之上,它同时支持solidity和vyper两种智能合约开发语言,它的主要亮点是基于python语言构建,在Brownie框架下可以使用python语言完成Web3的开发工作。
Brownie的诞生是因为互联网及相关行业——特别是大数据、AI以及互联网金融领域有许多python工程师,javascript并不是他们常用的开发语言,在转入到Web3特别是DeFi领域后,希望有一个python的框架让学习成本更低。本文就使用Brownie开发和部署智能合约做一个简单介绍,供感兴趣的开发者作为入门读物。
本文以ubuntu-20.04.3 amd64环境为例
操作系统 |
Ubuntu Linux 20.04.3 adm64 |
Python环境 |
Python3.8.2 |
安装Brownie命令 |
pip install eth-brownie |
检验是否安装成功 |
brownie --version 或者 brownie --help |
打印brownie帮助信息输出如下
输出brownie版本信息如下
在开始一个智能合约开发项目之前,先建立一个空的项目目录,然后运行brownie init 初始化目录结构。
如图所示,先创建一个空目录brownie-demo,然后进入到目录中,运行brownie init进行目录结构初始化,运行结束后,会发现框架为项目自动生成了6个目录和2个隐藏文件。比较重要的几个目录下面包括:
contracts -- 用于存放智能合约,编写的智能合约放到这个路径下,运行brownie框架会自动编译
build -- 框架会自动存放在构建过程中生成的各种文件
scripts -- 放置一些python脚本,等下部署合约操作的脚本就放到这里
在contracts目录下编辑智能合约文件BrownieDemo.sol,合约内容下图所示:声明一个FooBar名字合约,本合约没有太多复杂操作,就是构造时候赋值一个状态变量;同时提供一个方法,调用时候产生一个事件,信息可以在区块链上查询(详见后文)。
编译智能合约很简单,在项目根目录下,运行brownie compile就可以,开发框架会自动检查contracts目录中的智能合约源文件,然后编译。如果没有错误,编译通过后结果会放到路径build/contracts下。如下图所示:
编译生成的FooBar合约结果在build/contracts
2.4.1 准备环境配置
编译好智能合约,就可以部署到链上。在部署之前,需要配置好一系列参数。首先编辑项目目录下brownie-config.yaml文件。这个文件多数现成的brownie项目都提供一个参考模板,里面主要是各种区块链网络的配置信息。
比较重要的几个配置信息:
2.4.2 准备环境变量
在项目根目录下,编辑2.4.1节提到的.env文件。这里面主要提供了以太坊钱包私钥(注意保密,不要对外泄露),INFURA节点的项目ID(如果没有,需要自己注册登录后获取),以及Etherscan的Token(etherscan.io上注册后获取)。环境变量定义如下:
以太坊钱包私钥 —— 可以通过常用工具Metamask生成并保管。
Infura节点项目ID —— https://infura.io/ 访问网站注册登录可获得
Etherscan Token —— https://etherscan.io/ 访问网站,注册登录按提示操作可获取
2.4.3 编写部署脚本
在scripts目录下,编辑deploy.py脚本,内容如图所示。这个脚本每一步操作在brownie框架下的命令行也可以执行,脚本文件就是把每一步操作都汇总起来一起执行。
由上图可见,操作内容很简单,主要就是设置好账户,然后调用deploy方法,将合约部署上链。运行部署脚本命令是 brownie run scripts/deploy.py --network rinkeby 这里指明了使用rinkeby测试链,如果不指明,也会使用配置文件中的默认网络。注意,这里面访问etherscan.io等被墙网络需要使用上网辅助工具,否则会失败。
合约部署成功后会显示消耗油气量(费用),合约在链上地址(0x63646E150Bdd0356fE2BD239ED68E06fdA540A59),以及代码校验是否成功。
2.4.4 Etherscan.io上查看合约信息
由于合约部署在rinkeby测试链上,登录rinkeby.ehterscan.io,输入合约地址,查看合约信息:
2.4.5 通过Brownie控制台,远程调用合约方法
在项目根目录下,运行 brownie console --network rinkeby 启动控制台。启动后,按下入所示操作,先根据地址获取合约,然后根据操作者钱包信息确定远程呼叫函数的账户,之后调用合约的方法testFunc(),如果成功,会返回交易Hash,根据这个Hash值,可以在etherscan上查询交易信息。
如上图所示,在合约事件中可以看到调用testFunc()方法触发的事件,事件的文本信息,以及对应的交易Hash值。
本文以一个简单的智能合约编译开发和部署的例子介绍了Brownie框架的使用。其实Brownie和Web3.py还具有很多更强大丰富的功能,感兴趣读者可以参考他们官方文档边学习边实践逐步积累Web3相关的开发经验。
Brownie官方参考文档链接:https://eth-brownie.readthedocs.io/
Web3.py官方参考文档链接:https://web3py.readthedocs.io/
Solidity智能合约开发语言官方参考文档链接:https://solidity-cn.readthedocs.io/
这才是好文章