OpenZeppelin v5.1での変更点まとめ
はじめに
初めまして。
CryptoGamesというブロックチェーンゲーム企業でエンジニアをしている cardene(かるでね) です!
スマートコントラクトを書いたり、フロントエンド・バックエンド・インフラと幅広く触れています。
代表的なゲームはクリプトスペルズというブロックチェーンゲームです。
以下でも情報発信しているので、興味ある記事があればぜひ読んでみてください!
今回はOpenZeppelinのバージョン5.1での変更点をまとめていきます。
以下のGithubの更新ログをもとにまとめていきます。
ERC1967Utils
これらのイベントは、contracts/interfaces/
ディレクトリの下にある IERC1967 インターフェースから利用可能。
最小pragmaバージョンが0.8.21
になりました。
ガバナンスモジュールの変更
これにより、部分的な投票や分数投票をサポートします。
既存のユーザーは、_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
Access
AccessControlEnumerable
getRoleMembers
関数が追加され、特定のロールを持つすべてのアカウントを取得できるように変更。
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に基づいており、トークンの一時的な承認機能を提供。
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
カスタムエラーがネイティブのパニックコードに置き換え。
- パニックコード
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の変更点をまとめました。
以下でも情報発信しているので、興味ある記事があればぜひ読んでみてください!
Discussion