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の使用例
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をミントしたりする処理を行う際によく使いますのでマスターしておきましょう。