広告

第4話:コントラクトの記憶装置!「状態変数」と基本のデータ型 (uint, string, address)

2025年7月30日

第4話:コントラクトの記憶装置!「状態変数」と基本のデータ型 (uint, string, address)

概要

スマートコントラクトの根幹「状態変数」をさらに深掘りし、あらゆる開発の基礎となる必須データ型を解説します。数字を扱うuint、テキストを扱うstring、そしてユーザーIDの役割を果たすaddress。

これら3つの使い方と意味を具体的なコードで学びます。データをブロックチェーンに書き込む際の「ガス代」という重要な概念にも触れ、コントラクトの骨格を設計するスキルを身につけます。

目次
Solidity学習講座:最終版 目次(全20話)
Solidity学習講座:最終版 目次(全20話)

基礎編 第1話:未来のインターネットへようこそ!Solidityとスマートコントラクトの全体像 第2話:準備は1分!ブラウザだけで開発できる「Remix IDE」の基本操作 第3話:記念すべき初コント ...

続きを見る

はじめに

第3話では、HelloWorldコントラクトを分解し、その一行一行が持つ意味を学びましたね。特に重要な発見は、contractの中に書かれた変数が、ブロックチェーン上に半永久的に記録される**「状態変数」**である、ということでした。

スマートコントラクトの力は、この「何を記録するか」にかかっています。それはまるで、建物の部屋に何を置くかでその部屋の用途が決まるようなものです。

前回はstringという「文字列」を置く方法を学びました。今回は、そのバリエーションを増やし、スマートコントラクトを構築するための、最も基本的で最も重要な「建築資材」である3つのデータ型をマスターしていきましょう。

この記事を読み終える頃、あなたは数字、テキスト、そしてウォレットアドレスという、Web3アプリケーションに必須のデータを自在に定義できるようになっているはずです。

状態変数:ブロックチェーンの有料ストレージ

本題に入る前に、状態変数について一つ、非常に重要な事実を再確認しておきましょう。それは、状態変数へのデータの書き込みには「ガス代」というコストがかかる、ということです。

ブロックチェーンは、世界中のコンピュータが共有する巨大なデータベースです。その貴重な記録領域にあなたのデータを書き込むわけですから、相応の手数料(ガス代)が必要になるのは当然ですね。一方で、public変数のデータを読み取るだけなら、多くの場合ガス代はかかりません。

これは、プログラムが終了すれば変数が消える一般的なプログラミングとの決定的な違いです。「ブロックチェーンにデータを保存するのは、ただの変数宣言ではなく、有料の永続ストレージを借りる行為なのだ」と意識しておくと、今後の学習がスムーズになります。

必須データ型(1) uint:数字とお金を扱う

スマートコントラクトで最もよく使われるデータ型、それがuintです。

uintUnsigned Integer(符号なし整数) の略で、0以上のマイナスのない整数を扱うための型です。

なぜこれが重要なのでしょうか? イーサリアムの世界では、ETHや各種トークンの残高、送金額といったお金の計算から、NFTのID、投票のカウント数まで、あらゆるものがこのuintで管理されているからです。Web3開発において、uintを避けて通ることはできません。

Solidity

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

contract SimpleData {
    // ユーザー数をカウントするためのuint
    uint public userCount = 0;

    // NFTのIDを保存するためのuint
    uint public tokenId = 12345;
}

ちなみに、uintは実はuint256の別名です。Solidityにはuint8 uint16 uint32... と8ビット単位で256ビットまでのサイズがありますが、イーサリアムの内部的な仕組み(EVM)と相性が良いため、特に理由がなければuint256(つまりuint)を使うのが一般的で、ガス効率も良いとされています。

必須データ型(2) string:テキスト情報を扱う

stringは、第3話のHelloWorldでも使ったのでお馴染みですね。**文字列(テキストデータ)**を保存するための型です。

ユーザー名、投稿メッセージ、NFTに付随する説明文など、用途は多岐にわたります。

Solidity

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

contract SimpleData {
    // ... uintの宣言 ...

    // ユーザー名やステータスメッセージを保存するためのstring
    string public username = "Nakamoto";
    string public statusMessage = "Just setting up my ETH wallet.";
}

ただし、一つ注意点があります。Solidityは、string型の文字列を結合したり、一部を切り出したりといった複雑な操作が、他の言語に比べて苦手で、ガス代が高くなりがちです。現時点では、「stringは主に、固定のテキスト情報を保存・取得するために使う」と覚えておきましょう。

必須データ型(3) address:ユーザーと契約の識別子

さて、最後に紹介するaddress型は、まさにブロックチェーン開発を象徴する、最も重要なデータ型と言えるでしょう。

addressは、イーサリアムのアカウント(ウォレット)や、他のスマートコントラクトが持つ固有のアドレス0xから始まる42文字の英数字)を保存するための専用の型です。

これがなければ、誰が誰に送金したのか、誰がこのNFTを所有しているのか、といった所有権やアイデンティティを記録することができません。ユーザー、契約、資産を結びつけるための、まさに「接着剤」のような役割を果たします。

Solidity

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

contract SimpleData {
    // ... uint, stringの宣言 ...

    // コントラクトの所有者のアドレスを保存するためのaddress
    address public owner = 0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2;

    // 送金先など、別のアドレスを保存
    address public beneficiary; // 初期値なし(ゼロアドレスが設定される)
}

※上記のアドレスはサンプルです。

このaddress型があるからこそ、「このNFTは、このaddressの持ち物」「この契約のオーナーは、このaddress」といった、Web3の根幹をなす所有権の証明が可能になるのです。

Remixで動かしてみよう

それでは、今回の学びを体験に繋げましょう。上記のSimpleData.solの完成形コードをRemixに貼り付け、第2話、第3話でやったようにコンパイル&デプロイしてみてください。

Solidity

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

contract SimpleData {
    // 1. 数字を扱う
    uint public userCount = 0;
    uint public tokenId = 12345;

    // 2. テキストを扱う
    string public username = "Nakamoto";
    string public statusMessage = "Just setting up my ETH wallet.";
    
    // 3. アドレスを扱う
    address public owner = 0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2;
    address public beneficiary;
}

デプロイ後、「Deployed Contracts」セクションには、userCount, tokenId, username, statusMessage, owner, beneficiaryといった、たくさんの青いボタンが表示されているはずです。一つずつクリックして、私たちがコードに書いた通りのデータが、きちんとブロックチェーン上に記録されていることを確認してみてください。

まとめ:契約の骨格を作る

お疲れ様でした!今回は、スマートコントラクトの記憶装置である「状態変数」について、その基礎となる3つの重要なデータ型を学びました。

  • uint:お金や数量など、数字を扱うための型。
  • string:ユーザー名など、テキストを扱うための型。
  • address:所有者や送金先など、アカウントを扱うための型。

この3つをマスターしたあなたは、もはや単なるHello Worldプログラマではありません。投票コントラクト、独自トークン、NFTなど、あらゆるスマートコントラクトの「データの骨格」を設計するための基本スキルを身につけたことになります。

しかし、今はまだデータを保存することしかできません。せっかく保存したデータを、後から変更したり、条件に応じて操作したりしたいですよね?

次回、**第5話「コードの心臓部!「関数」を定義してコントラクトを操作可能にする」**では、ついにコントラクトに「動き」を与えます。データを読み書きするための出入り口である「関数」を学び、あなたのコントラクトを、ただのデータ置き場から、インタラクティブなアプリケーションへと進化させましょう。

目次
Solidity学習講座:最終版 目次(全20話)
Solidity学習講座:最終版 目次(全20話)

基礎編 第1話:未来のインターネットへようこそ!Solidityとスマートコントラクトの全体像 第2話:準備は1分!ブラウザだけで開発できる「Remix IDE」の基本操作 第3話:記念すべき初コント ...

続きを見る

-Solidity