本报告详细记录了一个小型区块链应用的实验过程,旨在探索区块链技术在解决特定实际问题中的可行性与优势,实验内容为设计并实现一个基于以太坊区块链的去中心化投票系统,报告涵盖了实验背景、目标、技术选型、系统设计、实现步骤、测试结果、遇到的问题与解决方案,以及对实验的总结与展望,通过本次实验,我们深入理解了智能合约的编写与部署流程,体验了区块链应用的构建方法,并对区块链的去中心化、透明性和不可篡改性等特性有了直观的认识。
实验背景与目标
1 实验背景 随着区块链技术的快速发展,其去中心化、数据不可篡改、透明可追溯等特性使其在金融、供应链、物联网、版权保护等多个领域展现出巨大潜力,对于初学者而言,区块链技术仍存在一定的入门门槛,为了更好地理解和掌握区块链技术的核心原理与应用开发方法,我们决定进行一个小型区块链应用实验。
2 实验目标
技术选型与工具
系统设计
1 需求分析 本去中心化投票系统主要需求如下:
2 智能合约设计
我们将核心逻辑封装在一个名为 VotingSystem 的智能合约中,合约主要功能模块及状态变量设计如下:
状态变量:
votingOwner: address - 记录投票合约的部署者/发起人。votings: mapping(uint256 => Voting) - 存储所有投票信息的映射,键为投票ID,值为投票结构体。votingCount: uint25
voters: mapping(uint256 => mapping(address => bool)) - 记录每个投票中哪些用户已经投过票,防止重复投票。投票结构体 (Voting):
title: string - 投票标题。description: string - 投票描述。options: string[] - 投票选项数组。votesCount: uint256[] - 每个选项对应的得票数数组。deadline: uint256 - 投票截止时间戳。isFinished: bool - 投票是否已结束。事件 (Events):
VotingCreated(uint256 votingId, string title, address creator) - 投票创建事件。Voted(uint256 votingId, address voter, uint256 optionIndex) - 投票事件。核心函数:
constructor() - 合约构造函数,初始化 votingOwner。createVoting(string memory _title, string memory _description, string[] memory _options, uint256 _deadline) - 由 votingOwner 调用,创建新投票。vote(uint256 _votingId, uint256 _optionIndex) - 由用户调用,对指定投票的指定选项进行投票。getVoting(uint256 _votingId) - 查询指定投票的详细信息。getVotingsCount() - 获取已创建投票的总数。finishVoting(uint256 _votingId) - (可选)由 votingOwner 或合约逻辑在截止后自动标记投票结束,本实验中采用在vote函数中自动判断截止时间。实现步骤
环境搭建:
智能合约编写:
.sol文件(如VotingSystem.sol)。VotingSystem智能合约的代码,注意处理边界条件,如投票选项索引越界、重复投票、投票已截止等。编译合约:
在Remix IDE的“Compile”标签页,选择合适的Solidity编译版本(如0.8.7),点击“Compile VotingSystem.sol”按钮,确保编译无错误。
部署合约:
测试合约功能:
createVoting函数,输入投票标题、描述、选项数组(如["选项A", "选项B"])和截止时间(当前时间戳+一定秒数)。vote函数,输入投票ID和选项索引。getVoting函数,输入投票ID,查看返回的投票信息,包括标题、选项、得票数等。测试结果与分析
经过上述步骤,我们成功部署并测试了去中心化投票系统。
遇到的问题与解决方案