New to Claude Skills? Learn how to install them →

affaan-m on GitHub

Node.js Keccak-256

Free

Prevent Ethereum hash bugs in JavaScript and TypeScript.

Get this skill

Free · Opens the source repo

What Node.js Keccak-256 does

The Node.js Keccak-256 skill is designed to help developers avoid common pitfalls when working with Ethereum hashes in JavaScript and TypeScript. It addresses a critical issue where the Node.js built-in crypto.createHash('sha3-256') method implements the NIST SHA3 variant, which differs from the Ethereum-specific Keccak-256 hashing algorithm. This discrepancy can lead to incorrect calculations of function selectors, signatures, and storage slots, ultimately compromising the integrity of Ethereum applications.

This skill provides clear guidance on when to use the Keccak-256 hashing function, particularly in scenarios involving Ethereum function selectors, event topics, and other cryptographic operations. It emphasizes the importance of using libraries such as ethers, viem, or web3 for accurate hashing, rather than relying on Node's default crypto library. The skill includes practical code examples that illustrate how to implement Keccak-256 correctly, ensuring developers can seamlessly integrate this hashing method into their projects.

By using this skill, developers can enhance the reliability of their Ethereum-related applications, avoiding subtle bugs that arise from using the wrong hashing algorithm. The skill is particularly useful for those involved in building smart contracts, decentralized applications, or any project that interacts with Ethereum's blockchain. It serves as a valuable reference for both new and experienced developers, providing insights into best practices for Ethereum hashing in JavaScript and TypeScript environments.

When to use it

Use this skill when developing Ethereum applications in JavaScript or TypeScript, especially for hashing operations.

When not to use it

This skill is not necessary for projects that do not involve Ethereum or for developers who are already using the correct Keccak-256 implementations.

What you can build with it

Calculating Ethereum Function Selectors

Use the skill to accurately compute function selectors for Ethereum smart contracts, ensuring correct interactions.

Building EIP-712 Signatures

Implement EIP-712 signatures in your applications by utilizing the correct Keccak-256 hashing functions.

Auditing Code for Hashing Issues

Review your codebase for potential hashing issues by following the guidelines and examples provided in this skill.

How to install Node.js Keccak-256

View source

1. Install with the skills CLI

npx skills add affaan-m/ecc/nodejs-keccak256 --agent claude-code

2. Or install it manually

Download the skill folder and drop it into ~/.claude/skills/ for all projects, or .claude/skills/ to scope it to one repo. Restart Claude Code so it picks up the new skill.

Anthropic's agentic coding CLI, and the reference implementation of Agent Skills. Drop a skill folder into ~/.claude/skills and Claude Code loads it automatically whenever a task matches the skill's description. Claude Code docs

Inside SKILL.md

Written by affaan-m

Node.js Keccak-256

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

使用するタイミング

  • 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

ルール

Ethereumコンテキストでは、crypto.createHash('sha3-256')を絶対に使用しない。ethersviemweb3、または別の明示的なKeccak実装のKeccak対応ヘルパーを使用すること。

Frequently asked questions about Node.js Keccak-256

Similar skills