# 環境建置
1. VSCode
3. Ganache
4. Metamask
5. Truffle
6. Infura(測試鏈使用,請使用金鑰導入的方式,避免使用助記詞方式)
7. [額外補充 - 實務情況](/L2I5WkwfRW2mw-50-b9ORQ)
## 1. VSCode
安裝 solidity 套件(讓VSCode 可辨識 .sol 檔)

vscode plugins:
- solidity
- Solidity Contract Flattener
- Solidity Debugger
- Solidity Metrics
- Solidity Visual Developer
## 2. Ganache 安裝
> 介紹:提供快速的本地開發測試環境,啟動時自動創建十組區塊鏈錢包,資料僅暫時在記憶體中,程式關掉後資料就會消失。
MacOs 可以直接到官網下載安裝

點擊 quickstart
Windows 安裝參考
https://steemit.com/blockchain/@oneleo/windows-ethereum-ganache
## 3. MetaMask 設定
### 設定本地的鏈:
新的RPC URL -> 抓自 Ganache 的 RPC Server
鏈 ID -> 1337 這個基本上是固定值,代表本地的port

### 導入Ganache錢包
點擊錢包列表右側的鑰匙符號,會有 private key 可以複製

到 Metamask 導入帳戶,貼上剛剛複製的私鑰

導入成功之後會長的像這樣

## 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 一致**


**2. compilers 的 version 要與 contract 內的 solidity 版本一致**

## 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 帳號的私鑰,不是錢包地址
## 需要新增一個開發用帳號,並在帳戶詳情中,點擊下方的導出私鑰並輸入登入密碼,才可以拿到

接下來回到專案,先安裝
```
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
```
部屬成功會有有類似下方的訊息出現
