【ITニュース解説】How I Built a Blockchain Voting System (And What I Learned in 4 Days)
2025年09月22日に「Dev.to」が公開したITニュース「How I Built a Blockchain Voting System (And What I Learned in 4 Days)」について初心者にもわかりやすく解説しています。
ITニュース概要
ブロックチェーンで透明性・耐改ざん性のある投票システムが構築された。スマートコントラクトで投票を記録し、二重投票を防ぐ。登録は管理者が行い、投票はブロックチェーンで安全に管理する半分散型アーキテクチャを採用。SolidityやDjangoを用いて開発し、新言語習得やスケーラビリティなどの課題も解説している。
ITニュース解説
このニュース記事は、ブロックチェーン技術を活用して安全で透明性の高い投票システムを構築した経験について解説している。著者は、電子投票システムの課題に関する動画を見て、「分散型技術がこれらの問題を解決できるのではないか」という着想を得て、最終学年のプロジェクトとしてこのシステムを開発した。その目的は、スマートコントラクトを利用することで、投票の透明性を確保し、改ざんを不可能にし、投票結果を誰でも検証できるシステムを構築することにあった。
この解説では、開発者の視点から、システムの全体構造、スマートコントラクトの具体的な設計、そしてユーザーが操作するインターフェース(フロントエンド)がブロックチェーンとどのように連携するのかが詳しく述べられている。プログラミング言語特有の専門用語は使われておらず、システムエンジニアを目指す初心者にも理解しやすいように配慮されている。
この投票システムが解決しようとした主な課題は二つあった。一つは、技術的な知識がない有権者でも迷わずに使えるような「シンプルさ」を実現すること。もう一つは、投票データの「セキュリティ」と「透明性」を確実にすることである。これらの目標を達成するため、投票インターフェースは極めて直感的に操作できるように設計され、投票データはブロックチェーンに記録することで高い安全性を確保し、さらに投票結果をリアルタイムで表示することで透明性を保証した。
システムの全体構造には「半分散型」というアプローチが採用されている。これは、すべての機能を完全に分散させるのではなく、有権者登録といった一部の重要なプロセスは、選挙管理委員会のような信頼できる中央機関が行い、その後、有権者にログイン情報を提供する形式である。このモデルにより、分散型の利点を活用しつつ、実運用における有権者管理の信頼性と効率性を両立させている。
この投票システムは、主に三つの主要な要素で構成されている。一つ目は「スマートコントラクト」である。これはブロックチェーン上にプログラムとして配置され、候補者情報の管理、投票記録の正確な保存、そして同じ有権者による二重投票のような不正行為の防止といった、システムの中核を担う役割を果たす。このコントラクトはSolidityというプログラミング言語で記述された。二つ目は「フロントエンドインターフェース」で、これは有権者が実際に目にするウェブページのことだ。有権者はこのページを通じて自身のデジタルウォレットを接続し、候補者を確認し、投票を行う。三つ目は「バックエンド/インデクサー」である。これはブロックチェーン上で発生するあらゆるイベント(出来事)を継続的に監視し、その情報をデータベースに保存する役割を持つ。この機能により、投票結果をブロックチェーンに直接問い合わせるよりもはるかに高速かつ効率的にフロントエンドに表示することが可能になる。
これら三つの要素は密接に連携しながら機能する。まず、有権者がフロントエンドから希望する候補者を選び、投票を送信すると、その投票操作は有権者のデジタルウォレットによって暗号的に署名された「トランザクション(取引)」としてブロックチェーンに送られる。このトランザクションを受け取ったスマートコントラクトは、その投票が正当なものであるかを検証し、承認された投票記録をブロックチェーン上に恒久的に保存する。投票結果は、スマートコントラクトから直接データを取得することも可能だが、通常はバックエンド/インデクサーがデータベースに保存した情報を通じて、より迅速かつ効率的にフロントエンドに表示される。
著者は、システム全体のセキュリティと透明性を最大限に確保するため、投票ロジックのほとんどをスマートコントラクト(ブロックチェーン上)に配置した。一度ブロックチェーンに記録されたデータは改ざんが極めて困難であるため、高い安全性を実現できるというメリットがある。しかし、ブロックチェーン上のデータは原則として誰でも閲覧可能であるという特性も持つ。今回のプロジェクトでは、システムの改ざん耐性と検証可能性を証明することが主な目的であったため、データの公開性は許容された。
スマートコントラクトの設計においては、Solidityで記述されたコントラクトが、投票の正当性検証、保存、そして情報取得の主要な機能を担う。具体的には、まずバックエンドから候補者リストを受け取り、コントラクト内に登録する機能がある。これにより、システムに登録されていない不正な候補者への投票は受け付けられない。次に、有権者が投票を行った際に、そのイベントを検知して動作する機能が実装されている。この機能は、投票した有権者のIDと、投票された候補者のIDを受け取り、これらの情報をハッシュ化(情報を保護するための変換処理)してブロックチェーンに安全に記録する。さらに、各候補者が獲得した票数をバックエンドに送り返し、フロントエンドでの表示に利用される機能も備わっている。
記事中には、投票を実行するための具体的な関数である「vote(uint256 candidateId)」の例も示されている。この関数は、投票時にいくつかの重要なチェックを実施する。「require(!hasVoted[msg.sender], "You have already voted.");」という記述は、投票を送信したユーザー(msg.senderで識別されるアドレス)が既に投票済みでないことを確認し、二重投票を効果的に防止する。「require(candidates[candidateId].id == candidateId, "Invalid candidate.");」という記述は、投票対象として指定されたcandidateIdが有効な候補者であることを確認し、不正な候補者への投票を防ぐ。これらのチェックがすべて問題なく通過すると、指定された候補者の投票数が1増加し、投票を行ったユーザーが投票済みとして記録される。最後に、「emit VoteCasted(msg.sender, candidateId);」という行で、誰がどの候補者に投票したかというイベントがブロックチェーン上に発行され、これがバックエンドによって監視される。このように、スマートコントラクトには「1つのユーザーにつき1票のみ」という厳格なルールがプログラムによって強制されている。
開発プロセスで使用されたツールとワークフローも紹介されている。スマートコントラクトの記述と、その動作テストにはRemix IDEという統合開発環境と、Ganache Ethereum testnetというイーサリアムのテストネットワークが利用された。Remix IDEはスマートコントラクト開発に特化したツールであり、Ganache testnetは実際のイーサリアムブロックチェーンと同様の環境をシミュレートし、開発者が無料でテストを行えるようにする。フロントエンドはHTML、CSS、JavaScriptという標準的なウェブ技術で開発され、バックエンドのAPI(Application Programming Interface)を通じてデータと連携した。バックエンドはPythonのDjangoフレームワークを用いて構築され、web3.pyライブラリを介してスマートコントラクトと通信し、フロントエンドとスマートコントラクトの間の橋渡し役を担った。
著者は、このシステムをわずか4日間という短期間で構築する中で、多くの課題に直面し、貴重な教訓を得たと述べている。特に、それまで経験のなかったSolidity言語の習得は大きな挑戦であった。また、システムに登録する有権者数が増加すると、システムの処理速度が低下するというスケーラビリティ(拡張性)の問題も認識されたが、これはあくまでプロトタイプ(試作品)段階であったため、その時点では許容範囲とされた。実際のブロックチェーン運用で発生する「ガス代」(トランザクション処理手数料)については、今回の開発がテストネット上で行われたため問題にはならなかったものの、実稼働システムではガス代の最適化が重要な課題となることを学んだという。
このプロジェクトは、ブロックチェーン技術が現実世界の投票システムに応用された際にどのような可能性をもたらし、同時にどのような技術的・運用上の課題を考慮すべきかを具体的に示す良い事例である。