【Solidity】OpenZeppelinとは?

Solidity開発を行う上で必ず使用するOpenZeppelinについて解説します。

OpenZeppelinを知ることで開発の幅が大きく広がります。

OpenZeppelinとはスマートコントラクト開発のフレームワーク

OpenZeppelinは、ひとことで言えば、「スマートコントラクト開発のフレームワーク」です。

ブロックチェーン開発言語であるSolidityで記述されています。

このOpenZeppelinを使うことで、Solidity開発おいて複雑な処理もシンプルなコードで書くことができ、Solidity単体で開発するよりも大変スムーズに開発できるようになります。

以下は、OpenZeppelinの公式ドキュメントとなります。

OpenZeppelinの使い方

OpenZeppelinを使うには、OpenZeppelinを現在のコードにインポートする必要があります。

サンプルコードを以下に記します。

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

// OpenZeppelinのMathライブラリをインポート
import "@openzeppelin/contracts/utils/math/Math.sol";
 
contract TestContract {

    function getMax(uint a, uint b) public pure returns(uint) {
        // Mathライブラリのmaxメソッドを使用
        return Math.max(a, b);
    }

}

上記では例としてMathライブラリをインポートしていますが、他にも様々なものがあります。

ライブラリ一覧は、Contractsページにある"API"というセクションから確認できます。

OpenZeppelin API 一覧
OpenZeppelin API 一覧

OpenZeppelinの使用例

OpenZeppelinの使用例を以下にいくつか紹介します。

アクセス制御(Access Control)

以下は、OwnableコントラクトのonlyOwner修飾子を使用し、コントラクトオーナー以外の実行を禁止しているサンプルコードです。

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

// OpenZeppelinのOwnableコントラクトをインポート
import "@openzeppelin/contracts/access/Ownable.sol";
 
contract TestContract is Ownable {

    // OwnableコントラクトのonlyOwnerで修飾
    function sayHelloToOwner() public onlyOwner view returns(string memory) {
        return "Hi Owner";
    }

}

トークン ERC20(Tokens ERC20)

以下は、ERC20コントラクトの_mintメソッドを使用し、Sloth(SLTH)という独自トークンを発行しているサンプルコードです。

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

// OpenZeppelinのERC20コントラクトをインポート
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract SLTHToken is ERC20 {

    constructor(uint256 initialSupply) ERC20("Sloth", "SLTH") {
        // ERC20コントラクトの_mintメソッドを使用
        _mint(msg.sender, initialSupply);
    }

}

ユーティリティ(Utilities)

以下は、ユーティリティライブラリのEnumerableMapを使用し、AddressToUintMapを定義しているサンプルコードです。

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

// OpenZeppelinのEnumerableMapライブラリをインポート
import "@openzeppelin/contracts/utils/structs/EnumerableMap.sol";

contract Test {
    // ライブラリのAddressToUintMapをインポート
    using EnumerableMap for EnumerableMap.AddressToUintMap;
    // AddressToUintMapを定義
    EnumerableMap.AddressToUintMap private myTestMap;

    function setValue(uint num) public {
        // EnumerableMapのsetメソッドを使用
        EnumerableMap.set(myTestMap, msg.sender, num);
    }

    function getValue() public view returns(uint) {
        // EnumerableMapのgetメソッドを使用
        return EnumerableMap.get(myTestMap, msg.sender);
    }

    function existValue() public view returns(bool) {
        // EnumerableMapのcontainsメソッドを使用
        return EnumerableMap.contains(myTestMap, msg.sender);
    }

    function countValue() public view returns(uint) {
        // EnumerableMapのlengthメソッドを使用
        return EnumerableMap.length(myTestMap);
    }

}

フレームワークとは"よく使う処理を集めたコードの便利箱"という理解で大丈夫です。OpenZeppelinを使うことで、Solidity単体で書くととても複雑で長いコードになってしまうような処理も、とてもシンプルな記述で書けるようになります。トークンを発行したりNFTをミントしたりする処理を行う際によく使いますのでマスターしておきましょう。

タイトルとURLをコピーしました