mcpField
N
nodejs-keccak256-v1

nodejs-keccak256-v1

github.com/blockmatic開発1220 回インストール5 週間前に更新
リポジトリ

nodejs-keccak256-v1 について

EthereumのKeccak-256を扱うNode.js・TypeScript開発者向けガイドです。Node.jsのSHA3-256との違いを説明し、Ethereumのハッシュ処理例とSHA-256用途への誤用防止を示します。

主な機能

  1. 01Keccak-256とSHA3-256の違い
  2. 02Ethereumの関数セレクターとイベントトピック
  3. 03EIP-712、署名、Merkleハッシュ
  4. 04ストレージスロットとアドレス導出の例
  5. 05viem、ethers、web3.jsでの利用方法

活用シーン

  1. 01コントラクトの関数セレクターとイベントトピックの計算
  2. 02EIP-712やMerkle向けヘルパーの作成
  3. 03Ethereumデータのハッシュ処理コードのレビュー
  4. 04コード内のSHA3-256使用箇所の確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/blockmatic/basilic-skills --skill nodejs-keccak256-v1

インストール後、Claude Code で/nodejs-keccak256-v1を入力して読み込まれたか確認します。

詳細

Node.js Keccak-256

Ethereum では、Node の crypto.createHash('sha3-256') が提供する NIST 標準化 SHA3 バリアントではなく、Keccak-256 を使用します。

対象範囲: Ethereum のハッシュ処理のみ — 関数セレクター、イベントトピック、EIP-712、Merkle 証明、ストレージスロット、アドレス導出。

禁止事項: JWT トークン、OAuth PKCE、API キー、その他のアプリケーションシークレットに使用される Node の createHash('sha256') を書き換えてはいけません。Keccak は SHA-256 ではありません。

推奨: viem がプロジェクトの依存関係にすでに含まれている場合は、viem の keccak256 を使用します。ethers は、アプリがすでに依存している場合にのみ使用します。

使用する場面

  • Ethereum の関数セレクターやイベントトピックを計算する場合
  • JS/TS で EIP-712、署名、Merkle、またはストレージスロットのヘルパーを作成する場合
  • Node の crypto で Ethereum データを直接ハッシュするコードをレビューする場合

仕組み

同じ入力でも、2 つのアルゴリズムは異なる出力を生成しますが、Node は警告を出しません。

import crypto from 'crypto';
import { keccak256, toUtf8Bytes } from 'ethers';

const data = 'hello';
const nistSha3 = crypto.createHash('sha3-256').update(data).digest('hex');
const keccak = keccak256(toUtf8Bytes(data)).slice(2);

console.log(nistSha3 === keccak); // false

例

ethers v6
import { keccak256, toUtf8Bytes, solidityPackedKeccak256, id } from 'ethers';

const hash = keccak256(new Uint8Array([0x01, 0x02]));
const hash2 = keccak256(toUtf8Bytes('hello'));
const topic = id('Transfer(address,address,uint256)');
const packed = solidityPackedKeccak256(
  ['address', 'uint256'],
  ['0x742d35Cc6634C0532925a3b8D4C9B569890FaC1c', 100n],
);
viem
import { keccak256, toBytes } from 'viem';

const hash = keccak256(toBytes('hello'));
web3.js
const hash = web3.utils.keccak256('hello');
const packed = web3.utils.soliditySha3(
  { type: 'address', value: '0x742d35Cc6634C0532925a3b8D4C9B569890FaC1c' },
  { type: 'uint256', value: '100' },
);
よくあるパターン
import { id, keccak256, AbiCoder } from 'ethers';

const selector = id('transfer(address,uint256)').slice(0, 10);
const typeHash = keccak256(toUtf8Bytes('Transfer(address from,address to,uint256 value)'));

function getMappingSlot(key: string, mappingSlot: number): string {
  return keccak256(
    AbiCoder.defaultAbiCoder().encode(['address', 'uint256'], [key, mappingSlot]),
  );
}
公開鍵からアドレスを取得
import { keccak256 } from 'ethers';

function pubkeyToAddress(pubkeyBytes: Uint8Array): string {
  const hash = keccak256(pubkeyBytes.slice(1));
  return '0x' + hash.slice(-40);
}
コードベースを監査する
grep -rn "createHash.*sha3" --include="*.ts" --include="*.js" --exclude-dir=node_modules .
grep -rn "keccak256" --include="*.ts" --include="*.js" . | grep -v node_modules

関連項目

  • EVM クライアントと keccak256 ヘルパーについては、viem-v2 と併用してください
  • EVM 以外のアドレス検証 → solana-v1

ルール

Ethereum のコンテキストでは、crypto.createHash('sha3-256') を決して使用しないでください。ethers、viem、web3、またはその他の明示的な Keccak 実装の、Keccak 対応ヘルパーを使用してください。

コメント