---
# System prepended metadata

title: 'Brownie: network settings for BSC'

---

# Brownie: network settings for BSC
本文將介紹在安裝完 Brownie 後，如何做關於 network 的設定，使其可以順利的在BSC上使用 fork、from_explorer()的功能。

為了能夠順利擷取 BSC 鏈上的資料到 brownie 的環境中，我們需要做兩個設定。分別為
1. 新增 network;
2. 與設定 bscscan 的 api token

介紹完以上兩點之後，後面的內容會介紹一些比較「暴力」的設定方法。
關於 Brownie 的操作：也可以參考這篇文章：「[Brownie 功能簡介](https://hackmd.io/@vM5aHIBcRcGU6GOAOk33Ig/HJDtYVgJY)」

## 1. 新增 BSC 使用的 network
有時候我們會希望測試的環境盡可能與真實的鏈相似，這個時候我們會需要用到 fork 功能，省去我們去設置各種協定的功夫[[1]](https://blog.chain.link/build-a-dapp-on-binance-smart-chain-with-secure-data-feeds/)。 開啟 fork mode 模式的 console 指令如下：
```
$ brownie console --network <network 的名稱>
```
在使用上述指令之前，我們需要做一些關於「network」的設定。在 Brownie 中，所謂的 network 是指建構測試環境區塊鏈的一系列設定。

我們輸入以下指令[[2]](https://blog.chain.link/build-a-dapp-on-binance-smart-chain-with-secure-data-feeds/)：
```
$ brownie networks add development bsc-main-fork cmd=ganache-cli host=http://127.0.0.1 fork=https://bsc-dataseed1.binance.org accounts=10 mnemonic=brownie port=8545
```
上述指令中的「bsc-main-fork」是自己取的名稱，可以任意改變，只要不與現有的 network 名稱重複就好。另外上述指令中其中一個選項，「 fork=https://bsc-dataseed1.binance.org 」指的是我們選擇 Binance 官方提供的節點 [[3]](https://docs.binance.org/smart-chain/developer/rpc.html) 去存取鏈上的資料。上述指令的參數（選項）都可以之後進行更改。

## 2. 設定 bscscan 的 API Token
在進行測試的時候，也許會有與鏈上的其他智能合約互動的功能需要測試。這時我們會需要 BscScan 的 API [[4]](https://bscscan.com/apis) 將這些合約複製到我們本地的測試環境。
如果沒有 BscScan 的 API Token 的話，可以到 [Bscscan Register Page](https://bscscan.com/register) 註冊 Bscscan 的 API Token。

在 Bscscan 上註冊完之後 ，我們需要設定自己的 API Token， brownie 是藉由 environment variable 去設定 API Token 的，因此我們輸入以下指令後，就完成設定了。
```
export BSCSCAN_TOKEN="<自己的 bscscan token>"
```
上述指令對 mac OS 才有用，windows 系統可以參考下一節的「暴力法」

## 3. 暴力法
所謂的暴力法其實就是直接去改 brownie 的 source code，我自己在設定的時候也是選擇用暴力法（最好先用 git 進行版本控制）。畢竟有些指令實在是又臭又長。

### 3.1 network
brownie 關於 network 的設定其實是寫在一個 yml 檔的。所以我們也可以選擇不下指令，直接去修改 yml 檔。
第一步是去 locate 該 yml 檔的位置。首先用 ``$ brownie console `` 進入 console 中，並且輸入：
```python=
>>> from brownie import _config
>>> _config._get_data_folder()
```
console 輸出的路徑就是該檔案所在的資料夾，我們要更改的檔案是「network-config.yaml」

在該檔案中「Development」階層下，新增：
```yaml=
- cmd: ganache-cli
  cmd_settings:
    accounts: 10
    default_balance: 100
    evm_version: istanbul
    fork: bsc-main
    gas_limit: 12000000
    mnemonic: brownie
    port: 8545
  host: http://127.0.0.1
  id: bsc-main-fork
  name: Ganache-CLI (BSC-Mainnet Fork)
  timeout: 120
```
這樣做的效果和第一節的指令有著同樣的效果。如果之後想要更改設定，例如更換節點、改變預設 accounts 的數量，都可以直接在這裡更改，不需要去下 brownie 的 modify 指令。關於各個選項的意義，可以去參考[官方文件](https://eth-brownie.readthedocs.io/en/stable/network-management.html#development-networks)關於 Development network 的說明。

### 3.2 API Token
如果要用暴力法設定 API Token，第一步跟上一小節類似，我們要先 locate 欲修改檔案的位置。一樣在 brownie console 內，輸入：
```python=
>>> from brownie import _config
>>> _config.BROWNIE_FOLDER
```
輸出結果就是 source code 的位置，在「network」資料夾底下，「contract.py」中，有定義一個函數「 fetch_from_explorer()」。
我們要修改的是這個函數中的這段程式碼：
```python=
elif "bscscan" in url:
        if os.getenv("BSCSCAN_TOKEN"):
            params["apiKey"] = os.getenv("BSCSCAN_TOKEN")
        elif not silent:
            warnings.warn(
                "No BSCScan API token set. You may experience issues with rate limiting. "
                "Visit https://bscscan.com/register to obtain a token, and then store it "
                "as the environment variable $BSCSCAN_TOKEN",
                BrownieEnvironmentWarning,
            )
        #============在這裡以下新增這行============#
        params["apiKey"] = "你的BSC_SCAN TOKEN"
        #=======================================#
if (not silent):
        #print(params["apiKey"])
        print(
            f"Fetching source of {color('bright blue')}{address}{color} "
            f"from {color('bright blue')}{urlparse(url).netloc}{color}..."
        )
```
也就是說，不管有沒有在環境變數中找到 BSCSCAN_TOKEN，我都要把 「params["apiKey"]」 設為我指定的那個 TOKEN。

以上就是本篇所要介紹的設定方法，希望這篇文章可以幫助到大家完成連上 BSC 需要的設定。如果想要參考更多 brownie 的操作以及範例，請閱讀這篇文章：「[Brownie 功能簡介與範例](https://hackmd.io/@vM5aHIBcRcGU6GOAOk33Ig/HJDtYVgJY)」

## 4. Read more
1. [Brownie 功能簡介與範例](https://hackmd.io/@vM5aHIBcRcGU6GOAOk33Ig/HJDtYVgJY)
2. [Brownie Documentation - Development network](https://eth-brownie.readthedocs.io/en/stable/network-management.html#development-networks)
3. [github repo: eth-brownie/brownie](https://github.com/eth-brownie/brownie)

## 5. References
[ [1][2] Build a dApp on Binance Smart Chain With Secure Data Feeds](https://blog.chain.link/build-a-dapp-on-binance-smart-chain-with-secure-data-feeds/)
[ [3] Binance Chain Docs - JSON-RPC Endpoint](https://docs.binance.org/smart-chain/developer/rpc.html)
[ [4] BscScan - Apis ](https://bscscan.com/apis)