【Solidity】第9章第1回:簡単な投票システムの作成

本記事では、Solidityを用いて簡単な投票システムを構築する方法を解説します。スマートコントラクトを活用することで、改ざん耐性があり透明性の高い投票を実現できます。
0. 記事の概要
この記事を読むメリット
- 透明性のある投票システムを構築: ブロックチェーンを活用した公正な投票方法を学べます。
- Solidityの実践スキル向上: スマートコントラクトの実装を通じて、実用的な知識を習得できます。
- エラーハンドリングの強化: 投票システムにおける不正対策を学びます。
この記事で学べること
- Solidityを使った投票システムの基本構造
- 投票データの管理と集計方法
- セキュリティ対策を施した投票システムの実装
1. Solidityでの投票システムの概要

1.1 投票システムの基本概念
投票システムは、以下の主要な要素で構成されます:
- 候補者: 投票の対象となる人や選択肢。
- 有権者: 投票を行うユーザー。
- 投票の記録: 各有権者の投票内容をブロックチェーン上に記録。
- 結果の集計: すべての投票が終了後、自動的に結果を計算。
2. Solidityでの投票システムの実装
2.1 投票コントラクトの基本構造
// シンプルな投票システム
pragma solidity ^0.8.0;
contract Voting {
struct Candidate {
string name;
uint256 voteCount;
}
mapping(address => bool) public voters;
Candidate[] public candidates;
function addCandidate(string memory _name) public {
candidates.push(Candidate(_name, 0));
}
function vote(uint256 candidateIndex) public {
require(!voters[msg.sender], "You have already voted");
require(candidateIndex < candidates.length, "Invalid candidate");
voters[msg.sender] = true;
candidates[candidateIndex].voteCount++;
}
}
動作解説
- 候補者の登録:
addCandidate()
を使って候補者を追加できます。 - 投票の実行:
vote()
を呼び出し、選択した候補者に投票します。 - 二重投票の防止:
voters
マッピングを利用し、同じアドレスからの複数投票を防ぎます。
2.2 投票データの管理
投票データは、スマートコントラクト内で struct
と mapping
を使用して管理されます。
3. セキュリティと拡張性
3.1 投票の透明性と不正防止
投票の公平性を保つため、以下のセキュリティ対策が必要です:
- アクセス制御: 候補者の追加や投票の管理を特定のアドレスのみが行えるようにする。
- 二重投票の防止: 投票者の記録を適切に管理し、同一アカウントからの重複投票を阻止。
- 投票結果の検証: 透明性を確保するために、投票結果を公開し、誰でも検証可能にする。
4. 練習問題
以下の課題に挑戦し、投票システムの理解を深めましょう:
- 投票の受付期間を設定し、期限後の投票を無効にする機能を追加してください。
- 管理者のみが候補者を追加できるようにアクセス制御を実装してください。
- 投票結果を取得する関数を追加し、リアルタイムで確認できるようにしてください。
5. まとめ
本記事では、Solidityを用いたシンプルな投票システムの設計と実装について解説しました。適切なセキュリティ対策を施すことで、安全かつ公正な投票が可能になります。実際にコードを書きながら、理解を深めてみてください。