如何在 XDC 網路上開始構建 dApp:逐步教學指南
在 XDC 網路上構建去中心化應用程式(dApps)結合了企業級性能、開發者友善的工具以及極低的交易成本。XDC 網路目前市值為 5.6176 億美元,價格為 0.0282 美元(截至 2026-07-02),為開發者提供混合區塊鏈架構,能以遠低於以太坊的成本處理交易,同時保持與現有以太坊開發工具的相容性。本教學將引導您完成在 XDC 上構建第一個 dApp 的完整流程,從設置開發環境到在主網上部署功能完整的應用程式。
核心要點
- XDC 網路提供企業級可擴展性,交易費用低至 0.00001 美元,非常適合商業 dApp 開發
- 設置 XDC 開發環境需要熟悉的工具,如 Node.js、Truffle 和 MetaMask,並完全相容以太坊
- 本教學涵蓋完整的 dApp 生命週期:環境設置、智能合約開發、RPC 節點配置、測試和主網部署
什麼是 dApp?為什麼選擇 XDC 網路?
理解去中心化應用程式
去中心化應用程式(dApps)是運行在區塊鏈網路而非中心化伺服器上的軟體程式。與傳統應用程式由單一公司控制後端基礎設施不同,dApps 將控制權分散到節點網路中,使其能夠抵抗審查、停機和單點故障。可以把 dApp 想像成一台無需建築物所有者就能運作的自動販賣機——機器本身透過程式碼執行所有規則,任何人都可以準確驗證其運作方式。
dApp 的核心組件包括智能合約(儲存在區塊鏈上的自動執行程式碼)、前端使用者介面(通常是網頁應用程式)以及連接兩者的橋接層。當您與 dApp 互動時,您的操作會觸發智能合約函數,這些函數會根據預定義規則自動執行。例如,去中心化借貸 dApp 可能會自動匹配借款人與貸款人,並分配利息支付,無需任何中介機構抽成或做決策。
為什麼選擇 XDC 網路?
XDC 網路作為專為實際商業應用設計的企業級區塊鏈而脫穎而出。根據 CoinGecko 的數據,XDC 的 24 小時交易量為 765 萬美元(截至 2026-07-02),展現了穩定的市場活躍度。該網路的混合架構結合了公有鏈和私有鏈的最佳特性,在需要時提供透明度,同時保護敏感的商業資料。
XDC 的交易費用通常介於 0.00001 至 0.0001 美元之間,在網路擁塞期間比以太坊便宜約 1000 倍。這種成本效益使 XDC 特別適合需要頻繁微交易的應用,例如供應鏈追蹤、貿易融資或代幣化資產轉移。該網路每秒可處理 2,000 筆交易,區塊時間為 2 秒,提供企業用戶期望的生產系統回應速度。
對開發者而言,XDC 提供與以太坊開發工具和 Solidity 智能合約的完全相容性。如果您曾為以太坊編寫過合約,它們在 XDC 上只需極少或無需修改即可運作。該網路還提供詳盡的文件、活躍的開發者社群以及支持建設者的資助計劃。XDC 基金會在官方 XDC 開發者入口網站維護全面的資源,使問題排查和尋找實作範例變得更加容易。
如何設置您的開發環境?
安裝必要軟體
在編寫第一行程式碼之前,您需要安裝幾個構成區塊鏈開發基礎的核心工具。首先是 Node.js,這是驅動大多數區塊鏈開發工具的 JavaScript 執行環境。從 Node.js 官方網站下載 LTS(長期支援)版本——截至 2026-07-02,建議使用 20.x 或更高版本。Node.js 包含 npm(Node 套件管理器),您將在本教學中使用它來安裝其他套件。
接下來,安裝 Truffle,這是一個簡化智能合約編譯、部署和測試的開發框架。開啟您的終端機或命令提示字元並執行:
“`
npm install -g truffle
“`
`-g` 標誌會全域安裝 Truffle,使其可從系統上的任何目錄存取。Truffle 提供一套工具,包括內建測試框架、用於與已部署合約互動的控制台,以及自動化部署腳本。
您還需要一個錢包來與 XDC 網路互動。安裝 XDCPay 瀏覽器擴充功能(專為 XDC 設計的 MetaMask 分支)或配置標準 MetaMask 以使用 XDC。對於 MetaMask 配置,您需要使用以下參數將 XDC 新增為自訂網路:
- 網路名稱:XDC Mainnet
- RPC URL:https://rpc.xinfin.network
- 鏈 ID:50
- 貨幣符號:XDC
- 區塊瀏覽器:https://explorer.xinfin.network
對於開發目的,也請新增 XDC Apothem 測試網:
- 網路名稱:XDC Apothem Testnet
- RPC URL:https://rpc.apothem.network
- 鏈 ID:51
- 貨幣符號:TXDC
- 區塊瀏覽器:https://explorer.apothem.network
配置您的開發環境
安裝核心工具後,為您的 dApp 專案建立一個專用目錄。導航到您偏好的位置並執行:
“`
mkdir my-xdc-dapp
cd my-xdc-dapp
truffle init
“`
這會建立一個標準的 Truffle 專案結構,包含合約、遷移和測試的資料夾。`truffle-config.js` 檔案控制 Truffle 如何編譯和部署您的合約。
在您偏好的程式碼編輯器中開啟 `truffle-config.js`(強烈建議使用安裝了 Solidity 擴充功能的 Visual Studio Code)並為 XDC 進行配置。將預設內容替換為:
“`javascript
const HDWalletProvider = require(‘@truffle/hdwallet-provider’);
const mnemonic = ‘your twelve word seed phrase here’;
module.exports = {
networks: {
xdc: {
provider: () => new HDWalletProvider(
mnemonic,
‘https://rpc.xinfin.network’
),
network_id: 50,
gasPrice: 1000000000,
gas: 8000000
},
apothem: {
provider: () => new HDWalletProvider(
mnemonic,
‘https://rpc.apothem.network’
),
network_id: 51,
gasPrice: 1000000000,
gas: 8000000
}
},
compilers: {
solc: {
version: “0.8.19”
}
}
};
“`
安裝 HDWallet 提供者套件:
“`
npm install @truffle/hdwallet-provider
“`
重要安全提示:切勿將您的實際助記詞提交到版本控制系統。對於生產專案,請使用環境變數或密鑰管理系統。對於本教學,您可以專門為開發生成一個新錢包,並為其注入少量測試網 XDC。
要獲取用於開發的測試網 XDC,請造訪 XDC Apothem Faucet,輸入您的錢包地址(請記住 XDC 地址以「xdc」而非「0x」開頭),並請求測試代幣。您將在幾分鐘內收到 TXDC 代幣,讓您無需花費真實資金即可部署和測試合約。
如何編寫您的第一個智能合約?
建立基本智能合約
智能合約是 dApp 的核心——它們定義了應用程式的業務邏輯並在區塊鏈上執行。對於本教學,我們將建立一個簡單但實用的合約:一個去中心化訊息板,用戶可以在其中發布訊息並支付少量費用來突顯顯示他們的貼文。
在您專案的 `contracts` 資料夾中建立一個名為 `MessageBoard.sol` 的新檔案:
“`solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
contract MessageBoard {
struct Message {
address author;
string content;
uint256 timestamp;
bool highlighted;
}
Message[] public messages;
uint256 public highlightFee = 0.001 ether;
address public owner;
event MessagePosted(uint256 indexed messageId, address indexed author, string content);
event MessageHighlighted(uint256 indexed messageId);
constructor() {
owner = msg.sender;
}
function postMessage(string memory _content) public {
messages.push(Message({
author: msg.sender,
content: _content,
timestamp: block.timestamp,
highlighted: false
}));
emit MessagePosted(messages.length – 1, msg.sender, _content);
}
function highlightMessage(uint256 _messageId) public payable {
require(_messageId < messages.length, "Message does not exist");
require(messages[_messageId].author == msg.sender, “Only author can highlight”);
require(msg.value >= highlightFee, “Insufficient payment”);
messages[_messageId].highlighted = true;
emit MessageHighlighted(_messageId);
}
function getMessageCount() public view returns (uint256) {
return messages.length;
}
function getMessage(uint256 _messageId) public view returns (
address author,
string memory content,
uint256 timestamp,
bool highlighted
) {
require(_messageId < messages.length, "Message does not exist");
Message memory message = messages[_messageId];
return (message.author, message.content, message.timestamp, message.highlighted);
}
function withdrawFees() public {
require(msg.sender == owner, “Only owner can withdraw”);
payable(owner).transfer(address(this).balance);
}
}
“`
這個合約展示了幾個重要概念。`struct` 定義了一個自訂資料類型來儲存訊息資訊。`Message[]` 陣列儲存所有已發布的訊息。`event` 宣告允許前端應用程式監聽區塊鏈上的特定操作。`payable` 修飾符允許函數接收 XDC 代幣。
`postMessage` 函數允許任何人免費發布訊息。`highlightMessage` 函數要求支付費用,並檢查呼叫者是否為訊息作者。`view` 函數(如 `getMessage`)不修改區塊鏈狀態,因此不消耗 gas。
編譯您的合約
Truffle 使合約編譯變得簡單。在您的專案根目錄中執行:
“`
truffle compile
“`
Truffle 會讀取您的 Solidity 檔案,檢查語法錯誤,並生成 JavaScript 可以與之互動的 JSON 工件。編譯後的合約出現在 `build/contracts` 目錄中。如果您看到任何錯誤,請仔細閱讀錯誤訊息——Solidity 編譯器通常會提供有用的提示,指出問題所在。
常見的編譯錯誤包括版本不匹配(您的 `pragma` 語句與 `truffle-config.js` 中的編譯器版本不符)、缺少分號或括號,以及未宣告的變數。隨著您編寫更多合約,您將學會快速識別和修復這些問題。
如何部署到測試網?
建立遷移腳本
遷移腳本告訴 Truffle 如何將您的合約部署到區塊鏈。在 `migrations` 資料夾中建立一個名為 `2_deploy_contracts.js` 的新檔案:
“`javascript
const MessageBoard = artifacts.require(“MessageBoard”);
module.exports = function(deployer) {
deployer.deploy(MessageBoard);
};
“`
這個簡單的腳本指示 Truffle 部署您的 MessageBoard 合約。對於更複雜的專案,您可能會部署多個合約,設定它們之間的關係,或傳遞建構函數參數。
部署到 Apothem 測試網
確保您的錢包中有測試網 XDC(來自 faucet),然後執行:
“`
truffle migrate –network apothem
“`
Truffle 會連接到 Apothem 測試網,部署您的合約,並顯示部署詳情,包括合約地址和消耗的 gas。儲存合約地址——您需要它來與已部署的合約互動。
部署過程涉及幾個步驟。首先,Truffle 將您編譯的合約程式碼傳送到網路。礦工(在 XDC 的情況下是驗證節點)將您的合約包含在區塊中。一旦確認,您的合約就會獲得一個永久地址,任何人都可以與之互動。
如果部署失敗,請檢查幾個常見問題:您的錢包是否有足夠的 TXDC 來支付 gas 費用?您的 `truffle-config.js` 中的 RPC URL 是否正確?您的助記詞是否與有資金的錢包匹配?
在 Truffle 控制台中測試
Truffle 提供了一個互動式控制台,用於測試已部署的合約。啟動它:
“`
truffle console –network apothem
“`
在控制台中,您可以與您的合約互動:
“`javascript
let instance = await MessageBoard.deployed()
await instance.postMessage(“Hello XDC Network!”)
let count = await instance.getMessageCount()
console.log(count.toString()) // 應顯示 “1”
let message = await instance.getMessage(0)
console.log(message.content) // 應顯示 “Hello XDC Network!”
“`
這種互動式測試可以幫助您在構建前端之前驗證合約邏輯。您可以呼叫函數、檢查狀態變數,並確保一切按預期運作。
如何構建前端介面?
設置 Web3 連接
前端應用程式需要與區塊鏈通訊。Web3.js 是最流行的函式庫。在您的專案目錄中建立一個 `frontend` 資料夾並初始化一個簡單的網頁應用程式:
“`
mkdir frontend
cd frontend
npm init -y
npm install web3
“`
建立一個 `index.html` 檔案:
“`html
XDC 訊息板
訊息
“`
建立一個 `app.js` 檔案來處理區塊鏈互動:
“`javascript
const contractAddress = ‘YOUR_CONTRACT_ADDRESS_HERE’;
const contractABI = [/ 從 build/contracts/MessageBoard.json 複製 ABI /];
let web3;
let contract;
let userAccount;
async function connectWallet() {
if (typeof window.ethereum !== ‘undefined’) {
try {
// 請求帳戶存取
const accounts = await window.ethereum.request({ method: ‘eth_requestAccounts’ });
userAccount = accounts[0];
// 初始化 web3
web3 = new Web3(window.ethereum);
// 初始化合約
contract = new web3.eth.Contract(contractABI, contractAddress);
// 更新 UI
document.getElementById(‘account’).textContent = `已連接:${userAccount.substring(0, 6)}…${userAccount.substring(38)}`;
document.getElementById(‘post-section’).style.display = ‘block’;
// 載入訊息
loadMessages();
} catch (error) {
console.error(‘連接錢包時出錯:’, error);
alert(‘無法連接錢包。請確保您已安裝 MetaMask 或 XDCPay。’);
}
} else {
alert(‘未檢測到以太坊錢包。請安裝 MetaMask 或 XDCPay。’);
}
}
async function postMessage() {
const content = document.getElementById(‘message-content’).value;
if (!content) {
alert(‘請輸入訊息內容’);
return;
}
try {
await contract.methods.postMessage(content).send({ from: userAccount });
alert(‘訊息發布成功!’);
document.getElementById(‘message-content’).value = ”;
loadMessages();
} catch (error) {
console.error(‘發布訊息時出錯:’, error);
alert(‘發布訊息失敗。請查看控制台以獲取詳細資訊。’);
}
}
async function loadMessages() {
try {
const count = await contract.methods.getMessageCount().call();
const messagesList = document.getElementById(‘messages-list’);
messagesList.innerHTML = ”;
for (let i = count – 1; i >= 0; i–) {
const message = await contract.methods.getMessage(i).call();
const messageDiv = document.createElement(‘div’);
messageDiv.className = message.highlighted ? ‘message highlighted’ : ‘message’;
const date = new Date(message.timestamp * 1000);
messageDiv.innerHTML = `
${message.author.substring(0, 6)}…${message.author.substring(38)} – ${date.toLocaleString()}
${message.content}
${message.author.toLowerCase() === userAccount.toLowerCase() && !message.highlighted ?
`` : ”}
`;
messagesList.appendChild(messageDiv);
}
} catch (error) {
console.error(‘載入訊息時出錯:’, error);
}
}
async function highlightMessage(messageId) {
try {
const fee = web3.utils.toWei(‘0.001’, ‘ether’);
await contract.methods.highlightMessage(messageId).send({
from: userAccount,
value: fee
});
alert(‘訊息已突顯顯示!’);
loadMessages();
} catch (error) {
console.error(‘突顯顯示訊息時出錯:’, error);
alert(‘突顯顯示訊息失敗。請查看控制台以獲取詳細資訊。’);
}
}
// 事件監聽器
document.getElementById(‘connect-wallet’).addEventListener(‘click’, connectWallet);
document.getElementById(‘post-button’).addEventListener(‘click’, postMessage);
// 監聽帳戶變更
if (typeof window.ethereum !== ‘undefined’) {
window.ethereum.on(‘accountsChanged’, function (accounts) {
userAccount = accounts[0];
document.getElementById(‘account’).textContent = `已連接:${userAccount.substring(0, 6)}…${userAccount.substring(38)}`;
loadMessages();
});
}
“`
要獲取合約 ABI,請開啟 `build/contracts/MessageBoard.json` 並複製 `abi` 陣列。將其貼到 `app.js` 中的 `contractABI` 變數中。
測試您的 dApp
要測試前端,您需要一個本地網頁伺服器。安裝一個簡單的 HTTP 伺服器:
“`
npm install -g http-server
“`
在 `frontend` 目錄中執行:
“`
http-server
“`
在瀏覽器中開啟顯示的 URL(通常是 `http://localhost:8080`)。確保您的 MetaMask 或 XDCPay 已連接到 Apothem 測試網。點擊「連接錢包」,授權連接,然後嘗試發布訊息。
如果一切設置正確,您應該能夠發布訊息、查看所有訊息,並突顯顯示您自己的訊息。每個操作都會觸發錢包確認,因為它涉及區塊鏈交易。
如何部署到主網?
主網部署前檢查清單
在部署到 XDC 主網之前,請完成這些關鍵步驟:
- 徹底測試:在測試網上執行所有功能的完整測試。嘗試破壞您的 dApp——輸入無效資料、傳送錯誤金額、從多個帳戶互動。
- 安全審計:對於處理重要價值的合約,請考慮專業的安全審計。常見漏洞包括重入攻擊、整數溢位和存取控制問題。
- Gas 優化:審查您的合約以尋找 gas 優化機會。雖然 XDC 費用很低,但高效的程式碼仍然很重要。
- 文件:記錄您的合約函數、參數和預期行為。這有助於未來的維護和用戶理解。
- 備份:安全儲存您的部署金鑰、合約地址和 ABI。失去這些可能意味著失去對合約的存取權。
執行主網部署
獲取真實的 XDC 代幣以支付部署 gas。您可以在支援 XDC 的交易所購買 XDC,例如 KuCoin、Bitfinex 或 Gate.io(根據 CoinGecko 的數據,截至 2026-07-02)。將 XDC 傳送到您在 `truffle-config.js` 中配置的錢包地址。
記住 XDC 地址格式:雖然技術上與以太坊地址相同,但 XDC 使用「xdc」前綴而非「0x」。大多數錢包和交易所會自動處理此轉換,但在手動輸入地址時請注意。
當您準備好時,執行:
“`
truffle migrate –network xdc
“`
此命令將您的合約部署到 XDC 主網。該過程與測試網部署相同,但現在您使用的是真實代幣,您的合約將永久存在於主網上。
部署後,在 XDC 區塊瀏覽器(https://explorer.xinfin.network)上驗證您的合約。搜尋您的合約地址並檢查部署交易是否成功。您還可以在區塊瀏覽器上驗證您的合約原始碼,使其對用戶更加透明。
更新前端配置
將您的前端 `app.js` 更新為指向主網合約地址和 RPC 端點。將 `contractAddress` 變更為您的主網部署地址,並確保您的 Web3 提供者使用 `https://rpc.xinfin.network`。
對於生產部署,請考慮託管您的前端在去中心化儲存上,如 IPFS,或傳統的網頁託管服務。確保使用 HTTPS 以保護用戶連接。
最佳實踐和後續步驟
智能合約安全
安全應該是您的首要任務。實施這些實踐:
- 使用 OpenZeppelin 合約:OpenZeppelin 提供經過戰鬥測試的智能合約實作,用於常見模式,如代幣標準、存取控制和可升級性。
- 實施存取控制:使用修飾符限制敏感函數。我們的範例使用簡單的 `owner` 檢查,但更複雜的 dApp 可能需要基於角色的存取控制。
- 驗證輸入:始終驗證函數參數。檢查地址是否非零、金額是否在合理範圍內,以及陣列索引是否有效。
- 處理失敗:使用 `require` 語句進行前置條件檢查,使用 `revert` 進行複雜的錯誤處理。提供清晰的錯誤訊息以幫助除錯。
- 限制外部呼叫:與其他合約互動時要小心。使用檢查-效果-互動模式來防止重入攻擊。
效能優化
即使 XDC 的費用很低,優化仍能改善用戶體驗:
- 最小化儲存寫入:儲存操作消耗最多 gas。使用記憶體變數進行臨時計算,僅在必要時寫入儲存。
- 批次操作:允許用戶在單一交易中執行多個操作,而不是需要多個單獨的交易。
- 使用事件進行資料:對於不需要鏈上查詢的資料,發出事件並讓前端索引它們,而不是將所有內容儲存在合約狀態中。
- 優化資料結構:選擇適合您存取模式的資料結構。映射比陣列更適合查找,但陣列更適合迭代。
擴展您的 dApp
一旦您的基本 dApp 運作,請考慮這些增強功能:
- 用戶驗證:實施簽名驗證以證明用戶擁有他們的地址,而無需每次操作都進行交易。
- 鏈下儲存:對於大型資料,使用 IPFS 或 Arweave 進行儲存,並僅在鏈上儲存雜湊值。
- 預言機整合:使用預言機服務將真實世界資料帶入您的智能合約,用於價格資訊、天氣資料或其他外部資訊。
- 跨鏈功能:探索橋接解決方案,讓您的 dApp 與其他區塊鏈互動,擴大您的用戶群。
- 代幣經濟學:建立自訂代幣以激勵用戶參與、治理或存取高級功能。
社群和資源
XDC 生態系統提供豐富的資源:
- XDC 開發者入口網站:官方文件、教學和 API 參考
- XDC 社群論壇:提問、分享專案並與其他開發者聯繫
- GitHub 儲存庫:探索開源 XDC 專案以獲取範例和靈感
- 資助計劃:XDC 基金會為有前景的專案提供資助和支援
- 駭客松和活動:參加 XDC 駭客松以學習、建立和競爭獎品
常見問題
XDC 與以太坊開發有何不同?
XDC 與以太坊開發工具(Solidity、Truffle、Web3.js)完全相容,因此過渡非常順利。主要區別在於網路配置(不同的 RPC URL 和鏈 ID)、顯著降低的 gas 費用以及更快的區塊時間。XDC 的地址使用「xdc」前綴而非「0x」,但底層格式相同。對於大多數 dApp,您可以使用最少的修改將以太坊程式碼移植到 XDC。
在 XDC 上部署智能合約的成本是多少?
部署成本取決於合約大小和複雜性,但通常比以太坊便宜 1000 倍。一個簡單的合約可能花費 0.001-0.01 XDC 來部署(截至 2026-07-02 約為 0.000028-0.00028 美元)。即使是複雜的合約通常也保持在 0.1 XDC 以下。這種可負擔性使 XDC 成為實驗和學習的理想選擇,無需擔心高昂的開發成本。
我可以在 XDC 上使用現有的以太坊 dApp 嗎?
是的,大多數以太坊 dApp 只需最少的修改即可在 XDC 上運作。您需要更新網路配置以指向 XDC RPC 端點,調整任何地址格式處理(xdc 與 0x 前綴),並測試任何依賴於以太坊特定功能的功能。依賴於以太坊獨有的預言機或協議的 dApp 可能需要找到 XDC 等效項或實施替代解決方案。
XDC 網路有多安全?
XDC 使用委託權益證明(XDPoS)共識機制,由驗證節點網路保護。該網路自 2019 年以來一直運作,沒有重大安全事件。與任何區塊鏈一樣,您的 dApp 的安全性主要取決於您的智能合約程式碼品質。遵循安全最佳實踐,徹底測試,並考慮對高價值合約進行審計。
我可以在哪裡獲得 XDC 開發支援?
XDC 社群透過多個管道提供支援。官方 XDC 開發者 Telegram 群組提供即時協助。XDC 社群論壇託管深入討論和教學。GitHub 儲存庫包含範例程式碼和問題追蹤器。對於企業支援,XDC 基金會提供直接協助和潛在的資助機會。許多社群成員積極幫助新開發者入門。
XDC dApp 可以與以太坊 dApp 互動嗎?
直接互動需要跨鏈橋接解決方案。幾個專案正在為 XDC 構建橋接基礎設施,允許在 XDC 和以太坊之間轉移資產和資料。對於許多用例,您可以在兩個網路上部署類似的合約,並使用鏈下協調(透過後端服務或預言機)來同步狀態。隨著跨鏈技術的成熟,XDC 和以太坊生態系統之間的互操作性將繼續改善。
結論
在 XDC 網路上構建 dApp 結合了以太坊開發者熟悉的工具與企業級性能和極低的成本。透過遵循本教學,您已經設置了完整的開發環境,編寫並部署了智能合約,並建立了功能性前端介面。XDC 的混合架構和對真實世界商業應用的關注使其成為從供應鏈管理到去中心化金融等專案的引人注目的平台。
隨著您繼續您的 XDC 開發之旅,請記住,最好的學習方式是構建。從簡單的專案開始,逐步增加複雜性,並與 XDC 社群互動以獲取支援和靈感。該網路的低費用使實驗變得可負擔,而其與以太坊工具的相容性意味著您的技能可以跨多個區塊鏈平台轉移。無論您是在構建概念驗證還是生產級應用程式,XDC 都提供了將您的去中心化應用程式願景變為現實所需的基礎設施。
免責聲明:本文僅供教育目的,不構成財務或投資建議。加密貨幣投資涉及重大風險,包括可能損失全部投資資本。本教學中提供的價格和市值資料(來源:CoinGecko,2026-07-02)僅供說明之用,可能不反映當前市場狀況。在部署智能合約到主網之前,請務必進行徹底測試,並考慮對處理重要價值的合約進行專業安全審計。區塊鏈技術和智能合約開發需要技術專業知識——在處理真實資金之前,請確保您了解所涉及的風險。本文作者和出版商對因使用本教學中的資訊而產生的任何損失或損害不承擔責任。
如何在 XDC 網路上建構您的第一個 dApp?
設計您的 dApp
在撰寫程式碼之前,請花時間規劃您的 dApp 架構和功能。在本教學中,我們將建構一個簡單的投票 dApp,展示核心區塊鏈概念:狀態管理、使用者互動和透明記錄保存。該 dApp 將允許使用者建立投票、投票和查看結果——所有資料都永久儲存在 XDC 區塊鏈上。
設計良好的 dApp 會將智能合約(業務邏輯和資料儲存)與前端(使用者介面和互動)之間的關注點分離。智能合約應處理:
- 建立具有多個選項的新投票
- 記錄投票並防止重複投票
- 儲存每個選項的投票數
- 在發生重要操作時發出事件
前端將:
- 顯示可用的投票及其當前投票數
- 提供建立新投票的表單
- 在使用者投票時提交交易
- 監聽區塊鏈事件並即時更新顯示
這種分離使您能夠在不修改區塊鏈程式碼的情況下更新使用者介面,並使您的智能合約可在不同前端(網頁、行動裝置、桌面應用程式)中重複使用。
撰寫和部署您的智能合約
在 `contracts` 目錄中建立一個名為 `VotingDapp.sol` 的新檔案。這個 Solidity 智能合約將實作我們的投票邏輯:
“`solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
contract VotingDapp {
struct Poll {
string question;
string[] options;
mapping(uint => uint) votes;
mapping(address => bool) hasVoted;
address creator;
uint createdAt;
bool active;
}
mapping(uint => Poll) public polls;
uint public pollCount;
event PollCreated(uint indexed pollId, string question, address creator);
event VoteCast(uint indexed pollId, uint optionId, address voter);
event PollClosed(uint indexed pollId);
function createPoll(string memory _question, string[] memory _options) public {
require(_options.length >= 2, “Poll must have at least 2 options”);
require(_options.length <= 10, "Poll cannot have more than 10 options");
uint pollId = pollCount++;
Poll storage newPoll = polls[pollId];
newPoll.question = _question;
newPoll.options = _options;
newPoll.creator = msg.sender;
newPoll.createdAt = block.timestamp;
newPoll.active = true;
emit PollCreated(pollId, _question, msg.sender);
}
function vote(uint _pollId, uint _optionId) public {
Poll storage poll = polls[_pollId];
require(poll.active, “Poll is not active”);
require(!poll.hasVoted[msg.sender], “You have already voted”);
require(_optionId < poll.options.length, "Invalid option");
poll.votes[_optionId]++;
poll.hasVoted[msg.sender] = true;
emit VoteCast(_pollId, _optionId, msg.sender);
}
function closePoll(uint _pollId) public {
Poll storage poll = polls[_pollId];
require(msg.sender == poll.creator, “Only creator can close poll”);
require(poll.active, “Poll is already closed”);
poll.active = false;
emit PollClosed(_pollId);
}
function getVotes(uint _pollId, uint _optionId) public view returns (uint) {
return polls[_pollId].votes[_optionId];
}
function getOptions(uint _pollId) public view returns (string[] memory) {
return polls[_pollId].options;
}
function hasUserVoted(uint _pollId, address _user) public view returns (bool) {
return polls[_pollId].hasVoted[_user];
}
}
“`
這個合約展示了幾個重要的 Solidity 概念。`struct` 關鍵字定義了投票的自訂資料類型,結合了多個相關資訊。`mapping` 類型建立鍵值儲存——可以將它們視為提供即時查找的字典或雜湊表。像 `PollCreated` 和 `VoteCast` 這樣的事件會建立永久日誌,前端可以監控這些日誌以在區塊鏈狀態變更時更新顯示。
建立一個遷移腳本來部署您的合約。在 `migrations` 目錄中,建立 `2_deploy_contracts.js`:
“`javascript
const VotingDapp = artifacts.require(“VotingDapp”);
module.exports = function(deployer) {
deployer.deploy(VotingDapp);
};
“`
編譯您的智能合約以檢查語法錯誤:
“`
truffle compile
“`
如果編譯成功,部署到 Apothem 測試網:
“`
truffle migrate –network apothem
“`
Truffle 將顯示已部署的合約地址——請儲存此地址,因為您需要它來連接前端。在 XDC 上,部署過程通常需要 4-6 秒,比以太坊的 15 秒區塊時間快得多。
將前端連接到區塊鏈
建立一個與已部署合約互動的簡單 HTML 前端。在專案根目錄中,建立一個 `index.html` 檔案:
“`html
XDC 上的去中心化投票
建立新投票
進行中的投票
“`
建立 `app.js` 來處理區塊鏈互動:
“`javascript
let web3;
let contract;
let account;
const contractAddress = ‘YOUR_DEPLOYED_CONTRACT_ADDRESS’;
const contractABI = [/ 在此貼上您的合約 ABI /];
async function initWeb3() {
if (window.ethereum) {
web3 = new Web3(window.ethereum);
await window.ethereum.request({ method: ‘eth_requestAccounts’ });
const accounts = await web3.eth.getAccounts();
account = accounts[0];
document.getElementById(‘account’).textContent = `已連接: ${account}`;
contract = new web3.eth.Contract(contractABI, contractAddress);
loadPolls();
} else {
alert(‘請安裝 MetaMask 或 XDCPay!’);
}
}
async function createPoll() {
const question = document.getElementById(‘question’).value;
const option1 = document.getElementById(‘option1’).value;
const option2 = document.getElementById(‘option2’).value;
await contract.methods.createPoll(question, [option1, option2])
.send({ from: account });
loadPolls();
}
async function loadPolls() {
const pollCount = await contract.methods.pollCount().call();
const pollsDiv = document.getElementById(‘polls’);
pollsDiv.innerHTML = ”;
for (let i = 0; i < pollCount; i++) {
const poll = await contract.methods.polls(i).call();
const options = await contract.methods.getOptions(i).call();
let pollHtml = `
${poll.question}
`;
for (let j = 0; j < options.length; j++) {
const votes = await contract.methods.getVotes(i, j).call();
pollHtml += `
${options[j]}: ${votes} 票
`;
}
pollHtml += ‘
‘;
pollsDiv.innerHTML += pollHtml;
}
}
async function vote(pollId, optionId) {
await contract.methods.vote(pollId, optionId)
.send({ from: account });
loadPolls();
}
window.addEventListener(‘load’, initWeb3);
“`
要取得合約的 ABI(應用程式二進位介面),請在編譯後查看 `build/contracts/VotingDapp.json` 檔案。ABI 是一個 JSON 陣列,描述了合約的函數和事件——它本質上是一本指導手冊,告訴 web3.js 如何與您的合約互動。
透過在安裝了 MetaMask 或 XDCPay 的瀏覽器中開啟 `index.html` 來測試您的 dApp。確保您的錢包已連接到 Apothem 測試網,並有一些 TXDC 用於支付 Gas 費用。您應該能夠建立投票、投票並即時查看結果更新。
如何在 XDC 網路上設定 RPC 節點伺服器?
什麼是 RPC 節點伺服器?
RPC(遠端程序呼叫)節點伺服器充當您的 dApp 通往區塊鏈網路的閘道。當您的前端需要讀取區塊鏈資料或提交交易時,它會向 RPC 節點發送請求,該節點處理這些請求並返回結果。可以將 RPC 節點想像成圖書館員,代表您從龐大的圖書館(整個區塊鏈)中檢索特定書籍(區塊鏈資料)。
執行自己的 RPC 節點比使用公共 RPC 端點具有多項優勢。您可以完全控制正常運作時間和效能,消除公共端點經常施加的速率限制,並透過在地理位置上靠近使用者託管節點來減少延遲。對於服務數千名使用者的生產環境 dApp,專用 RPC 節點對於維持一致的效能至關重要。
XDC 節點有幾種類型。全節點(Full nodes)下載並驗證整個區塊鏈歷史,提供最大的安全性和去中心化。歸檔節點(Archive nodes)更進一步,儲存區塊鏈的每個歷史狀態,這對於某些進階查詢是必需的。輕節點(Light nodes)僅下載區塊標頭並根據需要請求額外資料,在資源需求和功能之間取得平衡。
設定 RPC 節點的逐步指南
設定 XDC RPC 節點需要具有足夠資源的伺服器。最低要求包括:
- 4 個 CPU 核心(生產環境建議 8 個)
- 16 GB RAM(建議 32 GB)
- 500 GB SSD 儲存空間(歸檔節點建議 1 TB)
- 100 Mbps 網路連線
- Ubuntu 20.04 或 22.04 LTS(其他 Linux 發行版也可以,但 Ubuntu 測試最充分)
首先更新您的伺服器並安裝相依套件:
“`bash
sudo apt update
sudo apt upgrade -y
sudo apt install -y build-essential git
“`
複製 XDC 網路節點軟體儲存庫:
“`bash
git clone https://github.com/XinFinOrg/XinFin-Node.git
cd XinFin-Node
“`
XDC 節點軟體基於 Go Ethereum(Geth),並針對 XDPoS 共識機制進行了修改。透過建立 `docker-compose.yml` 檔案來設定您的節點(XDC 提供 Docker 映像以便於部署):
“`yaml
version: ‘3.5’
services:
xinfinnode:
image: xinfinorg/xinfinnetwork:latest
container_name: xdc-node
ports:
– “8545:8545”
– “8546:8546”
– “30303:30303”
volumes:
– ./xdcchain:/work/xdcchain
environment:
– NETWORK=mainnet
– RPC_ENABLE=true
– WS_ENABLE=true
restart: unless-stopped
“`
此設定開放連接埠 8545 用於 HTTP RPC 請求,連接埠 8546 用於 WebSocket 連線,讓您的 dApp 能夠接收有關新區塊和事件的即時更新。
啟動您的節點:
“`bash
docker-compose up -d
“`
初始同步過程會下載整個區塊鏈,根據您的網路速度和硬體,可能需要 6-12 小時。監控同步進度:
“`bash
docker logs -f xdc-node
“`
同步完成後,透過發送簡單的 RPC 請求來測試您的節點:
“`bash
curl -X POST –data ‘{“jsonrpc”:”2.0″,”method”:”eth_blockNumber”,”params”:[],”id”:1}’ http://localhost:8545
“`
這應該會以十六進位格式返回當前區塊編號。如果您收到回應,則您的節點已正常運作並準備好服務 dApp 請求。
對於生產環境部署,請設定具有 SSL 憑證的反向代理(如 Nginx)以保護 RPC 連線。您還應該實作速率限制和身份驗證以防止濫用。以下是基本的 Nginx 設定:
“`nginx
upstream xdc_rpc {
server localhost:8545;
}
server {
listen 443 ssl;
server_name rpc.yourdomain.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass http://xdc_rpc;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
limit_req zone=rpc_limit burst=20;
}
}
“`
RPC 節點選項比較
| 功能 | 自架節點 | 第三方 RPC 服務 | 公共 RPC 端點 |
|---|---|---|---|
| 設定複雜度 | 高 – 需要伺服器管理和技術知識 | 低 – 註冊並取得 API 金鑰 | 無 – 立即使用 |
| 每月成本 | $50-200(伺服器託管) | $0-500(基於請求量) | 免費 |
| 請求限制 | 無限制(受硬體限制) | 每月 100K-10M 請求,取決於方案 | 典型為每秒 1-5 個請求 |
| 正常運作時間控制 | 完全控制,需要監控 | 提供商 SLA(通常為 99.9%) | 無保證,經常停機 |
| 延遲 | 可透過位置最佳化 | 取決於提供商(典型為 50-200ms) | 可變(100-500ms) |
| 最適合 | 高流量的生產環境 dApp | 成長中的專案、開發 | 原型設計、測試 |
| 資料隱私 | 完整 – 所有請求都保留在您的基礎設施上 | 請求對提供商可見 | 請求對營運商可見 |
對於大多數剛開始使用 XDC 的開發者來說,使用公共 RPC 端點(主網為 https://rpc.xinfin.network,測試網為 https://rpc.apothem.network)提供了最簡單的入門途徑。隨著您的 dApp 成長和請求量增加,轉向專用節點或第三方服務變得值得。
如何測試和部署您的 dApp?
測試您的 dApp
徹底的測試可以防止代價高昂的錯誤,並確保您的 dApp 在各種條件下正確運作。Truffle 包含一個測試框架,讓您可以用 JavaScript 或 Solidity 撰寫自動化測試。在 `test` 目錄中建立一個名為 `voting_test.js` 的測試檔案:
“`javascript
const VotingDapp = artifacts.require(“VotingDapp”);
contract(“VotingDapp”, (accounts) => {
let votingInstance;
beforeEach(async () => {
votingInstance = await VotingDapp.new();
});
it(“應該成功建立投票”, async () => {
await votingInstance.createPoll(
“你最喜歡的顏色是什麼?”,
[“紅色”, “藍色”, “綠色”],
{ from: accounts[0] }
);
const pollCount = await votingInstance.pollCount();
assert.equal(pollCount, 1, “投票數應該為 1”);
const poll = await votingInstance.polls(0);
assert.equal(poll.question, “你最喜歡的顏色是什麼?”);
assert.equal(poll.creator, accounts[0]);
});
it(“應該允許對投票進行投票”, async () => {
await votingInstance.createPoll(
“測試投票”,
[“選項 A”, “選項 B”],
{ from: accounts[0] }
);
await votingInstance.vote(0, 0, { from: accounts[1] });
const votes = await votingInstance.getVotes(0, 0);
assert.equal(votes, 1, “選項 A 應該有 1 票”);
const hasVoted = await votingInstance.hasUserVoted(0, accounts[1]);
assert.equal(hasVoted, true, “使用者應該被標記為已投票”);
});
it(“應該防止重複投票”, async () => {
await votingInstance.createPoll(
“測試投票”,
[“選項 A”, “選項 B”],
{ from: accounts[0] }
);
await votingInstance.vote(0, 0, { from: accounts[1] });
try {
await votingInstance.vote(0, 1, { from: accounts[1] });
assert.fail(“應該拋出錯誤”);
} catch (error) {
assert.include(error.message, “already voted”);
}
});
it(“應該允許建立者關閉投票”, async () => {
await votingInstance.createPoll(
“測試投票”,
[“選項 A”, “選項 B”],
{ from: accounts[0] }
);
await votingInstance.closePoll(0, { from: accounts[0] });
const poll = await votingInstance.polls(0);
assert.equal(poll.active, false, “投票應該被關閉”);
});
});
“`
執行您的測試:
“`bash
truffle test
“`
Truffle 執行每個測試案例,部署新的合約實例以確保測試不會相互干擾。綠色勾號表示測試通過;紅色 X 突顯需要調查的失敗。目標是達到智能合約函數的 100% 測試覆蓋率——區塊鏈錯誤在部署後修復成本高昂,因為您無法簡單地更新程式碼。
除了單元測試,還要對前端進行整合測試。將合約部署到 Apothem 測試網,並手動測試完整的使用者流程:建立投票、投票、查看結果和處理錯誤情況。使用多個帳戶進行測試以模擬真實世界的使用模式。需要注意的常見問題包括:
- 由於 Gas 限制不足導致的交易失敗
- 多個使用者同時互動時的競態條件
- 由於時序問題導致的區塊鏈資料顯示不正確
- 不同瀏覽器和裝置上的錢包連線問題
使用瀏覽器開發者工具監控網路請求和控制台日誌。XDC 的快速區塊時間(2 秒)意味著您可以在測試期間快速迭代——無需在以太坊交易之間等待 15 秒。
部署到 XDC 網路
一旦測試確認您的 dApp 正常運作,就部署到 XDC 主網。首先,確保您的部署錢包有足夠的 XDC 來支付 Gas 費用。典型的合約部署成本為 0.01-0.05 XDC(截至 2026 年 7 月 2 日,約為 $0.0003-$0.0015),遠比以太坊數美元的部署成本便宜。
仔細檢查您的 `truffle-config.js` 設定是否包含主網網路設定以及您的生產錢包的助記詞。為了安全起見,使用專用的部署錢包而不是您的個人持有錢包。
部署到主網:
“`bash
truffle migrate –network xdc
“`
儲存已部署的合約地址——這是您的 dApp 的永久區塊鏈地址。與傳統伺服器不同,您可以將更新的程式碼重新部署到相同的 URL,區塊鏈合約一旦部署就是不可變的。如果您需要修復錯誤或新增功能,必須部署新合約並更新前端以指向新地址。
對於前端,使用主網合約地址更新您的 `app.js`,並確保 web3 提供者連接到主網 RPC 端點。將您的 HTML、CSS 和 JavaScript 檔案託管在網頁伺服器上,或使用像 IPFS 這樣的去中心化託管服務以實現真正的抗審查性。
設定您的網域的 DNS 以指向您的託管提供商。對於 IPFS 上的去中心化託管,使用 IPFS 閘道或設定解析到您的 IPFS 內容雜湊的 ENS(以太坊名稱服務)網域。XDC 也支援自己的命名服務用於區塊鏈原生網域名稱。
在公開宣布之前,徹底測試您的生產環境部署。驗證:
- 合約地址正確且可透過區塊瀏覽器存取
- 所有合約函數都能成功執行並支付真實的 XDC Gas 費用
- 前端正確顯示區塊鏈資料
- 錢包連線在主要瀏覽器上正常運作
- 交易確認在預期時間範圍內出現(4-6 秒)
透過區塊瀏覽器(如 explorer.xinfin.network)監控您的 dApp 使用情況。追蹤交易量、Gas 消耗和使用者互動,以識別最佳化機會和潛在問題。
建構第一個 dApp 後的下一步是什麼?
擴展您的 dApp
隨著您的 dApp 獲得使用者,您需要針對規模進行最佳化。首先在智能合約中實作高效的資料結構。不要儲存變得昂貴的大型陣列來迭代,而是使用具有單獨計數器的映射。考慮用於顯示大型資料集的分頁模式——一次載入 1,000 個投票會造成糟糕的使用者體驗並浪費 Gas。
在前端實作快取策略以減少區塊鏈查詢。將經常存取的資料儲存在瀏覽器 localStorage 或 IndexedDB 中,僅在區塊鏈事件指示變更時更新它。這種方法大幅提高了回應速度,同時減少了 RPC 節點的負載。
對於寫入密集型應用程式,盡可能將多個操作批次處理到單個交易中。XDC 的低 Gas 成本使得批次處理不如在以太坊上那麼關鍵,但它仍然透過減少使用者必須批准的錢包確認數量來改善使用者體驗。
對於極高吞吐量的使用案例,考慮實作第二層擴展解決方案或側鏈。雖然 XDC 的 2,000 TPS 可以舒適地處理大多數應用程式,但像遊戲或高頻交易這樣的專業應用程式可能會受益於額外的擴展層。
監控您的合約的 Gas 消耗模式。使用 Truffle 的 Gas 報告器來識別昂貴的函數:
“`bash
npm install –save-dev eth-gas-reporter
“`
新增到您的 `truffle-config.js`:
“`javascript
mocha: {
reporter: ‘eth-gas-reporter’,
reporterOptions: {
currency: ‘USD’,
gasPrice: 1
}
}
“`
現在執行測試會顯示每個函數的 Gas 成本,幫助您識別最佳化機會。
探索進階功能
一旦熟悉基本的 dApp 開發,就可以探索 XDC 的進階功能。代幣整合允許您的 dApp 遵循 XRC20 標準(XDC 的 ERC20 等效標準)建立和管理自訂代幣。這實現了忠誠度積分、治理代幣或代幣化資產等使用案例。
整合預言機(Oracles)以將真實世界資料帶到區塊鏈上。XDC 支援提供價格資訊、天氣資料、體育比分和其他外部資訊的預言機網路。這解鎖了預測市場、參數保險和由交付確認觸發的自動化供應鏈付款等應用程式。
實作跨鏈橋接以實現與其他區塊鏈的互通性。XDC 維護與以太坊的橋接,允許資產在網路之間移動。這擴大了您的 dApp 的潛在使用者群,並實現複雜的多鏈工作流程。
探索 XDC 的隱私功能,用於需要機密交易的企業應用程式。該網路支援私有子網,其中交易詳細資訊對公眾隱藏,同時保持區塊鏈安全保證。
透過官方論壇、Discord 頻道和開發者電話會議加入 XDC 開發者社群。XDC 基金會定期舉辦黑客松,並為有前景的專案提供資助。為開源 XDC 工具和函式庫做出貢獻可以建立您的聲譽,同時改善所有開發者的生態系統。
研究成功的 XDC dApp 以從真實世界的實作中學習。像 TradeFinex(貿易融資)、Blockdegree(教育憑證)和 Corda 整合(企業區塊鏈互通性)等專案展示了 XDC 在各行業的多功能性。
常見問題
在 XDC 網路上建構 dApp 需要多長時間?
對於具有基本區塊鏈知識的開發者來說,像本教學中的投票範例這樣的簡單 dApp 通常需要 8-12 小時,包括學習 XDC 特定工具、撰寫和測試智能合約、建構前端以及部署到測試網的時間。具有多個合約、廣泛測試和精美使用者介面的更複雜應用程式可能需要數週到數月。如果您已經有以太坊開發經驗,學習曲線會大幅縮短,因為 XDC 的以太坊相容性意味著您現有的 Solidity 知識可以直接轉移。
我可以使用哪些程式語言在 XDC 上建構 dApp?
XDC 支援 Solidity,這是在以太坊和 EVM 相容鏈中使用的主流智能合約語言,由於其廣泛的文件、工具和社群資源,使其成為大多數開發者的推薦選擇。Vyper 是一種類似 Python 的替代方案,專注於安全性和簡單性,也適用於 XDC,特別適合偏好明確而非隱式行為的開發者。對於前端開發,您可以使用任何與 Web3.js 或 Ethers.js 函式庫整合以進行區塊鏈互動的網頁技術(JavaScript、TypeScript、React、Vue、Angular)。
在 XDC 網路上部署 dApp 的相關成本是多少?
將智能合約部署到 XDC 主網通常成本為 0.01-0.05 XDC(截至 2026 年 7 月 2 日為 $0.0003-$0.0015),取決於合約複雜度和當前網路 Gas 價格。使用者與您的 dApp 互動的持續交易成本範圍為每筆交易 $0.00001 到 $0.0001,比以太坊在擁塞期間便宜約 1000 倍。如果您執行自己的 RPC 節點,預計每月伺服器託管費用為 $50-200,儘管許多開發者從免費的公共 RPC 端點開始。前端託管根據流量增加每月 $5-50,或者如果使用像 IPFS 這樣的去中心化託管則為零成本。
我需要先前的區塊鏈經驗才能建構 dApp 嗎?
本教學專為具有基本程式設計知識但沒有區塊鏈經驗的開發者設計,提供從環境設定到部署的逐步說明。然而,熟悉 JavaScript 會大幅加速學習,因為智能合約開發和前端整合都嚴重依賴基於 JavaScript 的工具。如果您完全不熟悉程式設計,請考慮在深入區塊鏈開發之前完成基本的 JavaScript 課程。狀態管理、非同步程式設計和 API 整合的概念直接從傳統網頁開發轉移到 dApp 建構。
我在哪裡可以找到 XDC dApp 開發的額外資源?
XDC 開發者入口網站上的官方 XDC 開發者文件提供全面的指南、API 參考和範例程式碼。XDC 社群論壇舉辦討論,經驗豐富的開發者在其中回答問題並分享常見挑戰的解決方案。XinFinOrg 組織下的 GitHub 儲存庫包含您可以研究和分叉的開源工具、函式庫和範例 dApp。如需即時幫助,請加入 XDC Discord 伺服器的開發者頻道,核心團隊成員和社群開發者在那裡提供支援。XDC 基金會還定期發布涵蓋新功能、最佳實踐和生態系統更新的部落格文章。
風險免責聲明:加密貨幣價格波動劇烈。截至 2026 年 7 月 2 日引用的 XDC 網路價格 $0.0282 和市場資料可能會大幅變化。智能合約開發存在風險,包括可能導致資金損失的潛在錯誤。在主網部署之前,請務必在測試網上徹底測試合約。本文僅供教育目的,不構成財務、投資或專業開發建議。在您自己的環境中驗證所有程式碼範例,並且在未經專業安全稽核的情況下,切勿部署處理重大價值的合約。在投資加密貨幣或部署區塊鏈應用程式之前,請務必自行研究。


