Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】🚀 Day 2 of 30 Days of Solidity Challenge – Building Enhanced User Profiles

2025年10月03日に「Dev.to」が公開したITニュース「🚀 Day 2 of 30 Days of Solidity Challenge – Building Enhanced User Profiles」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

Solidityチャレンジ2日目は、ユーザープロファイルを管理するスマートコントラクトを強化した。ユーザー名や自己紹介、年齢、所在地、画像URLなどをブロックチェーン上に保存し、更新・取得できる。StructとMappingを使い、dAppの基本的なデータ管理と、変更を記録するイベントの設計方法を学んだ。

ITニュース解説

このニュース記事は、Solidityというプログラミング言語を使ってスマートコントラクトを開発する「30日間チャレンジ」の2日目の成果を紹介している。今回の課題は、ユーザーのプロフィール情報を管理するシステムをより実用的なものに拡張することだった。

スマートコントラクトとは、ブロックチェーン上で動作する、プログラムされた契約のことである。特定の条件が満たされると自動的に実行され、その結果はブロックチェーンに記録されるため、改ざんが非常に困難であるという特性を持つ。Solidityは、このようなスマートコントラクトを記述するために広く使われるプログラミング言語だ。システムエンジニアを目指す上で、このような新しい技術がどのように動作し、どんな応用が可能かを知ることは非常に重要である。

前日には、ユーザーの名前と自己紹介(バイオ)だけを保存するシンプルなスマートコントラクトが作成された。今回のチャレンジでは、それをさらに強化し、実際のアプリケーションで必要とされるような、より多くの情報を含むユーザープロファイルシステムへと進化させた。具体的には、ユーザー名、自己紹介、年齢、所在地、プロフィール写真の参照情報、そしてプロフィールが作成または更新された日時といった、多様な項目が追加された。これらの情報をブロックチェーン上に保存することで、分散型アプリケーション(dApps)の基盤となるユーザー認証や情報管理の仕組みを構築できる。

この強化されたプロファイルシステムを構築するために、Solidityで記述されたEnhancedProfileというスマートコントラクトが用いられている。このコントラクトの主要な構成要素を順に解説する。

まず、struct Profileという部分がある。これは、異なる種類のデータをひとまとめにして扱うための「構造体」と呼ばれるデータ型である。今回のProfile構造体には、username(ユーザー名)、bio(自己紹介)、age(年齢)、location(所在地)、profilePic(プロフィール写真への参照)、joinedOn(参加または更新日時)という六つの項目が定義されている。例えば、profilePicは画像データそのものではなく、その画像が保存されている場所(IPFSのハッシュ値やURLなど)を示す文字列を格納する。これは、ブロックチェーン上に直接大きな画像データを保存することが非常に高コストであるため、その参照先のみを保存するという工夫である。joinedOnは、プロフィールが作成または更新された日時を記録するためのもので、uint256型は負の数を含まない大きな整数を扱うことを意味し、ここではUNIXタイムスタンプ(1970年1月1日からの経過秒数)が格納される。

次に、mapping(address => Profile) private profiles;という部分について説明する。mappingは、特定のキー(鍵)に対応する値(データ)を効率的に探し出すためのデータ構造で、一般的なプログラミング言語における「ハッシュマップ」や「辞書」に近い機能を持つ。ここでは、キーとしてユーザーのブロックチェーン上の「アドレス」(ウォレットアドレス)が使われ、そのアドレスに対応する値として、先ほど説明したProfile構造体で定義されたユーザープロフィール全体が紐付けられている。これにより、各ウォレットアドレスに対して一意のプロフィール情報を保存し、参照することが可能となる。privateキーワードは、このprofilesマッピングがスマートコントラクトの外部から直接アクセスできないことを示し、情報へのアクセスは公開された関数を通じて行われることを意味する。

event ProfileUpdated(...)は、スマートコントラクト内で発生した重要な出来事をブロックチェーン上に記録するための「イベント」の定義である。プロフィールが更新されるたびにこのイベントが発行され、どのユーザーのプロフィールがどのように更新されたかという情報がブロックチェーンのログとして残される。分散型アプリケーション(dApp)のフロントエンド(ユーザーインターフェース)は、これらのイベントを監視することで、スマートコントラクトの状態が変化したことをリアルタイムで検知し、表示を更新するといった処理を行うことができる。indexedキーワードが付与されたuserは、このイベントをより効率的に検索するためのインデックスとして機能する。

function setProfile(...) publicは、ユーザーが自分のプロフィール情報を設定または更新するための関数である。この関数は、ユーザー名、自己紹介、年齢、所在地、プロフィール写真の参照情報という五つの引数を受け取る。publicキーワードは、この関数がコントラクトの外部から呼び出されることを許可する。関数が実行されると、profiles[msg.sender]という形で、関数を呼び出したユーザー自身のアドレスに対応するプロフィール情報が更新される。msg.senderは、トランザクションを送信したアドレスを自動的に参照する特別な変数だ。joinedOn: block.timestampは、現在のブロックが生成されたタイムスタンプをjoinedOnフィールドに設定し、プロフィールの最終更新日時を記録する。情報の更新後には、emit ProfileUpdated(...)によって前述のProfileUpdatedイベントが発行され、プロフィールが更新されたことがブロックチェーンのログに記録される。

function getProfile(address _user) public view returns (...)は、指定されたアドレスのプロフィール情報を取得するための関数である。address _userという引数で、参照したいユーザーのアドレスを指定する。publicキーワードは外部からの呼び出しを許可し、viewキーワードは、この関数がブロックチェーンの状態を変更しない「読み取り専用」の関数であることを示す。view関数は、一般的にブロックチェーンのトランザクション手数料(ガス代)を消費せずに実行できるため、情報の参照に非常に効率的である。この関数は、指定された_userのアドレスに対応するProfile構造体から、各フィールドの値を返り値として提供する。

具体的な利用例として、ユーザーがsetProfile("Alice", "I build dApps", 25, "Bangalore, India", "ipfs://QmHashOfPic");というように関数を呼び出すことで、自分のプロフィール情報をブロックチェーン上に保存できる。その後、getProfile(aliceAddress);のように、Aliceのアドレスを指定してgetProfile関数を呼び出せば、その保存されたすべての詳細情報(ユーザー名、自己紹介、年齢、所在地、プロフィール写真、更新日時など)を取得できる。

このチャレンジを通じて、システムエンジニアを目指す初心者は、複数のユーザー詳細情報をブロックチェーン上に効率的に保存する方法、構造体(struct)とマッピング(mapping)を組み合わせてデータを管理する実践的な手法、スマートコントラクトの状態変更を追跡するためのイベントの活用方法、そして将来的に分散型アプリケーションで利用できる基本的なIDシステムを設計する考え方を学ぶことができる。これは、Solidityにおけるデータ管理と取得の基礎を理解するための重要なステップとなる。

関連コンテンツ

関連IT用語