想踏入Web3世界卻不知從何開始?近年來,隨著加密貨幣與區塊鏈技術的蓬勃發展,去中心化應用(DApp)的需求與日俱增,也吸引越來越多開發者投入這個藍海市場。本篇以太坊開發教學將提供一份完整的學習路線圖,帶你從DApp開發入門觀念建立,到實際操作業界主流的Truffle框架實戰與Web3.js前端互動,手把手完成你的第一個去中心化應用,解決你學習路徑混亂、資訊破碎的痛點。
DApp開發入門:你需要知道的核心觀念
在實際動手寫程式之前,建立正確且扎實的基礎觀念至關重要。這能幫助你在開發過程中更清楚自己正在做什麼,並在遇到問題時有能力追本溯源。讓我們從以太坊、智能合約,以及DApp的底層運作原理開始,為你的DApp開發入門之路打下穩固的基石。
什麼是以太坊與智能合約?
以太坊(Ethereum)不僅僅是一種像比特幣一樣的加密貨幣,它更是一個開源的、去中心化的區塊鏈平台。它允許開發者在其上建立和部署「智能合約」(Smart Contracts)。
- 以太坊 (Ethereum): 可以想像成一台「世界電腦」,由全球成千上萬的節點共同維護,提供一個無法被單一實體操控、公開透明且永遠在線的運行環境。
- 智能合約 (Smart Contract): 這是一段部署在以太坊區塊鏈上的程式碼。當預設的條件被滿足時,合約內的程式碼就會自動執行。它就像現實世界中的合約,但執行過程是自動化且不可竄改的,消除了中介機構的需求,例如銀行或律師。
簡單來說,智能合約是DApp的後端邏輯核心,而以太坊就是承載這些智能合約的底層平台。所有DApp的狀態改變與交易紀錄,都會被公開透明地記錄在以太坊的帳本上。
DApp的運作原理與架構解析
DApp(Decentralized Application)即「去中心化應用」。與傳統的App(例如Facebook或LINE)將後端程式碼與資料庫部署在中心化伺服器不同,DApp的核心邏輯(智能合約)是運行在去中心化的區塊鏈網路上。
一個典型的DApp架構包含以下幾個部分:
- 前端 (Frontend): 使用者直接互動的介面,通常由React、Vue等網頁技術開發。這部分與傳統Web開發沒有太大差異。
- 錢包 (Wallet): 例如MetaMask,作為使用者與區塊鏈互動的橋樑。使用者透過錢包管理自己的加密資產,並對交易進行簽名授權。
- Web3.js / Ethers.js: 這是一個JavaScript函式庫,負責將前端的請求翻譯成區塊鏈看得懂的格式,並與以太坊節點溝通,是前端與智能合約之間不可或缺的翻譯官。
- 智能合約 (Smart Contract): 部署在以太坊區塊鏈上,處理所有業務邏輯與狀態儲存,是DApp的後端核心。
- 以太坊網路 (Ethereum Network): 由全球眾多節點組成的去中心化網路,負責運行智能合約並儲存所有交易紀錄。
了解這個架構,有助於你在進行以太坊開發教學的學習時,清楚掌握每個工具在生態系中所扮演的角色。
必備工具:Node.js, Ganache, MetaMask介紹與安裝
在開始實戰之前,我們需要先建置好開發環境。以下是三個在DApp開發入門階段最重要的工具:
- Node.js & npm: Node.js是一個讓JavaScript能在伺服器端運行的環境。npm則是其套件管理器,我們將用它來安裝Truffle、Web3.js等開發工具。請至Node.js官網下載並安裝LTS(長期支援)版本。
- Ganache: 一個個人的本地以太坊區塊鏈。它能讓你快速啟動一個用於開發和測試的區塊鏈環境,並提供10個預設帳戶,每個帳戶都有100個ETH的測試幣。這讓你可以在不花費任何真實Gas Fee的情況下,進行智能合約的部署與測試。可至Truffle Suite官網下載桌面應用程式。
- MetaMask: 最受歡迎的瀏覽器錢包插件。它讓你的瀏覽器能夠直接與DApp互動。使用者透過MetaMask管理帳戶、簽署交易,是Web3世界最重要的入口。請至MetaMask官網安裝對應的瀏覽器擴充功能。
請確保以上三項工具都已正確安裝並能正常運作,這是進行後續Truffle框架實戰的基礎。
Truffle框架實戰:高效部署你的第一個智能合約
環境都準備好了嗎?接下來,我們要進入本篇以太坊開發教學的重頭戲——使用Truffle框架來開發、編譯、部署我們的第一個智能合約。Truffle是一套功能強大的開發套件,能大幅簡化DApp的開發流程。
步驟一:使用Truffle初始化專案
首先,打開你的終端機(Terminal或Command Prompt),建立一個新的專案資料夾並進入該資料夾。
mkdir MyFirstDApp
cd MyFirstDApp
接著,我們需要全域安裝Truffle。如果尚未安裝,請執行以下指令:
npm install -g truffle
安裝完成後,使用truffle init指令來初始化你的專案:
truffle init
執行成功後,你會看到Truffle幫你建立了一些預設的資料夾與檔案:
contracts/: 存放Solidity智能合約原始碼的地方。migrations/: 存放部署腳本的地方,Truffle會依照編號順序執行。test/: 存放合約測試腳本的地方。truffle-config.js: Truffle專案的設定檔,包含網路設定、編譯器版本等。
步驟二:撰寫與編譯Solidity智能合約
現在,讓我們來撰寫一個簡單的智能合約。在contracts/資料夾中新增一個名為SimpleStorage.sol的檔案,並貼上以下程式碼:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
contract SimpleStorage {
uint256 private storedData;
function set(uint256 x) public {
storedData = x;
}
function get() public view returns (uint256) {
return storedData;
}
}
這個合約非常簡單,它包含:
- 一個名為
storedData的私有變數,用來儲存一個數字。 - 一個
set函式,可以讓我們傳入一個數字來更新storedData。 - 一個
get函式,可以讀取目前storedData的值。
寫好合約後,回到終端機,執行編譯指令:
truffle compile
如果一切順利,Truffle會將編譯後的合約ABI(Application Binary Interface)等資訊存放在build/contracts/資料夾中。ABI就像是智能合約的API說明書,讓外部應用(如Web3.js)知道如何與這個合約互動。
步驟三:設定部署腳本並連接Ganache本地鏈
合約編譯完成後,我們需要告訴Truffle如何將它部署到區塊鏈上。首先,打開truffle-config.js檔案,找到networks的設定區塊,並取消註解development網路的設定,讓它看起來像這樣:
networks: {
development: {
host: "127.0.0.1", // Localhost (default: none)
port: 7545, // Standard Ethereum client port for Ganache
network_id: "*", // Any network (default: none)
},
},
這裡的port: 7545需要對應你本機上Ganache運行的RPC伺服器端口,預設通常是7545。請確保你的Ganache應用程式正在運行中。
接著,到migrations/資料夾,新增一個名為1_deploy_simple_storage.js的檔案(檔名前面的數字很重要,代表執行順序),並加入以下內容:
const SimpleStorage = artifacts.require("SimpleStorage");
module.exports = function (deployer) {
deployer.deploy(SimpleStorage);
};
這個腳本的作用很單純:引入我們剛剛寫好的SimpleStorage合約,並使用Truffle提供的deployer物件將它部署出去。
步驟四:成功部署合約到鏈上
所有準備工作都已就緒!現在,讓我們執行最後的部署指令,將合約部署到Ganache本地鏈上:
truffle migrate --network development
--network development這個參數會告訴Truffle使用我們在truffle-config.js中設定好的development網路。執行後,你應該會在終端機看到部署過程的詳細資訊,包含交易Hash、合約地址、花費的Gas等。同時,在Ganache的介面上,你也會看到其中一個帳戶的ETH餘額減少了,這就是部署合約所花費的Gas Fee。
恭喜!你已經成功完成了Truffle框架實戰中最關鍵的一步——將智能合約部署到區塊鏈上。
Web3.js教學:打造與DApp互動的前端介面
智能合約部署上鏈後,它就像一個在雲端的後端程式,但一般使用者無法直接與它互動。這時,我們就需要一個前端介面,並透過Web3.js教學來學習如何串連起使用者、錢包與智能合約。
Web3.js是什麼?它如何連接以太坊?
Web3.js是一個強大的JavaScript函式庫集合,它允許我們的前端應用程式透過HTTP或IPC連線與本地或遠端的以太坊節點進行互動。簡單來說,它扮演的角色是:
- 翻譯官: 將JavaScript的函式呼叫,轉換成以太坊節點能理解的JSON-RPC請求。
- 橋樑: 建立前端應用與以太坊區塊鏈之間的溝通管道。
- 工具箱: 提供一系列便利的工具,讓我們可以查詢區塊鏈狀態、發送交易、與智能合約互動等。
透過Web3.js,開發者不需要深入了解以太坊底層的P2P協議,就能輕鬆地在網頁上打造功能完整的DApp。
實作:串接MetaMask錢包讀取帳戶資訊
首先,我們需要在前端專案中引入Web3.js。你可以使用npm安裝:
npm install web3
接著,在你的JavaScript檔案中,你可以用以下程式碼來偵測並連接使用者瀏覽器中的MetaMask錢包:
import Web3 from 'web3';
let web3;
let userAccount;
async function connectWallet() {
if (window.ethereum) {
web3 = new Web3(window.ethereum);
try {
// 請求使用者授權帳戶
const accounts = await window.ethereum.request({ method: 'eth_requestAccounts' });
userAccount = accounts[0];
console.log('錢包已連接,帳戶地址:', userAccount);
// 可以在此處更新UI,顯示帳戶資訊
} catch (error) {
console.error('使用者拒絕連接錢包');
}
} else {
alert('請先安裝MetaMask!');
}
}
// 監聽帳戶切換事件
if (window.ethereum) {
window.ethereum.on('accountsChanged', (accounts) => {
userAccount = accounts[0];
console.log('帳戶已切換:', userAccount);
});
}
這段程式碼會檢查window.ethereum物件是否存在(由MetaMask注入),若存在則建立一個新的Web3實例,並跳出視窗請求使用者授權連接。成功後,我們就能取得使用者的錢包地址。
實作:調用智能合約的讀取與寫入功能
連接到錢包後,下一步就是與我們部署好的SimpleStorage合約互動。我們需要兩樣東西:合約的ABI與合約的地址。
ABI可以在專案的build/contracts/SimpleStorage.json檔案中找到。合約地址則可以在執行truffle migrate時的終端機輸出中找到。
// 接續上一段程式碼
// 替換成你的合約ABI與地址
const contractABI = [ ... ]; // 從SimpleStorage.json複製完整的ABI
const contractAddress = 'YOUR_CONTRACT_ADDRESS';
// 建立合約實例
const simpleStorageContract = new web3.eth.Contract(contractABI, contractAddress);
// 讀取數據 (呼叫get函式)
async function readData() {
const data = await simpleStorageContract.methods.get().call();
console.log('從合約讀取到的資料:', data);
// 將data顯示在UI上
}
// 寫入數據 (呼叫set函式)
async function writeData(value) {
if (!userAccount) {
alert('請先連接錢包');
return;
}
// 傳送交易,這會觸發MetaMask跳出簽名視窗
simpleStorageContract.methods.set(value).send({ from: userAccount })
.on('transactionHash', (hash) => {
console.log('交易Hash:', hash);
})
.on('receipt', (receipt) => {
console.log('交易已確認:', receipt);
readData(); // 寫入成功後,重新讀取一次資料更新UI
})
.on('error', (error) => {
console.error('交易失敗:', error);
});
}
在這段程式碼中:
.call()用於呼叫智能合約中不會改變區塊鏈狀態的唯讀函式(如get),它不需要花費Gas,可以立即得到結果。.send()用於呼叫會改變區塊鏈狀態的寫入函式(如set),它需要由使用者帳戶發起交易,並支付Gas Fee。這個過程是非同步的,我們會監聽transactionHash、receipt等事件來追蹤交易狀態。
透過以上步驟,你就完成了一個最基本的DApp:使用者可以連接錢包,並透過網頁介面讀取與寫入智能合約上的數據。這正是本篇Web3.js教學的核心實作。
常見問題 (FAQ)
學習以太坊開發需要哪些先備知識?
建議具備基礎的程式設計能力,特別是JavaScript。由於智能合約主要使用Solidity語言撰寫,它是一種靜態型別語言,語法風格類似C++和JavaScript,若有相關經驗會更容易上手。此外,對區塊鏈的基本原理(如交易、Gas、錢包)有初步了解,也能加速學習過程。
Truffle和Hardhat哪個比較適合新手?
Truffle和Hardhat都是目前最主流的以太坊開發框架。Truffle發展歷史較久,社群資源和教學文件相對豐富,對於初學者來說,跟著教學文件一步步操作較為容易,是很好的入門選擇。Hardhat則更為靈活且擴充性強,特別是在測試和本地網路模擬方面有其獨到之處,受到許多進階開發者的喜愛。對於新手,建議可以從Truffle開始,建立起完整的開發流程概念後,再依需求評估是否轉換或學習Hardhat。
我該如何將DApp部署到以太坊主網或測試網?
將DApp部署到公開網路(主網或測試網如Sepolia)的流程與部署到本地Ganache鏈類似,主要差異在於truffle-config.js的網路設定。你需要:
- 一個節點服務提供商(如Infura或Alchemy)的API端點URL。
- 一個含有足夠測試幣(用於測試網)或真實ETH(用於主網)的錢包助記詞(Mnemonic Phrase)或私鑰。
- 安裝
@truffle/hdwallet-provider套件來處理錢包連線。
在truffle-config.js中新增一個網路設定(例如sepolia),填入以上資訊,然後執行truffle migrate --network sepolia即可。切記,絕對不要將含有真實ETH的私鑰或助記詞直接寫在程式碼中或上傳到公開的程式碼庫(如GitHub)。
開發DApp的成本高嗎?
開發階段的成本幾乎為零。使用Ganache本地鏈進行開發與測試完全免費。當需要部署到公開測試網時,可以透過「水龍頭(Faucet)」網站免費領取測試幣來支付Gas Fee。真正的成本發生在將智能合約部署到以太坊「主網(Mainnet)」時,你需要支付真實的ETH作為Gas Fee,費用會根據當時的網路壅塞程度與合約的複雜度而有所不同,從幾十美元到數百美元都有可能。
結論
恭喜你完成了第一個DApp的開發與部署!本文從DApp開發入門的核心觀念,到Truffle框架實戰的智能合約部署,再到Web3.js教學的前端互動整合,涵蓋了以太坊開發最核心的步驟。這趟旅程只是你踏入Web3世界的第一步,區塊鏈的世界廣闊且充滿機會,後續還有更複雜的合約邏輯、代幣標準(ERC-20, ERC-721)、去中心化儲存(IPFS)等著你去探索。持續學習與動手實作,是成為一位優秀區塊鏈開發者的不二法門。立即動手,開啟你的Web3開發之旅吧!

