一、Hardhat / Foundry 進行合約部署
概念介紹
-
Hardhat 和 Foundry 都是以太坊智能合約開發的工具套件,支持合約的編譯、測試和部署。
-
它們允許開發者在本地或測試網絡快速開發智能合約,并部署到鏈上(測試網或主網)。
-
部署過程通常包含以下步驟:
-
編譯合約代碼生成字節碼和ABI。
-
連接到區塊鏈網絡(本地測試鏈或遠程測試/主網)。
-
發送部署交易,等待確認。
-
獲取部署后的合約地址,供后續交互使用。
-
1?? 使用 Hardhat 進行合約部署
環境準備
-
Node.js 環境
-
已安裝 Hardhat(
npm install --save-dev hardhat
)
示例代碼
1. 初始化 Hardhat 項目
npx hardhat
# 選擇 "Create a basic sample project"
# 生成項目結構
2. 編寫合約 contracts/Greeter.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;contract Greeter {string private greeting;constructor(string memory _greeting) {greeting = _greeting;}function greet() public view returns (string memory) {return greeting;}
}
3. 編寫部署腳本 scripts/deploy.js
async function main() {// 獲取合約工廠(編譯后的合約接口)const Greeter = await ethers.getContractFactory("Greeter");// 部署合約并傳入構造函數參數const greeter = await Greeter.deploy("Hello, Hardhat!");// 等待合約部署交易被確認await greeter.deployed();console.log("Greeter deployed to:", greeter.address);
}// 捕獲異步錯誤
main().catch((error) => {console.error(error);process.exitCode = 1;
});
4. 配置網絡 hardhat.config.js
require("@nomiclabs/hardhat-ethers");module.exports = {solidity: "0.8.17",networks: {sepolia: { // 以太坊測試網之一url: "https://sepolia.infura.io/v3/YOUR_INFURA_PROJECT_ID",accounts: ["YOUR_PRIVATE_KEY"] // 部署用賬戶私鑰}}
};
5. 部署合約
npx hardhat run scripts/deploy.js --network sepolia
詳細講解
-
ethers.getContractFactory
從編譯結果生成部署工廠。 -
Greeter.deploy()
發起部署交易,參數是構造函數的入參。 -
deployed()
確認部署完成,返回合約實例。 -
hardhat.config.js
配置網絡,設置 RPC 地址和私鑰,實現遠程部署。 -
使用 Infura 作為 RPC 提供者,私鑰不能泄露,需環境變量管理。
2?? 使用 Foundry 進行合約部署
環境準備
-
安裝 Foundry:https://book.getfoundry.sh/getting-started/installation
-
forge
是 Foundry 的 CLI,支持編譯、測試、部署。
示例代碼
1. 創建項目并編寫合約
forge init MyProject
cd MyProject
2. 編寫部署腳本 script/Deploy.s.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;import "forge-std/Script.sol";
import "../src/Greeter.sol";contract DeployScript is Script {function run() external {// 啟動廣播交易(用私鑰簽名)vm.startBroadcast();// 部署合約Greeter greeter = new Greeter("Hello, Foundry!");// 停止廣播vm.stopBroadcast();// 打印合約地址console.log("Greeter deployed at:", address(greeter));}
}
3. 配置 .env
私鑰和 RPC
RPC_URL=https://sepolia.infura.io/v3/YOUR_INFURA_PROJECT_ID
PRIVATE_KEY=你的私鑰
4. 配置 foundry.toml
[rpc_endpoints]
sepolia = "${RPC_URL}"[profile.default]
sender = "${PRIVATE_KEY}"
5. 編譯合約
forge build
6. 部署合約
forge script script/Deploy.s.sol:DeployScript --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast
詳細講解
-
vm.startBroadcast()
開始簽名和發送交易。 -
通過
new
關鍵字直接部署合約,語法簡潔。 -
Foundry 使用環境變量配置 RPC 和私鑰,方便安全管理。
-
forge script
支持本地或遠程鏈部署。 -
部署過程自動打印合約地址,方便后續調用。
總結
工具 | 特點 | 適用場景 |
---|---|---|
Hardhat | 豐富插件體系,JS/TS 腳本靈活 | 復雜 DApp,前后端聯動 |
Foundry | Rust 實現,編譯和部署快速,Solidity 腳本 | 輕量、快速原生合約開發部署 |
如果你想,我可以幫你寫完整 Hardhat 或 Foundry 部署腳本模板,或幫你配置環境!
二、CI/CD 自動化部署
1?? 概念介紹
CI/CD 是 DevOps 實踐中不可或缺的一部分:
-
CI(持續集成,Continuous Integration):開發人員頻繁地將代碼合并到主分支,并通過自動構建和測試保證質量。
-
CD(持續交付 / 部署,Continuous Delivery / Deployment):
-
持續交付:代碼自動構建、測試并準備好部署。
-
持續部署:代碼變更一旦通過測試就會自動部署到生產環境。
-
CI/CD 的目標是實現「高頻率、小批量、安全」地發布應用和智能合約,最大化交付效率和穩定性。
2?? 示例場景(使用 GitHub Actions)
我們以部署一個 Solidity 智能合約項目為例,使用:
-
Hardhat 構建部署邏輯
-
GitHub Actions 實現 CI/CD 流程
-
自動部署到 Sepolia 測試網
3?? 項目結構(假設為 Hardhat 項目)
├── contracts/
│ └── Greeter.sol
├── scripts/
│ └── deploy.js
├── .github/
│ └── workflows/
│ └── deploy.yml 👈 CI/CD配置文件
├── .env 👈 私鑰和Infura項目ID
├── hardhat.config.js
4?? 配置 .env
文件(用于 secrets)
PRIVATE_KEY=0xabc...your_private_key
INFURA_PROJECT_ID=your_project_id
5?? 配置 hardhat.config.js
require("@nomiclabs/hardhat-ethers");
require("dotenv").config();module.exports = {solidity: "0.8.17",networks: {sepolia: {url: `https://sepolia.infura.io/v3/${process.env.INFURA_PROJECT_ID}`,accounts: [process.env.PRIVATE_KEY]}}
};
6?? 部署腳本 scripts/deploy.js
async function main() {const Greeter = await ethers.getContractFactory("Greeter");const greeter = await Greeter.deploy("Hello CI/CD!");await greeter.deployed();console.log("Greeter deployed to:", greeter.address);
}main().catch((error) => {console.error(error);process.exitCode = 1;
});
7?? 配置 GitHub Actions:
配置 GitHub Actions:.github/workflows/deploy.yml
name: Deploy to Sepoliaon:push:branches:- main # 僅 main 分支觸發部署jobs:deploy:runs-on: ubuntu-lateststeps:- name: Checkout repositoryuses: actions/checkout@v3- name: Setup Node.jsuses: actions/setup-node@v3with:node-version: 18- name: Install dependenciesrun: npm install- name: Compile contractsrun: npx hardhat compile- name: Deploy contractsenv:PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }}INFURA_PROJECT_ID: ${{ secrets.INFURA_PROJECT_ID }}run: npx hardhat run scripts/deploy.js --network sepolia
💡 關鍵說明:
步驟 | 說明 |
---|---|
actions/checkout | 拉取你提交的代碼到 GitHub Runner |
setup-node | 配置 Node.js 運行環境 |
npm install | 安裝 Hardhat 和依賴包 |
compile | 編譯 Solidity 合約 |
deploy | 運行部署腳本并連接到 Sepolia |
8?? 設置 GitHub Secrets
進入 GitHub 倉庫:
-
進入
Settings > Secrets > Actions
-
添加以下兩個 Secret:
名稱 | 內容 |
---|---|
PRIVATE_KEY | MetaMask 部署賬號私鑰(不含 0x) |
INFURA_PROJECT_ID | Infura 項目的 ID |
9?? 執行部署流程
每次你推送到 main
分支,GitHub Actions 會自動執行部署流程,并將合約部署到 Sepolia。
? 總結
優點 | 描述 |
---|---|
自動化流程 | 不再手動執行構建、測試、部署操作 |
提升部署安全性與一致性 | 腳本標準化部署,減少人為誤差 |
多人協作與可追蹤性 | 每次部署都有記錄、版本控制與回滾能力 |
如果你希望部署前先執行測試、lint 或是多網絡部署等功能,也可以輕松擴展 workflow 腳本。需要我幫你加上這些功能模板嗎?
三、合約部署到以太坊主網或測試網(如 Sepolia)流程
1?? 概念介紹
以太坊上的 合約部署流程 是將你編寫的 Solidity 智能合約代碼,通過編譯、構建交易、簽名并發送至區塊鏈的步驟。開發者常用部署工具如:
-
Hardhat
-
Foundry
-
Remix IDE(適合初學者)
部署目標網絡通常包括:
-
測試網(如 Sepolia、Goerli)👉 用于調試和驗證部署效果
-
主網(Mainnet)👉 實際上線環境,需要支付真實 ETH 作為 gas
為了確保部署安全與效率,推薦使用 Hardhat + Infura + 私鑰簽名 的方式進行自動化部署。
2?? 項目結構示意
my-contract-project/
├── contracts/
│ └── MyToken.sol # 智能合約
├── scripts/
│ └── deploy.js # 部署腳本
├── hardhat.config.js # 配置文件
├── .env # 環境變量(私鑰等)
├── package.json
└── README.md
3?? 安裝依賴
npm init -y
npm install --save-dev hardhat dotenv @nomiclabs/hardhat-ethers ethers
npx hardhat # 初始化 Hardhat 項目
4?? 編寫合約:contracts/MyToken.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;contract MyToken {string public name = "MyToken";string public symbol = "MTK";uint256 public totalSupply = 1000000;address public owner;mapping(address => uint256) public balanceOf;constructor() {owner = msg.sender;balanceOf[owner] = totalSupply;}
}
5?? 編寫部署腳本:scripts/deploy.js
const hre = require("hardhat");async function main() {// 獲取部署賬戶const [deployer] = await hre.ethers.getSigners();console.log("部署使用賬戶:", deployer.address);// 獲取合約工廠對象const Token = await hre.ethers.getContractFactory("MyToken");// 部署合約(可傳構造函數參數)const token = await Token.deploy();// 等待鏈上確認await token.deployed();console.log("合約部署地址:", token.address);
}main().then(() => process.exit(0)).catch((err) => {console.error(err);process.exit(1);});
6?? 配置 .env
文件(用于保存私密信息)
PRIVATE_KEY=你的私鑰(以0x開頭)
INFURA_API_KEY=你的 Infura 項目 ID
7?? 修改 hardhat.config.js
require("@nomiclabs/hardhat-ethers");
require("dotenv").config();const { PRIVATE_KEY, INFURA_API_KEY } = process.env;module.exports = {solidity: "0.8.18",networks: {sepolia: {url: `https://sepolia.infura.io/v3/${INFURA_API_KEY}`,accounts: [PRIVATE_KEY]},mainnet: {url: `https://mainnet.infura.io/v3/${INFURA_API_KEY}`,accounts: [PRIVATE_KEY]}}
};
8?? 部署命令
🚀 Sepolia 測試網部署
npx hardhat run scripts/deploy.js --network sepolia
🚨 Mainnet 主網部署(務必確認安全性和 gas)
npx hardhat run scripts/deploy.js --network mainnet
9?? 主網部署前的安全檢查建議:
安全項 | 建議說明 |
---|---|
? 合約代碼審計 | 最好使用靜態分析工具(如 Slither)和測試覆蓋率 |
? 部署地址 ETH 充足 | 主網部署手續費高,建議準備 0.01 ETH+ |
? 使用硬件錢包部署 | MetaMask 或 Ledger 簽名更安全 |
? 設置 require 權限控制 | 避免合約被惡意調用 |
? 啟用多簽治理機制 | 對于有權限控制的合約,避免單人完全控制 |
🔚 總結
階段 | 工具/文件 | 說明 |
---|---|---|
編寫合約 | contracts/*.sol | 用 Solidity 編寫業務邏輯 |
配置部署環境 | .env , hardhat.config.js | 加入私鑰、網絡、API 密鑰等 |
部署腳本 | scripts/deploy.js | 使用 ethers.js 部署邏輯 |
執行部署 | CLI 命令 | 使用 --network 指定目標網絡 |
主網注意事項 | 錢包安全、合約審計等 | 防止資金損失和漏洞 |
如果你希望我擴展內容如多合約部署、多網絡發布、部署后驗證合約(Etherscan)、部署后存儲合約地址到數據庫,也可以繼續幫你加上。需要嗎?