confidential-skill は何をしますか?
プロダクション対応のSKILL.md — AIコーディングエージェントがZama FHEVMの機密スマートコントラクトを正しく記述できるようにします。20のアンチパターン、3つのテンプレート、Sepoliaライブデモを搭載。
概要
このスキルは、AIエージェント(Claude Code、Cursor、Codexなど)がZamaのFHEVM(完全準同型暗号化仮想マシン)向けの機密スマートコントラクトを作成するためのガイドです。FHEVMはスマートコントラクト内で暗号化データを直接操作できるようにしますが、特有のルールと制約があります。このドキュメントは、AIエージェントがこれらのルールに従い、脆弱性や非効率なコードを生成しないようにすることを目的としています。
アンチパターン(20件)
以下は、FHEVMコントラクト開発でよく見られる間違いとその回避方法です。
- 暗号化状態の直接公開: 暗号化された変数を
publicで宣言しないでください。代わりにinternalを使用し、必要に応じてview関数で値を取得してください。 - 条件分岐での暗号値の誤用:
if (encryptedValue > 10)のような直接比較はできません。FHE.lt(encryptedValue, 10)を使用してください。 euintXX型とuintXX型の混同: 暗号化された値は常にeuint8、euint16、euint32、euint64のいずれかで表現し、通常のuintにキャストするにはFHE.decrypt()が必要です。FHEライブラリのインポート漏れ:import "@zama-ai/fhevm/contracts/FHE.sol";を必ず追加してください。TFHE(旧ライブラリ)の使用: 新しいFHEライブラリを使用してください。TFHEは非推奨です。revert内での暗号値の使用: エラーメッセージに暗号化データを含めないでください。復号化後にのみ使用可能です。- 暗号演算後のスロットル欠如: 複数の暗号演算を行う場合は、ガス消費を考慮して
FHE.req()やFHE.isInitialized()でリソースを確認してください。 FHE.asEuintXX()の誤った使用: 定数を暗号化する際はFHE.asEuintXX(value)を使用しますが、valueが範囲内であることを確認してください。- ストレージ変数の過剰な暗号化: 不要なデータを暗号化するとガスコストが増加します。機密性が必要なもののみ暗号化してください。
- イベントでの暗号データ出力: イベントに暗号化データを含めると機密性が失われます。復号化後の値のみを出力してください。
FHE.sub()のアンダーフロー: 暗号化減算はアンダーフローを引き起こす可能性があります。事前にFHE.lt()で値を確認してください。FHE.add()のオーバーフロー: 暗号化加算もオーバーフローする可能性があります。FHE.lt(result, originalValue)などで監視してください。FHE.mul()のオーバーフロー: 乗算も同様にオーバーフローに注意してください。FHE.div()のゼロ除算:FHE.ne(divisor, FHE.asEuintXX(0))で事前確認が必要です。FHE.rand()の誤用:FHE.rand()は暗号化乱数を生成しますが、再現性がないため注意が必要です。FHE.cmux()の不適切な使用: 条件分岐を模倣するFHE.cmux(condition, valueIfTrue, valueIfFalse)では、条件が暗号化されていることを確認してください。onlyOwner修飾子での暗号化アドレス: 所有者アドレスを暗号化する必要はありません。通常のaddress型で十分です。payable関数内での暗号化金額:msg.valueを暗号化しないでください。Etherの送金は常に公開されます。delegatecallの誤用:delegatecallはFHEVMでは予期しない動作を引き起こす可能性があります。可能な限り避けてください。- テストネットでの
FHE.decrypt()の過信: テストネットでは復号化が即座に行われることがありますが、メインネットでは複数ブロックかかる可能性があります。
テンプレート(3件)
機密トークン
- 場所:
templates/confidential-token/ - 説明: 暗号化された残高を持つERC20ライクなトークン。
- 使用法:
FHE.balancesマッピングを使用して、トークン残高を暗号化状態で管理します。
機密オークション
- 場所:
templates/confidential-auction/ - 説明: 入札額を暗号化して保存するオークションコントラクト。
- 使用法:
FHE.auctionBidsマッピングで入札を管理し、公開は復号化後にのみ行います。
機密投票
- 場所:
templates/confidential-voting/ - 説明: 投票内容を暗号化する投票システム。
- 使用法: 各投票は
euint8で保存され、終了後に集計されます。
ライブデモ(Sepolia)
- デプロイ済みコントラクト: Sepoliaテストネット上で動作中。
- 確認方法:
npx hardhat run scripts/interact.js --network sepoliaを実行。 - デモ機能: 機密トークンの発行、送金、残高確認が可能。
サポート
- プラットフォーム: Claude Code、Cursor、Codex、その他SKILL.md互換エージェント。
- 問題報告: GitHub Issuesにて受け付けています。