分享如何使用 Python 的 Brownie 框架開發 Solidity 語言的 DeFi 應用,包含如何安裝 Brownie,如何使用 Brownie build smart contract、deploy、以及互動。

本篇假定讀者有一定的 python 基礎,已經安裝好 python 以及 nodejs 環境。沒問題後我們就開始囉!

為何需要以 Python 開發 DeFi 應用?

在以太坊(或是相容的 Layer 2),smart contract 是以 Solidity 語言撰寫而成。那為何我們還需要用 python 寫呢?因為 smart contract 其實是跑在「節點」上的,你可以把 smart contract 想像成是裝在節點上的一個 plugin,並且暴露一些 public 的方法,讓 client 可以透過 rpc 的方式呼叫節點來調用並執行。

想成傳統 Web2 的設計,可以把「節點」當作是 Backend,寫的 smart contract 是跑在 Backend 裡的 app,如果要測試 app 是否如預期,就需要 client。在 Web2 client 直覺就是 Frontend,的確一開始 Web3 開發框架是由 Javascript 寫成。但別忘記 Web2 的爬蟲也算是一種 client,講到爬蟲就想到 Python,當然也會有 Python 版本的 Web3 開發框架囉,就是今天的主角 Brownie!

安裝 Ganache

前面提到,smart contract 需要跑在節點裡,因此我們需要在 local 裝一個開發用的節點。

節點,也就是大家說的挖礦程式,如以太坊的 geth。但此時我們使用 Ganache,因為他是專門設計給開發測試使用的。啟動時會自動建立十個 account 並給定 100 ether,同時區塊鏈只會存在記憶體中,方便清掉重複測試。

Ganache 是使用 nodejs 寫成,我們使用 npm 安裝

npm install -g ganache-cli

安裝完可以用以下指令啟動 ganache

$ ganache-cli

Ganache CLI v6.12.2 (ganache-core: 2.13.2)

Available Accounts
==================
(0) 0xEB224FCcbF7857124f39879eC1498a7Db0926e5e (100 ETH)
(1) 0x775e8d6FeBfC8A1bfF32a11434e7362F997B3Ffa (100 ETH)
(2) 0xC63bdEf4c977A282c85A74c6f267aCad902735cC (100 ETH)
....

Private Keys
==================
(0) 0x3ce5c8f182ead2f794a785bd47b369a08ca99d4033b9ecdcccf3bd80d909f664
(1) 0x689e731e0593c9a3f503d33acb43211124fba13248a767519f4c6d923b934128
(2) 0xa74d7190c9963438928921e8a206a6ae95ec9f37da7bd20a1f58195c6136f0c8
....

Listening on 127.0.0.1:8545

ganache 會自動列出十個帳號的位置以及私鑰,同時監聽 local 8545 port

安裝 Brownie

Brownie 官方建議使用 pipx 安裝。pipx 會為每一個套件自動設立一個專屬的 virtual env,而且可以直接透過 command line 呼叫執行,不需要另外在 source virtual env,非常方便!

如果還沒安裝 pipx ,請用以下指令安裝

python3 -m pip install --user pipx
python3 -m pipx ensurepath

緊接著安裝 Brownie

pipx install eth-brownie

建立 DeFi 開發專案結構

安裝好測試節點以及開發環境,我們可以透過 brownie 建立專案的資料夾結構。首先我們 cd 進去專案根目錄,使用以下指令建立

$ brownie init

會看到 brownie 幫我們建立了以下資料夾和檔案

build/
contracts/
interfaces/
reports/
scripts/
tests/
.gitattributes
.gitignore

其中幾個重點介紹一下:

  • build:放置 smart contract build 後的檔案,裡面還會有 deploy 過的 contract 資料
  • contracts:自己寫的 smart contract 檔案就放這
  • scripts:放置用 python 寫的 script
  • tests:放置用 python 寫的 test,測試 smart contract 的 code 有沒有 bug

除了以上結構,建議 init 完後立刻手動在專案根目錄建立兩個檔案

  • .env:env 可以提供開發者設定環境變數,跑 script 時 brownie 會自動讀入。在上 testnet 時很實用。
  • brownie-config.yaml:除了可以設定 smart contract 的 dependency library,也可以自行設定不同 network 所需參數,方便在 script 中自動切換使用。

以目前為例,.env 檔可以保持空白,我們先在 brownie-config.yaml 設定引入 env 檔

dotenv: .env

設定 network

brownie 除了可以開發之外,也能透過切換 network 設定,與真實的區塊鏈網路通訊。

我們可以用以下指令列出 brownie 已經設定好的網路

$ brownie networks list

Ethereum
  ├─Mainnet (Infura): mainnet
  ├─Ropsten (Infura): ropsten
  ├─Rinkeby (Infura): rinkeby
  ├─Goerli (Infura): goerli
  ├─Kovan (Infura): kovan
  └─ganache-local: ganache-local

Ethereum Classic
  ├─Mainnet: etc
  └─Kotti: kotti

Arbitrum
  └─Mainnet: arbitrum-main

....

Development
  ├─Ganache-CLI: development
  ├─Geth Dev: geth-dev
...

brownie 已經幫我們設好很多網路,包含 Ethereum 的 mainnet 與 testnet,以及 local 使用的 Ganache CLI。

我們可以在 brownie-config.yaml 設定預設的網路,方便我們在開發測試的時候,指令後面不需要特別指定網路。

這邊查找剛剛印出的網路列表,可以看到 Ganache-CLI 後面的 key 是 development,因此我們填入此值:

dotenv: .env
networks:
  default: development

設定完後可以透過 brownie console 來測試

$ brownie console

之後會進入 python 互動介面,使用 network.is_connected() 來確認是否連線

Brownie v1.17.2 - Python development framework for Ethereum

Attached to local RPC client listening at '127.0.0.1:8545'...
Brownie environment is ready.
>>> network.is_connected()
True

回 True 表示連線成功!可以進行 RPC 操作。

其中 brownie 貼心的是,如果他發現 local 沒有啟動 ganche-cli,他還會自動幫你啟動!

Brownie v1.17.2 - Python development framework for Ethereum

Launching 'ganache-cli --accounts 10 --hardfork istanbul --gasLimit 12000000 --mnemonic brownie --port 8545'...
Brownie environment is ready.
>>>

下一步,準備開始開發!

開發環境到這裡準備的差不多了,下一篇我們以 NFT 的標準 ERC-721 來分享如何使用 brownie 開發 smart contract!

延伸閱讀:
自己寫 NFT 吧!- 實現 ERC-721 – 以 Python Brownie 開發
自己寫 NFT 吧!- Deploy 到 Ganache – 以 Python Brownie 開發
自己寫 NFT 吧!- 準備 Metadata – 以 Python Brownie 開發
自己寫 NFT 吧!- Deploy 到 Rinkeby testnet – 以 Python Brownie 開發

Written by J
雖然大學唸的是生物,但持著興趣與熱情自學,畢業後轉戰硬體工程師,與宅宅工程師們一起過著沒日沒夜的生活,做著台灣最薄的 intel 筆電,要與 macbook air 比拼。 離開後,憑著一股傻勁與朋友創業,再度轉戰軟體工程師,一手扛起前後端、雙平台 app 開發,過程中雖跌跌撞撞,卻也累計不少經驗。 可惜不是那 1% 的成功人士,於是加入其他成功人士的新創公司,專職開發後端。沒想到卻在採前人坑的過程中,拓寬了眼界,得到了深層的領悟。