当前位置: 首页 > news >正文

Solidity 开发入门:编写一个“去中心化投票系统”,部署在以太坊测试网

标签:#Web3 #Solidity #Ethereum #SmartContract #Remix #DApp


🌐 前言:DApp 的架构逻辑

在 Web2 中,我们请求的是中心化服务器;在 Web3 中,我们直接与区块链上的智能合约交互。

交互流程图 (Mermaid):

1. 发起投票 (签名交易)
2. 广播交易
3. 打包进区块
4. 执行逻辑
5. 修改状态

用户/选民

MetaMask 钱包

以太坊节点 (RPC)

以太坊网络 (Sepolia)

智能合约 (EVM)

链上存储 (State)


🛠️ 一、 准备工作

  1. 浏览器插件钱包:安装MetaMask
  2. 测试代币 (Gas):你的代码上链需要消耗 Gas。去 “Sepolia Faucet”(如 Google 搜索Sepolia ETH faucet)领取免费的测试币。
  3. 开发工具:打开Remix IDE(remix.ethereum.org)。这是官方推荐的在线编辑器,开箱即用。

💻 二、 编写智能合约 (Smart Contract)

在 Remix 的contracts目录下新建文件Voting.sol

这个合约需要实现三个核心功能:

  1. 初始化候选人:在部署时确定谁可以被投票。
  2. 投票:每个地址只能投一次,防止刷票。
  3. 查询结果:查看候选人的得票数。
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract Voting { // 1. 定义数据结构 struct Candidate { string name; // 名字 uint256 voteCount; // 得票数 } // 2. 状态变量 (存储在链上) Candidate[] public candidates; // 候选人列表 mapping(address => bool) public hasVoted; // 记录谁投过票 (防刷票) // 3. 事件 (方便前端监听) event Voted(address indexed voter, uint256 candidateIndex); // 4. 构造函数 (仅在部署时执行一次) // 传入候选人名字列表,例如 ["Alice", "Bob"] constructor(string[] memory _candidateNames) { for (uint256 i = 0; i < _candidateNames.length; i++) { candidates.push(Candidate({ name: _candidateNames[i], voteCount: 0 })); } } // 5. 核心功能:投票 function vote(uint256 _candidateIndex) public { // 检查:确保没投过票 require(!hasVoted[msg.sender], "You have already voted."); // 检查:确保投给有效的候选人 require(_candidateIndex < candidates.length, "Invalid candidate index."); // 执行:记录该地址已投票 hasVoted[msg.sender] = true; // 执行:票数 +1 candidates[_candidateIndex].voteCount += 1; // 触发事件 emit Voted(msg.sender, _candidateIndex); } // 6. 辅助功能:获取候选人总数 function getCandidatesCount() public view returns (uint256) { return candidates.length; } // 7. 辅助功能:获取所有候选人信息 (方便前端读取) function getAllCandidates() public view returns (Candidate[] memory) { return candidates; } }

🚀 三、 编译与部署

1. 编译 (Compile)
  • 点击 Remix 左侧的“Solidity Compiler”图标。
  • 点击“Compile Voting.sol”。如果没有红色的 Error,说明语法正确。
2. 部署 (Deploy)

这是最激动人心的一步,我们将代码写入全球分布的以太坊网络中。

  • 点击左侧的“Deploy & Run Transactions”图标。

  • Environment选择“Injected Provider - MetaMask”

  • 此时 MetaMask 会弹出,请求连接,请确认你的网络已切换到 Sepolia。

  • Deploy栏目下,点击Deploy按钮旁边的箭头展开参数输入框。

  • _candidateNames: 输入候选人数组,例如:["Alice", "Bob", "Charlie"](注意是英文双引号)。

  • 点击“transact”(或 Deploy)。

  • MetaMask 会弹出交易确认框,显示预估的 Gas 费。点击“Confirm”

等待几十秒,控制台显示绿色的勾 ✅,说明部署成功!


🖱️ 四、 交互测试

在左侧下方的“Deployed Contracts”区域,你会看到刚部署的合约。展开它,你就可以直接调用合约函数了。

  1. 查看候选人
  • 点击candidates按钮,输入0,可以看到Alice的信息和voteCount(初始为 0)。
  1. 进行投票
  • 找到vote函数(橙色按钮,表示需要消耗 Gas 写数据)。
  • 输入0(投给 Alice)。
  • 点击transact,在 MetaMask 中确认交易。
  1. 验证结果
  • 再次查询candidates(索引 0),你会发现voteCount变成了1
  1. 防刷票测试
  • 再次点击vote(输入 0 或 1)。
  • 你会发现 Remix 控制台报错:"You have already voted."。这就是代码中require语句在起作用,EVM 拒绝了这笔非法交易。

🧠 五、 原理深度解析

为什么这很酷?

  • 无服务器:你没有租用阿里云或 AWS,代码却跑在世界各地的节点上。
  • 不可篡改:除非你掌握了全网 51% 的算力,否则没人能把 Alice 的那一票改成 Bob。
  • 透明性:你可以把合约地址发给朋友,他们可以在 Etherscan 上看到每一笔投票交易的哈希值。

🎯 总结

通过不到 50 行代码,我们构建了一个最基础的DAO (去中心化自治组织)雏形。
虽然这个系统还很简陋(比如任何人都能投票,没有白名单限制),但它展示了区块链技术的核心魅力:信任的机器化

Next Step:
现在的界面是 Remix 自带的,很丑。
尝试使用React + ethers.js,编写一个精美的 Web 前端,通过 MetaMask 连接你刚刚部署的合约,让普通用户也能通过点击网页按钮来参与投票!这将是你迈向全栈 Web3 开发者的第一步。

http://www.cnnetsun.cn/news/670272.html

相关文章:

  • AI原生应用新革命:RAG技术带来的3大变革
  • 11.3 可靠性工程与测试验证:构建可信赖的机器人系统
  • 【独家创新】基于ASL-QPSO-LSTM-AdaBoost的时间序列预测模型研究附Matlab代码
  • 基于Java的家庭计划生育技术智慧管理系统的设计与实现全方位解析:附毕设论文+源代码
  • 基于Java的家政客户服务智慧管理系统的设计与实现全方位解析:附毕设论文+源代码
  • 有趣的区间【牛客tracker 每日一题】
  • 上海哪些海洋公园可以触摸海洋动物
  • 救命神器9个一键生成论文工具,自考学生轻松搞定毕业论文!
  • 提示工程架构师揭秘:Agent交互提示链设计的内幕
  • 交通仿真软件:VISSIM_(8).行人与自行车仿真
  • 交通仿真软件:VISSIM_(12).VISSIM与其他软件的接口与数据交换
  • 基于深度学习的手势识别检测系统(YOLOv8+YOLO数据集+UI界面+Python项目+模型)
  • 震惊!浙江这家AI科技头部公司光景泽创,究竟有何过人之处?
  • [C++][cmake]基于C++在windows上onnxruntime+opencv部署yolo26-pose的姿态估计关键点检测onnx模型
  • 学长亲荐2026TOP10AI论文平台:本科生毕业论文必备测评
  • 鸿蒙6访问内网域名异常排查
  • 双碳目标下的 “绿色算力”—— 云服务器如何实现节能与性能双赢​
  • 猫狗识别人工智能代码基于深度学习的猫狗识别系统完整源码+数据集+项目报告(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • 基于逻辑回归模型的贷款违约预测(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • 告别查重焦虑,重塑学术尊严
  • 一键生成专业文献综述
  • 百考通AI任务书功能:精准适配专业要求,智能生成规范、实用、个性化的毕业设计任务书
  • 基于 OpenAPI 规范生成亚马逊广告(Amazon Ads)Java SDK
  • 基于Vue的二手图书交易系统的设计与实现m7za7(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
  • 品牌出海哪一家好?解析Dynabridge品牌出海咨询的“实战派”打法
  • ssm432校园办公室报修管理系统
  • 数据结构:队列
  • 【Java毕设全套源码+文档】基于springboot的健康医疗体检管理系统设计与实现(丰富项目+远程调试+讲解+定制)
  • 【Linux】Docker容器中快速部署VNC远程桌面环境
  • 完整的PID和LQR四旋翼无人机simulink,matlab仿真,两个slx文件一个m文件...