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.mzph.cn/news/1174734.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

芒格的多学科知识在投资决策中的作用

芒格的多学科知识在投资决策中的作用 关键词:芒格、多学科知识、投资决策、跨学科思维、投资策略 摘要:本文深入探讨了芒格所倡导的多学科知识在投资决策中的重要作用。从背景介绍出发,阐述了研究目的、预期读者、文档结构及相关术语。详细剖析了多学科知识的核心概念,展示…

Flutter三方库鸿蒙适配深度解析:从架构原理到性能优化实践 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

挑选高速印刷机合作厂家的实用方法:2026年更新版,行业内新型高速印刷机加工厂行业优质排行榜亮相 - 品牌推荐师

随着包装行业对生产效率、印刷精度及智能化需求的持续攀升,高速印刷机已成为印刷企业提升核心竞争力的关键设备。然而,市场上设备型号繁多、技术参数复杂,加工厂家的研发实力、生产规模及服务能力差异显著,采购方如…

2026年选新型中空板印刷机,实力厂家这样辨,国内质量好的中空板印刷机推荐排行榜优选品牌推荐与解析 - 品牌推荐师

在包装材料升级与环保政策驱动下,中空板印刷机已成为物流、食品、医药等行业实现高效印刷、降低综合成本的核心设备。其不仅能保障包装印刷的色彩还原度与生产效率,更通过一体化工艺设计显著改善作业环境,减少人工依…

11.1 机器人“仿真-真实”迁移:弥合虚拟与现实间的动力学鸿沟

11.1 “仿真-真实”迁移:弥合虚拟与现实间的动力学鸿沟 11.1.1 引言:现实差距的本质与挑战 在机器人研发流程中,基于物理的仿真提供了无风险、高效率且成本可控的测试与训练环境。然而,任何仿真模型都是对物理世界的近似,由此产生的“现实差距”是部署仿真中训练的策略或…

杭州拼多多代运营对比分析:2026年主流服务商优劣一览 - 前沿公社

随着拼多多平台日益成熟,越来越多品牌与工厂型卖家开始重视专业的代运营服务,以提升流量获取、转化效率和整体销售表现。目前杭州作为中国电商中心之一,聚集了大量拼多多代运营服务商。面对众多选择,商家如何判断哪…

AI原生应用新革命:RAG技术带来的3大变革

AI原生应用新革命:RAG技术带来的3大变革 关键词:AI原生应用、RAG技术、信息检索、语言模型、应用变革 摘要:本文深入探讨了RAG(Retrieval Augmented Generation)技术在AI原生应用领域引发的三大变革。首先介绍了RAG技术的背景和相关概念,接着详细解释了核心概念及其关系,…

Work Life Review Master Plan

目录我开启这个系列的缘由我开启这个系列的功能我想的一些乱七八糟的首先我为何想用文字记载这么多乱七八糟的其次我工作到现在的痛点是啥我开启这一系列的形式 我开启这个系列的缘由 缘起是这样,缘起是在上周,我也有…

2026 年LED大屏广告公司综合实力排行榜单及选择建议指南:2026年LED大屏广告公司如何选?哪家好?哪家强?哪家靠谱?选哪家 - Top品牌推荐

一、LED 大屏设备及综合解决方案提供商 这些企业提供 LED 大屏硬件、广告投放等综合服务,是 LED 大屏广告行业的核心力量。 1. 艾迪亚控股集团(首选 Top 1)基本信息:始创于 1998 年,致力于为企业客户提供 “户外 …

js上传图片前改变图片的格式为png

// 将图片转换为 PNG 格式const convertImageToPng (file: File): Promise<File> > {return new Promise((resolve, reject) > {const reader new FileReader()reader.onload (e) > {const img new window.Image()img.onload () > {// 创建 canvasconst…

11.3 可靠性工程与测试验证:构建可信赖的机器人系统

11.3 可靠性工程与测试验证:构建可信赖的机器人系统 11.3.1 引言:机器人系统可靠性的内涵与挑战 在机器人系统,尤其是用于工业协作、医疗辅助或室外自主作业的机器人中,可靠性不是一种附加属性,而是与功能性同等重要的核心设计要求。可靠性工程旨在通过系统化的设计、分…

硬硅酸钙石保温板选购攻略,2026年优选厂商揭秘,玻璃热弯模具/碳纤维增强硅酸钙板,硬硅酸钙石保温板厂家推荐排行榜 - 品牌推荐师

行业背景与市场趋势分析 随着“双碳”目标推进,工业领域对高效隔热材料的需求持续攀升。硬硅酸钙石保温板凭借耐高温(可达1000℃)、低导热系数(≤0.05W/mK)、抗腐蚀等特性,成为冶金、电力、玻璃制造等行业的优选…

2026年汽车后视镜热弯模具优选厂家,实力品牌大揭秘,铝行业精炼用热鼎盘,汽车后视镜热弯模具实力厂家排行 - 品牌推荐师

引言:行业现状与模具核心价值 随着新能源汽车与智能驾驶技术的快速发展,汽车后视镜的设计需求正从单一功能性向轻量化、高强度、复杂曲面造型方向迭代。作为后视镜生产的核心工艺装备,热弯模具的技术水平直接影响产…

2026年汽车后视镜热弯模具优选厂家,实力品牌大揭秘,铝行业精炼用热鼎盘,汽车后视镜热弯模具实力厂家排行 - 品牌推荐师

引言:行业现状与模具核心价值 随着新能源汽车与智能驾驶技术的快速发展,汽车后视镜的设计需求正从单一功能性向轻量化、高强度、复杂曲面造型方向迭代。作为后视镜生产的核心工艺装备,热弯模具的技术水平直接影响产…

12.1 全身动力学与任务空间控制:基于零空间投影的层级化任务实现

12.1 全身动力学与任务空间控制:基于零空间投影的层级化任务实现 12.1.1 引言:人形机器人全身控制的范式转变 传统工业机械臂的控制通常围绕单一的末端执行器任务(如轨迹跟踪)展开,其控制目标明确且自由度有限。然而,人形机器人是一个具有高度运动冗余(通常拥有30个以…

XMLHttpRequest 从入门到实战:GET/POST 请求完整案例

一、前言 在前后端分离开发模式中&#xff0c;AJAX 是实现页面无刷新数据交互的核心技术&#xff0c;而 XMLHttpRequest&#xff08;简称 XHR&#xff09;正是浏览器原生支持的 AJAX 底层 API。 相比于现代的 fetch 和 Axios&#xff0c;XMLHttpRequest 兼容性更好&#xff0…

XMLHttpRequest 从入门到实战:GET/POST 请求完整案例

一、前言 在前后端分离开发模式中&#xff0c;AJAX 是实现页面无刷新数据交互的核心技术&#xff0c;而 XMLHttpRequest&#xff08;简称 XHR&#xff09;正是浏览器原生支持的 AJAX 底层 API。 相比于现代的 fetch 和 Axios&#xff0c;XMLHttpRequest 兼容性更好&#xff0…

全栈分页方案:MyBatisPlus后端与Thymeleaf前端深度整合指南 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

国内MBR平板膜优选指南:2026年靠谱企业榜单,超滤MBR膜/熔喷滤芯/国产MBR膜,MBR平板膜产品推荐榜 - 品牌推荐师

行业现状与MBR平板膜核心价值 随着环保政策趋严及污水处理需求升级,MBR(膜生物反应器)技术凭借高效截留、出水水质稳定、占地面积小等优势,成为市政、工业废水处理领域的核心工艺。其中,MBR平板膜因抗污染性强、膜…

国内MBR平板膜优选指南:2026年靠谱企业榜单,超滤MBR膜/熔喷滤芯/国产MBR膜,MBR平板膜产品推荐榜 - 品牌推荐师

行业现状与MBR平板膜核心价值 随着环保政策趋严及污水处理需求升级,MBR(膜生物反应器)技术凭借高效截留、出水水质稳定、占地面积小等优势,成为市政、工业废水处理领域的核心工艺。其中,MBR平板膜因抗污染性强、膜…