# Foundry NFT實作教學/介紹 (1)你的第一個Foundry專案 # 前言 **本系列文章的目的在於了解Foundry的功能,並熟悉其操作,並以發布一個ERC721 NFT為目標** Foundry 類似於 Hardhat,都是用來開發智能合約的工具,有包含部署、測試、編譯等等的功能,只不過 Hardhat 在部署跟測試上都是採用 ethers,使用 javascript 做撰寫,且使用 npm 做相關的套件管理,而在 Foundry **裡頭全都是使用 solidity 撰寫**,再搭配 CLI 工具 Hardhat 現在也是主要智能合約開發用的工具,不過現在也仍有不少的問題,最為顯著的就是智能合約的開發者必須掌握兩種語言,雖然核心還是在於 solidity,但是對於 javascript 也必須擁有一定的掌握度,才能去撰寫部署跟測試腳本 且在使用 ethers 的時候,會遇到一些坑,例如需要注意 BigNumber 的轉換,以及要去尋找相對應的 ethers function,例如部署的合約需要先`getContractFactory("Your Contract")`然後再執行`deploy()`,如果上述動作改用 solidity 寫的話就是`contract = new Contract()`,對於智能合約工程師而言就不用再多一層的轉換 我個人目前主觀認為用Foundry最大的好處在於可以讓專門開發智能合約的工程師,可以在使用上更順暢,大腦不用反覆轉換兩種語言,但Foundry較為被大眾喜愛的點在於,快速的執行速度,以及豐富完善的測試方式 但Foundry在腳本上功能還是沒有ethers完善跟方便,所以現在有一些專案採取Hardhat跟Foundry的混用,但是這邊需要注意的地方是,test是不能去混用的,若用solidity寫的test就是用`forge test`,那使用js就是用`npx hardhat test` **注意!這邊都用Mac去做舉例,若你用其他作業系統,在某些操作指令跟安裝步驟會不太一樣** # 提醒 - 此系列需要對solidity/hardhat有基本認識 - 需要了解git add/commit - 對env有基本認識 - 本系列講解會比較詳細,若是有一定開發經驗的人可以自行選擇帶過某些部分 # Foundry install 1. Download foundryup ``` curl -L https://foundry.paradigm.xyz | bash ``` 2. Install foundry ``` foundryup ``` foundry其實是由四個套件組成,分別是**forge, cast, anvil, chisel**. 3. Check version 我們這邊檢查forge的版本,用來確定是否確實安裝成功 ``` forge --version ``` 如果這邊有安裝成功的話就會顯示你的版本現在為多少 Output: ``` forge 0.2.0 (edf15ab 2023-02-22T00:11:26.185311Z) ``` 如果你是其他作業系統,可以參考[foundry book](https://book.getfoundry.sh/getting-started/installation) # Start 1. 創建一個空的資料夾,叫做hello_foundry ``` mkdir hello_foundry && cd hello_foundry ``` 2. Init ``` forge init ``` 這時候你會發現多了一些資料夾,我們晚點一個個介紹 ![](https://i.imgur.com/lgWfYCW.png) 在src跟test裡面,都已經有一個預設的sol檔,接下來我們就來跑跑看 3. Compile ``` forge build ``` Output: ``` [⠰] Compiling... [⠒] Compiling 21 files with 0.8.18 [⠃] Solc 0.8.18 finished in 2.23s Compiler run successful ``` 4. Test ``` forge test ``` Output: ``` [⠔] Compiling... No files changed, compilation skipped Running 2 tests for test/Counter.t.sol:CounterTest [PASS] testIncrement() (gas: 28334) [PASS] testSetNumber(uint256) (runs: 256, μ: 27787, ~: 28409) Test result: ok. 2 passed; 0 failed; finished in 13.41ms ``` `forge build`跟`forge test`是我們最常用的兩個指令,第一個是編譯,確認合約有沒有問題(相當於`npx hardhat compile`) 第二個就是跑測試,相當於`npx hardhat test` # 專案結構介紹 我們可以看到hello_foundry裡面多了很多資料夾跟檔案,接下來我們一個個解釋 - **.github** CI/CD 控制github action (待補充) - **lib** 套件儲存,在hardhat我們是採用npm並把套件都裝在node_modules,但在foundry 我們採用的是git submodule,簡單來說就是我們可以把在git上的專案都載下來當做套件去做使用 - **script** 腳本,作用跟hardhat的scripts一樣,可以在上面寫部署合約用的腳本 - **src** 裡面存放合約 - **test** 存放測試檔案 - **.gitmodules** 功能類似於package.json,可以查看現在裝了哪些套件 - **foundry.toml** 用於設定專案上面的某些功能,類似於hardhat.config.js,可以用來設定compile version等等,更多可以設定的選項可以參考[foundry config](https://github.com/foundry-rs/foundry/tree/master/config) 整體而言我們可以看到foundry跟hardhat在資料夾的結構上並沒有相差多少 # 結尾 下一回我們就會該怎麼開發合約跟部署 [Foundry NFT實作教學/介紹 (2)開發並部署合約](https://hackmd.io/@RainFox/B1UlEhQzn) 若在製作上有問題,可以參考原始碼: [hello-foundry](https://github.com/LI-YONG-QI/hello-foundry)