
Node.js Keccak-256
FreePrevent Ethereum hash bugs in JavaScript and TypeScript.
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 source1. Install with the skills CLI
npx skills add affaan-m/ecc/nodejs-keccak256 --agent claude-code2. 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-mNode.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')を絶対に使用しない。ethers、viem、web3、または別の明示的なKeccak実装のKeccak対応ヘルパーを使用すること。
Frequently asked questions about Node.js Keccak-256
Similar skills
Python PyPI Package Builder
Streamline the process of creating and publishing Python packages.
Minecraft Plugin Development
Streamline your Minecraft server plugin creation.
MCP Server Builder
Easily build .NET MCP servers with the latest standards.
CommunityToolkit.Mvvm Messenger
Decoupled communication for ViewModels in .NET applications.
MVVM Toolkit DI
Streamline ViewModel integration with Dependency Injection in .NET.
MCP Apps Builder
Essential guidelines for MCP server development.
