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

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

最終編集者: @sekisanchi(opens in a new tab), 2024年1月18日

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

前提知識

スマートコントラクトライブラリを使用する前に、スマートコントラクトの構造をよく理解しておくことをお勧めします。 まだ理解していない場合は、スマートコントラクトの構造を確認してください。

ライブラリの中身

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

振る舞い

スマートコントラクトを記述していると、コントラクト内の保護された操作を行うために管理者アドレスを割り当てたり、予期せぬ問題が発生した場合に緊急用の一時停止ボタンを追加したりと、似たようなパターンを何度も書くことになる可能性があります。

スマートコントラクトライブラリは通常、Solidityでライブラリ(opens in a new tab)または継承(opens in a new tab)を介して、これらの振る舞いを再利用できる実装を提供します。

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

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: caller is not the owner");
10 _;
11 }
12}
すべて表示
コピー

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

1import ".../Ownable.sol"; // Path to the imported library
2
3contract MyContract is Ownable {
4 // The following function can only be called by the owner
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)です。 これらは (ベースコントラクトとは対照的に) 言語で提供されていないオーバーフローチェック付きの算術関数を提供するライブラリです。 ネイティブの算術演算の代わりに、これらのライブラリのいずれかを使用することで、悲惨な結果をもたらすオーバーフローからコントラクトを守ることをお勧めします。

標準

構成可能性と相互運用性を促進するために、イーサリアムコミュニティはERCの形式でいくつかの標準を定義しました。 詳細については、 標準セクションを参照してください。

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// This will load the @openzeppelin/contracts library from your node_modules
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プロジェクト。**

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

さらに学びたい方へ

役に立ったコミュニティリソースがあれば、 ぜひこのページに追加してください。

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