Skip to main content
LIVE
BTC $—| ETH $—| BNB $—| SOL $—| XRP $— · · · BITAIGEN · · · | | | | · · · BITAIGEN · · ·
Next.js + Solidity + Ethers.js 实战:2024 区块链投票 DApp 全流程教程

Next.js + Solidity + Ethers.js 实战:2024 区块链投票 DApp 全流程教程

Bitaigen Research Bitaigen Research 9 分钟阅读

本文详细介绍了2024年使用 Next.js、Solidity 与 Ethers.js 开发并部署区块链投票 DApp 的完整步骤。涵盖合约编写、Hardhat 编译测试、Next.js 前端渲染、钱包连接及链上部署等全栈实战,帮助 Web3 开发者快速提升全链路开发能力,并展望该技术栈在去中心化治理中的未来应用。

Title: 使用Next.js、Solidity和Ethers.js创建并部署区块链投票DApp(2024)

在 Web3 开发者的学习路径中,投票 DApp 是检验全栈能力的经典案例。2024 年,随着 Next.js、Solidity 与 Ethers.js 的生态日趋成熟,开发者可以在同一项目中完成合约编写、前端交互以及链上部署。本文基于 Daulat Hussain 在 YouTube 上的完整教学视频,梳理项目全流程,分析其对开发者技能提升的实际影响,并展望该技术栈在未来去中心化治理场景中的可能演进。

项目全流程回顾

1. 技术栈概览

  • Solidity:用于在以太坊虚拟机(EVM)上编写投票智能合约。
  • Hardhat:以太坊本地开发环境,负责合约编译、测试、部署。
  • Next.js:React 框架的服务端渲染版本,提供响应式 UI 与 SEO 友好的页面。
  • Ethers.js:轻量级 JavaScript 库,桥接前端与区块链,处理钱包连接、签名交易和事件监听。

这四者的组合实现了“前端‑合约‑链”一体化开发,能够在本地快速迭代,也便于后续迁移至测试网或主网。

2. 核心开发步骤

2.1 编写投票合约(Solidity)

合约核心功能包括候选人管理、投票防重复以及结果查询。关键结构如下:

```solidity

struct Candidate {

uint id;

string name;

uint voteCount;

}

mapping(address => bool) public voters; // 记录是否已投票

```

主要方法:

  1. addCandidate(string memory _name) – 仅合约部署者(管理员)可调用,用于添加候选人。
  2. vote(uint _candidateId) – 检查 voters[msg.sender],防止重复投票;成功后增加对应候选人的 voteCount
  3. getCandidates()view 函数,返回所有候选人信息,供前端读取。

2.2 搭建 Hardhat 环境

  1. 初始化项目:npx hardhat,选择“Create a basic sample project”。
  2. hardhat.config.js 中配置本地区块链或 Sepolia 测试网的 RPC。
  3. 编写部署脚本 scripts/deploy.js,示例代码:

```js

async function main() {

const Voting = await ethers.getContractFactory("Voting");

const voting = await Voting.deploy();

await voting.deployed();

console.log("Voting deployed to:", voting.address);

}

main();

```

  1. 本地测试:npx hardhat node 启动本地私链,随后 npx hardhat run scripts/deploy.js --network localhost 完成部署。

2.3 前端集成(Next.js + Ethers.js)

  1. 创建页面:在 pages/index.js 中使用 React 组件展示候选人列表和投票按钮。
  2. 连接钱包:利用 Ethers.js 检测 MetaMask 并请求授权:

```js

if (typeof window.ethereum !== "undefined") {

const provider = new ethers.providers.Web3Provider(window.ethereum);

await provider.send("eth_requestAccounts", []);

}

```

  1. 获取合约实例:通过 ABI 与部署地址创建合约对象:

```js

const contract = new ethers.Contract(

"0xYourContractAddress",

votingAbi,

provider.getSigner()

);

```

  1. 读取数据:调用 contract.getCandidates() 并在页面上渲染。
  2. 写入数据:点击投票按钮时执行 contract.vote(candidateId),触发 MetaMask 签名交易。

2.4 实时更新与权限控制

  • 事件监听:Ethers.js 支持 contract.on("Voted", (voter, candidateId) => {...}),前端可在有人投票后自动刷新票数。
  • 管理员权限:在合约构造函数中记录 owner = msg.sender,并在 addCandidate 前加 require(msg.sender == owner, "Only owner"),实现候选人只能由部署者添加的限制。

3. 部署与测试

  • 本地快速验证:使用 Hardhat 本地区块链进行完整的增删改查测试。
  • 测试网部署:将 hardhat.config.js 中的网络切换至 Sepolia,使用 npx hardhat run scripts/deploy.js --network sepolia 将合约发布至公开测试网。
  • 前端构建npm run build && npm start 将 Next.js 项目部署至 Vercel 或其他支持 Node.js 的平台,实现真正的去中心化投票界面。

影响分析

1. 对开发者技能的提升

维度  |  具体收益

合约安全  |  实践防止重复投票、权限控制的常见模式,提升 Solidity 编码规范意识。

开发效率  |  Hardhat 的热重载、自动化测试框架让迭代周期从天级缩短至小时级。

前端交互  |  Ethers.js 的事件监听让 UI 与链上状态保持实时同步,培养对异步链上调用的调试能力。

全栈思维  |  Next.js 的 SSR 能力帮助开发者理解前端渲染与区块链读取的协同方式。

2. 对区块链治理场景的启示

投票 DApp 体现了去中心化决策的基本模型:身份(地址)对应投票权、链上状态不可篡改、结果公开透明。虽然本项目仍基于公链的 Gas 成本,但在企业内部链或 Layer‑2 方案上,类似结构可以直接迁移,用于 DAO 提案、社区治理或公司股东表决。

未来展望

  1. Layer‑2 与 zk‑Rollup:随着以太坊扩容,投票合约可迁移至 Arbitrum、Optimism 或 zkSync,显著降低 Gas 费用,提升用户体验。
  2. 链上身份验证:结合 ENS、World ID 等去中心化身份协议,实现“一人一票”而非“一地址一票”的更公平治理。
  3. 跨链投票:利用 Wormhole、LayerZero 等跨链桥,实现多链社区的统一投票,提升治理的协同效率。
  4. 前端 UI/UX 进化:结合 React Server Components 与 Tailwind CSS,打造更轻量、响应式的投票仪表盘,并通过 WebSocket 或 GraphQL 实时推送链上事件。

常见问题

Q1: 项目中 Hardhat 与 Remix 有何区别,哪个更适合初学者?

Hardhat 提供本地私链、脚本化部署和插件体系,适合需要完整 CI/CD 流程的全栈开发;而 Remix 是浏览器端的可视化 IDE,入门门槛更低但缺乏自动化测试和前端集成能力。建议先用 Remix 熟悉 Solidity 基础,再转向 Hardhat 完成全栈项目。

Q2: 如何在生产环境中防止投票合约被恶意调用?

可以在合约中加入以下防护措施:

  • 使用 modifier onlyOwner 限制关键函数(如添加候选人)只能由部署者调用。
  • vote 加入 require(!voters[msg.sender], "Already voted") 防止重复投票。
  • 部署后通过 Etherscan 验证源码,提升透明度。

Q3: 项目部署到测试网后,如何查看合约执行的交易费用?

使用 etherscan.io(对应测试网的 explorer)搜索合约地址,进入 “Transactions” 标签即可查看每笔调用的 Gas 使用量和费用。也可以在 Hardhat 脚本中通过 tx.wait() 返回的 receipt 获取 gasUsed,自行计算费用。

小结

通过本教程,开发者完成了从 Solidity 编写投票合约、Hardhat 本地部署,到 Next.js 前端页面与 Ethers.js 交互的全链路实践。项目不仅锻炼了智能合约安全编程、链上事件监听以及服务器渲染的综合能力,还为后续在 DAO、企业治理等去中心化决策场景的落地奠定了技术基础。随着 Layer‑2 与跨链技术的成熟,基于同一技术栈的投票 DApp 将在成本、性能和用户体验上获得更大突破,值得持续关注与迭代。

推荐交易平台

如果你正在寻找安全可靠的交易所,可以考虑:

  • 币安(Binance:全球最大加密货币交易所,支持350+交易对。 立即注册,使用邀请码 B2345 享受手续费优惠
  • OKX:专业衍生品交易平台,Web3钱包一站式体验。 立即注册,使用邀请码 B2345 获取新手福利
注册币安,享最高手续费折扣邀请码 B2345 · 现货手续费低至 0.075%

原文来源: Daulat Hussain

Bitaigen Research
关于作者
Bitaigen Research

Bitaigen 编辑团队专注于区块链资讯、市场分析与交易所教程。

加入 Telegram 社区 讨论本文
Telegram →

订阅 Bitaigen 快报

每周精选加密货币资讯、BTC 行情分析直达您的邮箱

🔒 我们重视您的隐私,绝不发送垃圾邮件

⚠️ 风险提示:加密货币价格波动极大,本文不构成任何投资建议,请理性投资,风险自担。