---
# System prepended metadata

title: 環境建置

---

# 環境建置

1. VSCode
3. Ganache
4. Metamask
5. Truffle
6. Infura(測試鏈使用，請使用金鑰導入的方式，避免使用助記詞方式)
7. [額外補充 - 實務情況](/L2I5WkwfRW2mw-50-b9ORQ)

## 1. VSCode
安裝 solidity 套件(讓VSCode 可辨識 .sol 檔)
![](https://hackmd.io/_uploads/BkSy-PWhY.png)

vscode plugins:
- solidity
- Solidity Contract Flattener
- Solidity Debugger
- Solidity Metrics
- Solidity Visual Developer

## 2. Ganache 安裝
> 介紹：提供快速的本地開發測試環境，啟動時自動創建十組區塊鏈錢包，資料僅暫時在記憶體中，程式關掉後資料就會消失。


MacOs 可以直接到官網下載安裝
![](https://hackmd.io/_uploads/rka7iIZhY.png)

點擊 quickstart

Windows 安裝參考
https://steemit.com/blockchain/@oneleo/windows-ethereum-ganache

## 3. MetaMask 設定
### 設定本地的鏈：
新的RPC URL ->  抓自 Ganache 的 RPC Server
鏈 ID -> 1337  這個基本上是固定值，代表本地的port
![](https://hackmd.io/_uploads/SkZ3FazhY.png)

### 導入Ganache錢包
點擊錢包列表右側的鑰匙符號，會有 private key 可以複製
![](https://hackmd.io/_uploads/Hkf4c6znY.png)
到 Metamask 導入帳戶，貼上剛剛複製的私鑰
![](https://hackmd.io/_uploads/BJvdq6fhK.png)
導入成功之後會長的像這樣
![](https://hackmd.io/_uploads/r1Pxspf3K.png)

## 5. Truffle 安裝設定

> PS. 本次 Node version v16.13.0，可以使用 nvm 做 node 多版本管理

```bash=
npm install -g truffle  # or yarn global add truffle@
truffle version # 查看版本
mkdir project_name
cd project_name
truffle init # 建立 contracts, migrations, truffle-config.js 等檔案
 
```

### 設定 truffle-config.js 的 networks, compiles
[參考此處設定](/qmC0cAFESIOrqBnQoNWjkQ)

```bash=
truffle compile # 編譯
truffle migrate # 執行部屬合約用，他會執行在此專案內migrations資料夾內的檔案
truffle migrate --reset # add --reset, to update the contract which has deployed
# 執行完可以打開 ganache 發現第一個錢包本來有100eth，現在變成99.99eth
# 恭喜到這裡就成功在本地部屬了你的智能合約

# 另外補充
truffle console # 命令行，類似資料庫命令行(mongo之類的)

```

**1. truffle.config.js 的 IP 與port 要與 RPC SERVER 中的 networks 一致**
![](https://hackmd.io/_uploads/SyJnPv-2K.png)
![](https://hackmd.io/_uploads/B1FGuDbnF.png)

**2. compilers 的 version 要與 contract 內的 solidity 版本一致**
![](https://hackmd.io/_uploads/Bys_uw-2F.png)




## 6. Infura 設定
> 到此之前的設定都是關於本地架RPC server及測試鏈(Ganache)，Infura提供一個快速可使用的RPC server，我們可以透過它連到測試鏈(rinkeby, ropsten)或者公鏈

我們會需要兩個東西，**Metamask 開發用帳號的私鑰**，infura project的的 project id

Infura 官網連結：https://infura.io/
註冊流程可參考：https://ithelp.ithome.com.tw/articles/10202794

建立完專案後可獲得：`project id`, `project secret`, `endpoints`
可選擇哪一種鏈：這裡可以用 **rinkeby**


### 有一個大家常常混淆的地方，是 Metamask 帳號的私鑰，不是錢包地址
## 需要新增一個開發用帳號，並在帳戶詳情中，點擊下方的導出私鑰並輸入登入密碼，才可以拿到
![](https://i.imgur.com/yqiPHBb.png)



接下來回到專案，先安裝

```
npm install truffle-privatekey-provider
```

truffle-config.js
```javascript=
const PrivateKeyProvider = require("truffle-privatekey-provider");
const privateKey = process.env['your_metamask_test_account_private_key'] // 這一行是拿專案中的 .env 檔案資料，這個檔案請自行新增，並用來存放機敏資料，不會上傳到 github ，使用時需要搭配 npm 套件 dotenv 使用，可以自行搜尋使用方式，或找有前端開發經驗的組員交流詢問
...

networks: {
  // 測試鏈
  rinkeby: {
      provider: () => new PrivateKeyProvider(privateKey, "https://rinkeby.infura.io/" + process.env['your_project_id']),  // 這一行是拿專案中的 .env 檔案資料，這個檔案請自行新增，並用來存放機敏資料，不會上傳到 github ，使用時需要搭配 npm 套件 dotenv 使用，可以自行搜尋使用方式，或找有前端開發經驗的組員交流詢問
      gasPrice: 50000000000, // 50 gwei 可調整,
      network_id: 4, // rinkeby network id 不可調
    },
  
  // 本地鏈
    development: {
     host: "127.0.0.1",     // Localhost (default: none)
     port: 7545,            // Standard Ethereum port (default: none)
     network_id: "*",       // Any network (default: none)
    },
  },

```

最後部屬指定 rinkeby

```
truffle migrate --network rinkeby
```

部屬成功會有有類似下方的訊息出現

![](https://hackmd.io/_uploads/SJhr4Y-3F.png)
