WEB3全棧開發——面試專業技能點P8DevOps / 區塊鏈部署

一、Hardhat / Foundry 進行合約部署

概念介紹

  • HardhatFoundry 都是以太坊智能合約開發的工具套件,支持合約的編譯、測試和部署。

  • 它們允許開發者在本地或測試網絡快速開發智能合約,并部署到鏈上(測試網或主網)。

  • 部署過程通常包含以下步驟:

    1. 編譯合約代碼生成字節碼和ABI。

    2. 連接到區塊鏈網絡(本地測試鏈或遠程測試/主網)。

    3. 發送部署交易,等待確認。

    4. 獲取部署后的合約地址,供后續交互使用。


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,前后端聯動
FoundryRust 實現,編譯和部署快速,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_KEYMetaMask 部署賬號私鑰(不含 0x)
INFURA_PROJECT_IDInfura 項目的 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)、部署后存儲合約地址到數據庫,也可以繼續幫你加上。需要嗎?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/84411.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/84411.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/84411.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【題解-洛谷】B4292 [藍橋杯青少年組省賽 2022] 路線

題目:B4292 [藍橋杯青少年組省賽 2022] 路線 題目描述 有一個旅游景區,景區中有 N N N 個景點,景點以數字 1 1 1 到 N N N 編號,其中編號為 N N N 的景點為游客服務中心所在地。景區中有 M M M 條連接路線,每條…

MySQL體系架構解析(四):MySQL數據存儲的揭秘

MySQL中的數據目錄 確定MySQL的數據目錄 到底MySQL把數據都存到哪個路徑下呢?其實數據木對應著一個系統變量datadir,我們在使用客戶端與服務器建立連接之后查看這個系統變量的值就可以了。 -- 以下兩種方式都可以 show variables like datadir; selec…

Solidity從入門到精通-Remix的基本使用和Solidity的基本數據類型

Solidity從入門到精通-Remix的基本使用和Solidity的基本數據類型 講了那么多理論,相信大家對區塊鏈/web3也有了一定認知;這時候可能就問有人會問了如何把理論變成實際的代碼實現。 這就來了接下來會給大家分享Solidity入門教程 這時候就會有同學問了Sol…

ArcGIS Pro+ArcGIS給你的地圖加上北回歸線!

今天來看ArcGIS Pro和ArcGIS中如何給制作的中國地圖或者其他大范圍地圖加上北回歸線。 我們將在ArcGIS Pro和ArcGIS中一同介紹。 1 ArcGIS Pro中設置北回歸線 1、在ArcGIS Pro中初步設置好經緯格網等,設置經線、緯線都以10間隔顯示。 2、需要插入背會歸線&#xf…

在.NET Core控制器中獲取AJAX傳遞的Body參數

.Net Core是支持前后端不分離式的開發的,如果在原始系統中采用不分離式開發,后面需要在原系統中增加功能,并且新的服務采用其他語言開發,且系統原來功能保持原樣,這樣前端系統可以單獨調用新開發的接口。 但是&#x…

ubuntu24安裝opencv過程

1.訪問opencv官網,下載源代碼。 opencv 2.選擇相應版本的源碼下載 我這里用的是4.8.1版本的源碼進行安裝,opencv-4.8.1.tar.gz 安裝命令 tar xvf opencv-4.8.1.tar.gz #在當前文件夾創建build文件,并進入 mkdir build && cd build …

Kubernetes ClusterIP 端口深度解析:虛擬服務與流量轉發機制

事情的起因是創建了一個 NodePort 類型 Service,其端口映射關系為 8000:30948/TCP。既然30948是在每個node開的端口,那8000是開在哪的呢?出于好奇回顧了一下K8s的Cluster IP和Service 端口映射關系解析 在 Kubernetes 的 NodePort Service 中…

C++左值與右值及引用的總結

前言 在C中,理解左值(lvalue)和右值(rvalue)是掌握現代C核心特性的關鍵。左值通常指代具名的、持久存在的對象,可以取地址;而右值則是臨時的、即將銷毀的值,如字面量或表達式結果。…

學習記錄:DAY31

Java課設:數字水印處理與解析器開發 前言 想養成寫日記的習慣真不容易。最近比較懶散,復習不想復,項目又做完了,處于一種能干些什么,但是不太想干,但是不干些什么又渾身難受的處境。其實完全就不是勻不出…

Linux系統部署KES

1、安裝準備 1.版本說明V008R006C009B0014 V008:是version產品的大版本。 R006:是release產品特性版本。 C009:是通用版 B0014:是build開發過程中的構建版本2.硬件要求 #安全版和企業版 內存:1GB 以上 硬盤&#xf…

系統模塊與功能設計框架

系統模塊與功能設計框架,嚴格遵循專業架構設計原則,基于行業標準(如微服務架構、DDD領域驅動設計)構建。設計采用分層解耦模式,確保可擴展性和可維護性,適用于電商、企業服務、數字平臺等中大型系統。 系統…

MySQL中【正則表達式】用法

MySQL 中正則表達式通過 REGEXP 或 RLIKE 操作符實現(兩者等價),用于在 WHERE 子句中進行復雜的字符串模式匹配。以下是核心用法和示例: 一、基礎語法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …

Prompt工程學習之自我一致性

自我一致性 (Self-consistency) 概念:該技術通過對同一問題采樣不同的推理路徑,并通過多數投票選擇最一致的答案,來解決大語言模型(LLM)輸出的可變性問題。通過使用不同的溫度(temp…

gh hugging face使用

install sudo dpkg -i gh_2.74.0_linux_amd64.deb gh auth login gh auth login ? Where do you use GitHub? GitHub.com ? What is your preferred protocol for Git operations on this host? HTTPS ? Authenticate Git with your GitHub credentials? Yes ? How wo…

2025.6.9總結(利與弊)

凡事都有兩面性。在大廠上班也不例外。今天找開發定位問題,從一個接口人不斷溯源到另一個 接口人。有時候,不知道是誰的責任填。將工作內容分的很細,每個人負責其中的一小塊。我清楚的意識到,自己就是個可以隨時替換的螺絲釘&…

數據集-目標檢測系列- 口紅嘴唇 數據集 lips >> DataBall

貴在堅持! * 相關項目 1)數據集可視化項目:gitcode: https://gitcode.com/DataBall/DataBall-detections-100s/overview 2)數據集訓練、推理相關項目:GitHub - XIAN-HHappy/ultralytics-yolo-webui: ultralytics-yo…

[論文閱讀] 人工智能+項目管理 | 當 PMBOK 遇見 AI:傳統項目管理框架的破局之路

當PMBOK遇見AI:傳統項目管理框架的“AI適配指南” 論文信息 arXiv:2506.02214 Is PMBOK Guide the Right Fit for AI? Re-evaluating Project Management in the Face of Artificial Intelligence Projects Alexey Burdakov, Max Jaihyun Ahn Subjects: Software …

CentOS7關閉防火墻、Linux開啟關閉防火墻

文章目錄 一、firewalld開啟、關閉防火墻1、查看防火墻狀態 一、firewalld開啟、關閉防火墻 以下命令在linux系統CentOS7中操作開啟關閉防火墻 # 查詢防火墻狀態 systemctl status firewalld.service # 開啟防火墻 systemctl start firewalld.service # 開機自啟動防火墻 syste…

Spring是如何實現無代理對象的循環依賴

無代理對象的循環依賴 什么是循環依賴解決方案實現方式測試驗證 引入代理對象的影響創建代理對象問題分析 源碼見:mini-spring 什么是循環依賴 循環依賴是指在對象創建過程中,兩個或多個對象相互依賴,導致創建過程陷入死循環。以下通過一個簡…

Android 之 kotlin 語言學習筆記三(Kotlin-Java 互操作)

參考官方文檔:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬關鍵字 不要使用 Kotlin 的任何硬關鍵字作為方法的名稱 或字段。允許使用 Kotlin 的軟關鍵字、修飾符關鍵字和特殊標識…