🛠️

実践的Solidity開発ガイド

2025/02/13に公開

実践的 Solidity 開発ガイド

概要

Solidity は、イーサリアム仮想マシン (EVM) 上でスマートコントラクトを書くために設計されたプログラミング言語です。本ガイドでは、Solidity 開発の基礎から高度な概念まで、段階的に説明します。

Solidity 言語の基本

変数とデータ型

Solidity には、以下の基本データ型があります。

  • uint: 符号なし整数
  • int: 符号付き整数
  • bool: ブール値
  • address: イーサリアムアドレス
  • string: 文字列

変数は次のように宣言します。

uint myUint = 10;

関数

関数は、スマートコントラクトで動作を実行するコードブロックです。関数は次のように宣言します。

function myFunction() public {
    // 関数のコードをここに記述
}

構造体と配列

構造体は、関連するデータをグループ化するのに使用します。配列は、同じデータ型の要素のリストを格納します。

struct Person {
    uint age;
    string name;
}

Person[] people;

イベント

イベントは、ブロックチェーンにログを記録するために使用します。イベントは次のように宣言します。

event MyEvent(uint value);

スマートコントラクトの開発

スマートコントラクトの作成

スマートコントラクトを作成するには、contract キーワードを使用します。

contract MyContract {
    // コントラクトのコードをここに記述
}

state 変数

state 変数は、コントラクトの永続的なデータを格納します。

state uint myStateVariable;

関数の実装

コントラクト関数を実装するには、function キーワードを使用します。

function myFunction(uint param) public {
    // 関数のコードをここに記述
}

イベントの発生

イベントを発生させるには、emit キーワードを使用します。

emit MyEvent(value);

高度な概念

アクセス制御

Solidity では、関数のアクセスレベルを指定できます。

  • public: 公開(外部からアクセス可能)
  • private: プライベート(コントラクト内でのみアクセス可能)
  • internal: 内部(コントラクトとその派生コントラクトからのみアクセス可能)

継承とポリモーフィズム

Solidity では、コントラクトは他のコントラクトから継承できます。継承により、派生コントラクトはベースコントラクトの機能を再利用できます。

contract BaseContract {
    function baseFunction() public {
        // ベース関数のコードをここに記述
    }
}

contract DerivedContract is BaseContract {
    function derivedFunction() public {
        baseFunction();
        // 派生関数のコードをここに記述
    }
}

モディファイア

モディファイアは、関数の動作を変更するために使用できます。モディファイアは次のように宣言します。

modifier onlyOwner() {
    require(msg.sender == owner, "Only the owner can call this function.");
    _;
}

function onlyOwnerFunction() public onlyOwner {
    // オーナーのみがアクセスできる関数のコードをここに記述
}

実践的な例

シンプルな投票システム

Solidity で簡単な投票システムを実装しましょう。

contract VotingSystem {
    struct Candidate {
        uint id;
        string name;
        uint votes;
    }

    mapping(uint => Candidate) candidates;
    mapping(address => bool) hasVoted;
    uint nextCandidateId;

    function addCandidate(string name) public {
        candidates[nextCandidateId] = Candidate({
            id: nextCandidateId,
            name: name,
            votes: 0
        });

        nextCandidateId++;
    }

    function vote(uint candidateId) public {
        require(!hasVoted[msg.sender], "You have already voted.");

        candidates[candidateId].votes++;
        hasVoted[msg.sender] = true;
    }

    function getWinningCandidate() public view returns (Candidate) {
        uint winningCandidateId;
        uint maxVotes = 0;

        for (uint i = 0; i < nextCandidateId; i++) {
            if (candidates[i].votes > maxVotes) {
                winningCandidateId = i;
                maxVotes = candidates[i].votes;
            }
        }

        return candidates[winningCandidateId];
    }
}

結論

このガイドでは、Solidity 開発の基礎と高度な概念を紹介しました。これらの概念を理解することで、強力なスマートコントラクトを構築し、ブロックチェーンアプリケーションを開発できます。

次のステップ

GitHubで編集を提案

Discussion