問題一覧に戻る
上級高度なパターン
問題90: ファクトリーパターン
Solidityのファクトリーパターンを学習 - コントラクトの動的作成とデプロイ。ファクトリーは標準化されたインターフェースでプログラム的なコントラクトインスタンシエーションを可能にします。CREATE2は決定的アドレスを提供し、デプロイ前のアドレス予測を可能にします。このパターンはトークンコントラクト作成、クローンデプロイ、スケーラブルアーキテクチャに不可欠。ファクトリーパターンの理解は、予測可能なアドレスでコントラクトを動的生成するシステム構築に重要です。
pragma solidity ^0.8.0;
contract Token {
string public name;
address public owner;
constructor(string memory _name) {
name = ;
owner = msg.sender;
}
}
contract TokenFactory {
event TokenCreated(address indexed token, string name);
address[] public tokens;
// 標準コントラクト作成
function createToken(string memory name) public returns (address) {
Token newToken = new ();
// 作成されたコントラクトをトラッキング
tokens.push(address());
// 作成イベントを発火
emit TokenCreated(address(newToken), );
return address(newToken);
}
// 決定的アドレスでCREATE2
function createToken2(
string memory name,
uint256 salt
) public returns (address) {
bytes32 _salt = keccak256(abi.encodePacked());
// 決定的アドレス生成
Token newToken = new Token{salt: }(name);
address tokenAddress = address();
tokens.push(tokenAddress);
emit TokenCreated(tokenAddress, name);
return tokenAddress;
}
// アドレス予測関数
function predictAddress(
string memory name,
uint256 salt
) public view returns (address) {
bytes32 _salt = keccak256(abi.encodePacked(salt));
bytes memory bytecode = abi.encodePacked(
type().creationCode,
abi.encode(name)
);
bytes32 hash = keccak256(abi.encodePacked(
bytes1(0xff),
address(this),
,
keccak256()
));
return address(uint160(uint256(hash)));
}
}