メインコンテンツへスキップ
Change page

スマートコントラクトライブラリ

最終更新: 2025年8月21日

プロジェクト内のすべてのスマートコントラクトを一から書く必要はありません。 利用可能なオープンソースのスマートコントラクトライブラリが多数あり、プロジェクトに再利用可能なビルディングブロックが提供されています。これにより、一からやり直す必要がなくなります。

前提条件

スマートコントラクトライブラリを使用する前に、スマートコントラクトの構造をよく理解しておくことをお勧めします。 スマートコントラクトの構造をまだご覧になっていない方は、そちらへお進みください。

ライブラリの内容

スマートコントラクトライブラリには、通常、2種類のビルディングブロックがあります。コントラクトに追加できる再利用可能な振る舞いと、さまざまな標準の実装です。

動作

スマートコントラクトを記述していると、コントラクト内の保護された操作を行うために_admin_アドレスを割り当てたり、予期せぬ問題が発生した場合に緊急用の_pause_ボタンを追加したりと、似たようなパターンを何度も書いていることに気づくことが多いでしょう。

スマートコントラクトライブラリは通常、これらの動作の再利用可能な実装を、Solidityのライブラリ (opens in a new tab)として、または継承 (opens in a new tab)を介して提供します。

例として、以下にOpenZeppelin Contractsライブラリ (opens in a new tab)Ownableコントラクト (opens in a new tab)の簡易版を示します。これは、アドレスをコントラクトの所有者として指定し、その所有者のみにメソッドへのアクセスを制限するための修飾子を提供するものです。

1contract Ownable {
2 address public owner;
3
4 constructor() internal {
5 owner = msg.sender;
6 }
7
8 modifier onlyOwner() {
9 require(owner == msg.sender, "Ownable: 呼び出し元は所有者ではありません");
10 _;
11 }
12}
すべて表示

コントラクトでこのようなビルディングブロックを使用するには、最初にインポートしてから自身のコントラクトの中で拡張します。 これにより、元になったOwnableコントラクトによって提供される修飾子を使用して、独自の関数を保護することができます。

1import ".../Ownable.sol"; // インポートされたライブラリへのパス
2
3contract MyContract is Ownable {
4 // 次の関数は所有者のみが呼び出せます
5 function secured() onlyOwner public {
6 msg.sender.transfer(1 ether);
7 }
8}

もう一つの一般的な例は、SafeMath (opens in a new tab)DsMath (opens in a new tab)です。 これらは (ベースコントラクトとは対照的に) 言語で提供されていないオーバーフローチェック付きの算術関数を提供するライブラリです。 ネイティブの算術演算の代わりに、これらのライブラリのいずれかを使用することで、悲惨な結果をもたらすオーバーフローからコントラクトを守ることをお勧めします。

標準

構成可能性と相互運用性を促進するために、イーサリアムコミュニティはERCsの形式でいくつかの標準を定義しています。 それらについての詳細は、標準セクションで読むことができます。

ERCをコントラクトの一部として組み込む場合、独自のERCをロールアウトするよりも、標準の実装を探すことをお勧めします。 最も一般的なERCの実装は、多くのスマートコントラクトライブラリに含まれています。 例えば、広く普及しているERC20代替可能トークン標準は、HQ20 (opens in a new tab)DappSys (opens in a new tab)OpenZeppelin (opens in a new tab)にあります。 さらに、ERCによってはERC自体の一部として標準実装を提供することもあります。

特筆すべきは、一部のERCはスタンドアロンではなく、他のERCに機能を追加するものであるということです。 例えば、ERC2612 (opens in a new tab)は、そのユーザビリティを向上させるためにERC20に拡張機能を追加するものです。

ライブラリの追加方法

プロジェクトにライブラリを含める具体的な手順については、必ずそのライブラリのドキュメントを参照してください。 いくつかのSolidityコントラクトライブラリはnpmを使用してパッケージ化されているため、npm installでインストールするだけです。 コントラクトをコンパイルするためのほとんどのツールは、node_modulesでスマートコントラクトライブラリを検索しますので、次のようにできます:

1// これにより、node_modulesから@openzeppelin/contractsライブラリが読み込まれます
2import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
3
4contract MyNFT is ERC721 {
5 constructor() ERC721("MyNFT", "MNFT") public { }
6}

使用するメソッドに関わらず、ライブラリを含める際には、常に言語のバージョンに注意してください。 たとえば、Solidity 0.5でコントラクトを書いている場合は、Solidity 0.6のライブラリを使用することはできません。

使用する場面

プロジェクトにスマートコントラクトライブラリを使用すると、いくつかの利点があります。 まず第一に、自分でコーディングしなくても、すぐに利用可能でシステムに含めることができるビルディングブロックが提供されるため、作業時間を短縮できます。

セキュリティも大きなプラスです。 また、オープンソースのスマートコントラクトライブラリは、頻繁かつ詳細に調査されます。 多くのプロジェクトがそれらのライブラリに依存していることを考えると、コミュニティには継続的な見直しを行おうとする強い動機があります。 再利用可能なコントラクトライブラリ内よりも、アプリケーションコード内の方が、はるかに高い確率でエラーが見つかります。 ライブラリの中には、セキュリティをさらに強化するために外部監査 (opens in a new tab)を受けているものもあります。

ただし、スマートコントラクトライブラリを使用すると、馴染みのないコードをプロジェクトに組み込むリスクが生じます。 コントラクトをインポートして直接プロジェクトに組み込みたいと思うかもしれませんが、そのコントラクトが何をするものなのかをよく理解していないと、気付かないうちにシステム内で予期せぬ動作による問題を生じさせてしまう恐れがあります。 必ずインポートするコードのドキュメントを読んで、そのコード自体を確認してからプロジェクトの一部にするようにしてください。

最後に、ライブラリを含めるかどうかを決定する際には、その全体的な使用法を考慮してください。 広く採用されているものには、より大きなコミュニティとより多くの目で問題が調査されているという利点があります。 スマートコントラクトを使用して構築する場合、セキュリティが最も重視されるべきです。

OpenZeppelin Contracts - 安全なスマートコントラクト開発のための最も人気のあるライブラリ。

DappSys - スマートコントラクトのための、安全、シンプル、柔軟なビルディングブロック。

HQ20 - 実世界向けの完全な機能を備えた分散アプリケーションの構築を支援する、コントラクト、ライブラリ、サンプルを含むSolidityプロジェクト。

thirdweb Solidity SDK - カスタムスマートコントラクトを効率的に構築するために必要なツールを提供します

参考リンク

役に立つコミュニティリソースを知っていますか? Edit this page and add it!

この記事は役に立ちましたか?