For the complete documentation index, see llms.txt. This page is also available as Markdown.

Smart Contract を書く

Chiliz Chain互換のSolidityコントラクトの記述方法:推奨されるSolidityおよびEVMのバージョン、CAP-20トークンのdecimals、gasの仕組み、Ethereumとの違い。

Chiliz Chain上でdAppを作成すると決めた瞬間から、当ブロックチェーン特有の事項を考慮する必要があります。

Chiliz ChainはEVM互換ですが、Ethereumとまったく同じように扱うと、特にトークンのdecimalsやgasの仕組みに関して、使い勝手の問題を引き起こすことがあります。

さっそく見ていきましょう!

Prerequisites

Environment

コントラクトを書き始める前に、環境が整っていることを確認してください。

まず、Spicy Testnet(開発用)またはChiliz Chain Mainnet(本番用)向けに設定されたwalletが必要です。

Connect to Chiliz Chain

次に、TestnetとMainnetの両方で、gasによるdeploy費用を支払うための$CHZが必要です。Mainnetの$CHZは任意の暗号資産取引所で購入できますが、Testnetのトークンはfaucetを利用して入手できます。

Obtain Free Testnet Tokens

ツールに関しては、HardhatまたはRemixを利用できます。例として以下を参照してください:

remix-deploy.md

最後に、Chiliz ChainのコントラクトはSolidity言語で記述されます:

推奨されるSolidityおよびEVMのバージョンを使用してください:

Chiliz Chain で推奨される Solidity および EVM のバージョン:

  • Solidity コンパイラのバージョン: 0.8.30(またはそれ以下)

  • ターゲット EVM バージョン: prague

Fan Tokens / CAP-20

Chiliz Chainの最も特有な側面は、Fan Tokensに使用されるCAP-20標準です。

CAP-20トークンはコードレベルではERC-20標準と技術的に同一ですが、decimalsに関して特有の設定を持ちます。簡単に言うと、通常のERC-20トークンが18 decimalsを使用するのに対し、CAP-20は0 decimalsを使用します。

About Fan Tokens

そのため、18 decimalsでFan Tokenをdeployすると、エコシステムのwalletで正しく表示されなかったり、将来のSocios.com統合との互換性がなくなったりする可能性があります。

Best practices in writing a smart contract

Use Battle-Tested Libraries (OpenZeppelin)

コントラクトをゼロから作成するのは避けてください。 最も効果的なセキュリティ対策は、コミュニティによって監査された標準にコードを基づかせ、脆弱性のリスクを減らすことです。

Chiliz Chainの開発では、OpenZeppelin Contractsの使用を強く推奨します。これらは、トークンコントラクト向けに安全かつコミュニティで検証された実装を提供します。

標準コントラクトを使用することで、トークンが既知のwallet(MetaMaskなど)やChilizエコシステム(Socios.com)と互換性を持つことが保証されます。

General EVM Best Practices

チェーンを問わず、安全なSolidity開発においてこれら3つのパターンは譲れません。

The "Checks-Effects-Interactions" Pattern

これはReentrancy Attacksに対する第一の防御策です。関数は常にこの順序で構成してください:

  1. Checks:入力と条件を検証する(例:require文)。

  2. Effects:コントラクトの状態を更新する(例:残高を減らす)。

  3. Interactions:他のコントラクトとやり取りする、または資金を送る(例:transfer)。

Robust Access Control

機密性の高い関数を保護しないままにしてはいけません。トークンをmintする、手数料を変更する、ロジックをアップグレードするといった関数は、必ず制限する必要があります。

  • シンプル:単一管理者のコントラクトにはOwnableを使用する。

  • 複雑:複数のロール(例:MINTER_ROLEADMIN_ROLE)を必要とするコントラクトにはAccessControlを使用する。

Input Validation

すべての入力は悪意あるものと想定してください。関数の冒頭でrequire()文を使用してパラメータを検証します。

例えば:

  • ゼロアドレス(address(0))をチェックする。

  • 送金時にゼロ額をチェックする。

  • 複数の配列を渡す場合、配列の長さが一致するか検証する。

  • など。

Chiliz-Specific Implementation Details

Chiliz ChainはEVM互換ですが、特にトークンのdecimalsに関して、一定の「ローカルルール」が適用されます。

CAP-20 Compliance (Fan Tokens)

Fan Tokensとやり取りするコントラクト(例:$PSGや$BAR向けのStaking Pool)を書く場合、0 decimalsを扱う必要があります。

つまり:

  • 1 Token = 10^18 unitsと想定しないこと。Fan Tokensの場合、1 Token = 1 unitです。

  • コントラクトを汎用的にする場合、計算に1e18をハードコードするのは避けること。token.decimals()関数を動的に使用してください。

Gas Optimization on Chiliz

Chiliz Chain上のトランザクションはEthereumよりも大幅に安価ですが、最適化されていないコードは、トラフィックの多いイベント(例:試合のライブ中継中)に依然として混雑やトランザクション失敗を引き起こす可能性があります。

gasを節約する方法を3つ紹介します:

  • Custom Errorsを使用する:require内の長い文字列メッセージの代わりに、error定義を使用してgasを節約する。

  • state変数を32バイトのスロットに収まるように並べる。可能な限りuint128addressboolを隣り合わせに配置する。

  • コントラクト自身から内部的に呼び出されることのない関数にはexternalを優先する。

最終更新

役に立ちましたか?