はじめに

初めまして。 CryptoGamesというブロックチェーンゲーム企業でエンジニアをしている cardene(かるでね) です! スマートコントラクトを書いたり、フロントエンド・バックエンド・インフラと幅広く触れています。

代表的なゲームはクリプトスペルズというブロックチェーンゲームです。

以下でも情報発信しているので、興味ある記事があればぜひ読んでみてください!

今回はOpenZeppelinのバージョン5.1での変更点をまとめていきます。

以下のGithubの更新ログをもとにまとめていきます。

ERC1967Utils

Upgraded、AdminChanged、BeaconUpgradedイベントの重複宣言を削除。

これらのイベントは、contracts/interfaces/ ディレクトリの下にある IERC1967 インターフェースから利用可能。

最小pragmaバージョンが0.8.21になりました。

contracts/proxy/ERC1967/ERC1967Utils.sol#L4
pragma solidity ^0.8.21;
OpenZeppelin/openzeppelin-contracts の元のファイルを開く

ガバナンスモジュールの変更

GovernorとGovernorCountingSimpleコントラクトで、_countVotes 関数が uint256 を返すように変更されて総投票数を返すように変更。

これにより、部分的な投票や分数投票をサポートします。 既存のユーザーは、_countVotes 関数に return 文を追加することでコンパイルエラーを解決できます。

カスタムエラーの変更

カスタムエラーの識別子が変更されました。

  • Address.FailedInnerCall → Errors.FailedCall
  • Address.AddressInsufficientBalance → Errors.InsufficientBalance
  • Clones.Create2InsufficientBalance → Errors.InsufficientBalance
  • Clones.ERC1167FailedCreateClone → Errors.FailedDeployment
  • Clones.Create2FailedDeployment → Errors.FailedDeployment

SafeERC20は以下のように変更されています。

  • トークンのアドレスにコードがない場合は、Address.AddressEmptyCode → SafeERC20FailedOperation
  • 返されたデータが bool としてデコードできない場合、汎用 Error(string) → SafeERC20FailedOperation
  • コントラクト呼び出しが失敗した場合、汎用 SafeERC20FailedOperationにrevertメッセージを追加。

カテゴリごとの変更点

General

AccessManager、VestingWallet、TimelockController、ERC2771Forwarderにアップグレード対応用の初期関数の追加

Access

特定のロールを持つアドレス一覧の取得とより厳密なアクセス制御が可能に。

AccessControlEnumerable

getRoleMembers 関数が追加され、特定のロールを持つすべてのアカウントを取得できるように変更。

solidity
function getRoleMembers(bytes32 role) public view virtual returns (address[] memory) {
    return _roleMembers[role].values();
}

AccessManager

onlyAuthorized modifierが追加され、より厳密なアクセス制御を可能に。

Finance

VestingWalletCliff

権利確定ウォレットに「cliff」を追加できる拡張機能が導入。 これにより、権利確定期間が設定され、その期間を超えるまでウォレットのトークンがロックされます。

Governance

GovernorCountingFractional

新たにガバナンス投票モジュールが追加され、投票権を「賛成」「反対」「棄権」に分けて投票できるように変更。

Votes

_moveDelegateVotes 関数の可視性が privateからinternal` に変更され、継承先からもアクセスできるように変更。

Proxy

Clones

clone と cloneDeterministic のバージョンが追加され、コントラクト作成時に値を送信することをサポート。 これにより、クローン作成時にトランザクションでのETH送信が可能になります。

TransparentUpgradeableProxy

_proxyAdmin() 関数が internal から view に変更。

ProxyAdmin

UPGRADE_INTERFACE_VERSIONのドキュメント修正。

Tokens

ERC1363

トークン支払い標準の実装が追加され、トークンのtransferやapprove後にコントラクトコードを実行できるように変更され、より高度なトークン操作が可能に。

ERC20TemporaryApproval

一時的なapproveを実装する ERC20 拡張機能の追加。 ERC7674に基づいており、トークンの一時的な承認機能を提供。 https://ethereum-magicians.org/t/erc-7674-temporary-approval-extension-for-erc-20/19521

SafeERC20

受け取りアドレスがEOAかコントラクトによって処理を変更する「relaxrd」関数が追加。ERC1363 機能と互換性もあるようです。

ERC721Utils・ERC1155Utils

IERC721Receiver と IERC1155Receiver 実装コントラクトに対する受け入れチェックを行うための再利用可能なライブラリが追加。

ERC1363Utils

ERC1363 トークンのサポートを行う、ERC721Utils と ERC1155Utils に類似したヘルパー関数の追加。

Utils

Arrays

address[]、bytes32[]、uint256[] のソート関数が追加され、配列操作の利便性が向上。

Arrays

lowerBound、upperBound 関数とメモリバージョンが追加され、ソートされた配列内での検索が高速化されて重複にも対応。 findUpperBoundは非推奨となり、lowerBound の使用が推奨。

Base64

URLエンコード用の encodeURL 関数が追加。

Comparator

ヒープ構造のカスタム動作を実装するために役立つ比較関数のライブラリが追加。

Create2

コントラクト作成時にrevertした場合、その戻り値データをバブルアップ(再利用)するように変更。

Create2, Clones

computeAddress と cloneDeterministic の出力がアドレスタイプとしてクリーンな値(20バイトのみ使用)を生成するようにマスクが追加。

Errors

一般的なカスタムエラーを集めた新しいライブラリが追加。

Hashes

よく使用されるハッシュ関数を含むライブラリが追加。

Packing

bytesXX 値のパッキング、抽出、置換を行う新しいユーティリティの追加。

Panic

パニックコードでrevertするライブラリの追加。

ReentrancyGuardTransient

トランジェントストレージ(新しい一時的ストレージ)を使用する変数の追加。

Strings

アドレスをチェックサム付き文字列に変換するユーティリティ関数の追加。

SlotDerivation

ストレージスロットを導出するライブラリの追加。

StorageSlot

型付きスロット表現を使用してトランジェントストレージ空間を操作する関数の追加。

Cryptography

SignatureChecker

isValidSignatureNow のリファクタリングにより、署名者のアドレスにコードがデプロイされている場合は ECDSA 署名の検証をスキップするように変更。 これにより、効率が向上。

MerkleProof

カスタムハッシュ関数をサポートするために verify、processProof、multiProofVerify のバリエーションが追加。

P256

P256(secp256r1)の署名の検証と公開鍵の復元を行うライブラリの追加。

RSA

RFC 8017 の署名検証操作に従った署名を検証するライブラリの追加。

Math

Math

invMod 関数が追加され、Z/nZ の範囲内での数値のモジュラ逆数を取得できるように変更。

Math

modExp 関数が追加され、EIP198 プリコンパイルを活用できるように変更。 uint256 および bytes memory バージョンが含まれます。

Math

カスタムエラーがネイティブのパニックコードに置き換え。

  • パニックコード
solidity
library Panic {
    /// @dev generic / unspecified error
    uint256 internal constant GENERIC = 0x00;
    /// @dev used by the assert() builtin
    uint256 internal constant ASSERT = 0x01;
    /// @dev arithmetic underflow or overflow
    uint256 internal constant UNDER_OVERFLOW = 0x11;
    /// @dev division or modulo by zero
    uint256 internal constant DIVISION_BY_ZERO = 0x12;
    /// @dev enum conversion error
    uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;
    /// @dev invalid encoding in storage
    uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;
    /// @dev empty array pop
    uint256 internal constant EMPTY_ARRAY_POP = 0x31;
    /// @dev array out of bounds access
    uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;
    /// @dev resource error (too large allocation or too large array)
    uint256 internal constant RESOURCE_ERROR = 0x41;
    /// @dev calling invalid internal function
    uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;
}

Math, SignedMath

cond ? a : b を定数ガスコストで計算する分岐なしの三項関数の追加。

SafeCast

bool を uint256 として扱うための toUint(bool) 関数の追加。

Structures

CircularBuffer

最後に追加された N 個の値を保存するデータ構造の追加。 これにより、履歴管理が容易になります。

DoubleEndedQueue

カスタムエラーがネイティブのパニックコードに置き換え。

EnumerableMap

UintToBytes32Map、AddressToAddressMap、AddressToBytes32Map、Bytes32ToAddressMap などの新しいmapping配列の追加。

Heap

ヒープベースの優先度キューを実装するデータ構造の追加。

MerkleTree

マークルツリーに要素を挿入し、ルートハッシュを更新できるデータ構造の追加。

より詳しく

それぞれについてより詳しく確認したい場合は以下から確認してください。

最後に

今回はOpenZeppelinのバージョン5.1の変更点をまとめました。

以下でも情報発信しているので、興味ある記事があればぜひ読んでみてください!