使用Brownie框架构建和部署智能合约

古翠码翁 2022-04-18 11:59:12
加精

一、简介

       Brownie是一个开源的基于python的智能合约开发框架,建立在web3.py之上,它同时支持solidity和vyper两种智能合约开发语言,它的主要亮点是基于python语言构建,在Brownie框架下可以使用python语言完成Web3的开发工作。

       Brownie的诞生是因为互联网及相关行业——特别是大数据、AI以及互联网金融领域有许多python工程师,javascript并不是他们常用的开发语言,在转入到Web3特别是DeFi领域后,希望有一个python的框架让学习成本更低。本文就使用Brownie开发和部署智能合约做一个简单介绍,供感兴趣的开发者作为入门读物。

二、操作流程

2.1 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版本信息如下

2.2 初始化Brownie开发环境 

 

       在开始一个智能合约开发项目之前,先建立一个空的项目目录,然后运行brownie init 初始化目录结构。

       如图所示,先创建一个空目录brownie-demo,然后进入到目录中,运行brownie init进行目录结构初始化,运行结束后,会发现框架为项目自动生成了6个目录和2个隐藏文件。比较重要的几个目录下面包括:

      contracts -- 用于存放智能合约,编写的智能合约放到这个路径下,运行brownie框架会自动编译

      build -- 框架会自动存放在构建过程中生成的各种文件

      scripts -- 放置一些python脚本,等下部署合约操作的脚本就放到这里

2.3 编写智能合约

      在contracts目录下编辑智能合约文件BrownieDemo.sol,合约内容下图所示:声明一个FooBar名字合约,本合约没有太多复杂操作,就是构造时候赋值一个状态变量;同时提供一个方法,调用时候产生一个事件,信息可以在区块链上查询(详见后文)。

2.3 编译智能合约 

      编译智能合约很简单,在项目根目录下,运行brownie compile就可以,开发框架会自动检查contracts目录中的智能合约源文件,然后编译。如果没有错误,编译通过后结果会放到路径build/contracts下。如下图所示:

 编译生成的FooBar合约结果在build/contracts

2.4 部署合约

2.4.1 准备环境配置

      编译好智能合约,就可以部署到链上。在部署之前,需要配置好一系列参数。首先编辑项目目录下brownie-config.yaml文件。这个文件多数现成的brownie项目都提供一个参考模板,里面主要是各种区块链网络的配置信息。

      比较重要的几个配置信息:

  1. dotenv: .env -- 这个是指明环境变量读取的文件,我们提供了一个.env存放各种环境变量,下一节介绍。这个名字可以自己指定,比如叫foo.env也可以。
  2. default: rinkeby -- 这个指明我们默认使用以太坊测试链rinkeby,如果需要使用其他链,可以这里指明,比如使用kovan,指明使用某个链,需要在下面提供区块链服务的各种配置信息。

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/

 

 

...全文
863 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

img


我的brownie-config.yaml文件里面啥都没有请问是正常的吗?我看作者的brownie-config.yaml文件里面怎么有那么多东西

想买CT5的小曹 2022-08-15
  • 打赏
  • 举报
回复

这才是好文章

46

社区成员

发帖
与我相关
我的任务
社区描述
这里是CSDN讨论Web产品技术和产业发展的大本营, 欢迎所有Web3业内和关心Web3的朋友们.
社区管理员
  • Web3天空之城
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧