Solidity

【Solidity】第5章第2回:継承(inheritance)の基礎

本記事では、Solidityにおける「継承」(inheritance)の基本を解説します。継承を利用することで、コードを効率的に再利用し、コントラクト設計をより洗練されたものにすることができます。

0. 記事の概要

この記事を読むメリット

  • 継承の基礎理解:継承の概念とその利点を学べます。
  • コードの再利用性向上:継承を使用してスマートコントラクトの効率的な構築が可能になります。
  • スマートコントラクト設計力の向上:継承を活用した設計例を理解できます。

この記事で学べること

  • 継承の基本構文とその用途
  • 継承を使ったスマートコントラクト設計例
  • よくあるエラーとその解決策

1. 継承(inheritance)とは?

1.1 継承の概要

継承とは、既存のコントラクトの機能や状態を、新しいコントラクトで再利用するための仕組みです。親コントラクトの関数や状態変数をそのまま使用でき、コードの重複を減らすことができます。

1.2 継承の基本構文

// 継承の基本例
contract Parent {
    string public parentMessage = "This is the parent contract.";

    function parentFunction() public pure returns (string memory) {
        return "Function from Parent";
    }
}

contract Child is Parent {
    function childFunction() public pure returns (string memory) {
        return "Function from Child";
    }
}

動作解説

このコードでは、ChildコントラクトがParentコントラクトを継承しています。ChildコントラクトからparentMessageparentFunctionをそのまま使用できます。

2. 継承を活用したスマートコントラクト設計

2.1 アクセス制御の実装

// 継承を利用したアクセス制御
contract Ownable {
    address public owner;

    constructor() {
        owner = msg.sender;
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "Not the owner");
        _;
    }
}

contract Restricted is Ownable {
    function restrictedFunction() public onlyOwner {
        // オーナーのみが実行可能な処理
    }
}

動作解説

このコードでは、Ownableコントラクトを継承することで、Restrictedコントラクトにアクセス制御機能を追加しています。

2.2 トークンコントラクトの拡張

// トークンコントラクトを拡張
contract ERC20 {
    mapping(address => uint256) public balances;

    function transfer(address to, uint256 amount) public {
        require(balances[msg.sender] >= amount, "Insufficient balance");
        balances[msg.sender] -= amount;
        balances[to] += amount;
    }
}

contract MintableToken is ERC20 {
    function mint(address to, uint256 amount) public {
        balances[to] += amount;
    }
}

動作解説

このコードでは、ERC20コントラクトを継承し、新たにmint関数を追加しています。

3. よくあるエラーとその解決策

3.1 コンストラクタの引数の継承

親コントラクトにコンストラクタがある場合、子コントラクトでその引数を指定する必要があります。

3.2 オーバーライドのミス

関数をオーバーライドする際に、overrideキーワードを忘れるとエラーになります。適切に指定してください。

4. 練習問題

以下の課題に挑戦してみましょう:

  1. 基本的なERC20トークンコントラクトを継承して、焼却(burn)機能を追加してください。
  2. アクセス制御を持つ管理者コントラクトを作成してください。

5. まとめ

本記事では、Solidityにおける継承の基本的な使い方とその活用例について学びました。継承を効果的に利用することで、コードの再利用性を高め、堅牢なスマートコントラクトを構築できます。