Catalog
affaan-m/nodejs-keccak256

affaan-m

nodejs-keccak256

Prevent Ethereum hashing bugs in JavaScript and TypeScript. Node's sha3-256 is NIST SHA3, not Ethereum Keccak-256, and silently breaks selectors, signatures, storage slots, and address derivation. Use when hashing for Ethereum in JavaScript or TypeScript, or when a selector, signature, storage slot, or derived address is wrong.

NewUpdated Sep 9, 2026

Node.js Keccak-256

Ethereum uses Keccak-256, not the NIST-standardized SHA3 variant exposed by Node's crypto.createHash('sha3-256').

When to Use

  • Computing Ethereum function selectors or event topics
  • Building EIP-712, signature, Merkle, or storage-slot helpers in JS/TS
  • Reviewing any code that hashes Ethereum data with Node crypto directly

How It Works

The two algorithms produce different outputs for the same input, and Node will not warn you.

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

Examples

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' },
);

Common patterns

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]),
  );
}

Address from public key

import { keccak256 } from 'ethers';

function pubkeyToAddress(pubkeyBytes: Uint8Array): string {
  const hash = keccak256(pubkeyBytes.slice(1));
  return '0x' + hash.slice(-40);
}

Audit your codebase

grep -rn "createHash.*sha3" --include="*.ts" --include="*.js" --exclude-dir=node_modules .
grep -rn "keccak256" --include="*.ts" --include="*.js" . | grep -v node_modules

Rule

For Ethereum contexts, never use crypto.createHash('sha3-256'). Use Keccak-aware helpers from ethers, viem, web3, or another explicit Keccak implementation.

Files1
1 files · 1.0 KB

Select a file to preview

Overall Score

88/100

Grade

A

Excellent

Grades are signals, not a certification. Always review a skill yourself before use.

Safety

95

Quality

85

Clarity

88

Completeness

82

Summary

This skill teaches developers how to use Keccak-256 (the cryptographic hash used by Ethereum) instead of Node.js's built-in NIST SHA3-256, which silently produces different outputs and breaks Ethereum selectors, signatures, and address derivation. It provides concrete examples across ethers, viem, and web3.js libraries and includes audit patterns to find vulnerable code.

Detected Capabilities

code pattern matchingdocumentation and guidanceexample code provisiongrep-based code audit

Trigger Keywords

Phrases that agents use to match this skill to user intent.

ethereum hashing wrongkeccak256 selectorfix sha3 bugstorage slot hashethereum address derivationeip-712 signature helper

Use Cases

  • Fix incorrect Ethereum function selectors
  • Compute correct storage slot hashes
  • Build EIP-712 signature helpers
  • Generate Merkle tree roots for Ethereum
  • Derive Ethereum addresses from public keys
  • Audit codebases for sha3-256 misuse

Quality Notes

  • Clear problem statement with concrete example showing the difference between NIST SHA3 and Keccak-256
  • Comprehensive examples across three major Ethereum libraries (ethers v6, viem, web3.js)
  • Practical patterns for common Ethereum use cases (selectors, storage slots, Merkle, address derivation)
  • Includes audit bash command to identify vulnerable code
  • Well-structured with 'When to Use', 'How It Works', and 'Rule' sections
  • Edge case coverage for different input formats (Uint8Array, strings, packed encoding)
  • MIT license provided with clear copyright
  • No file writes, network requests, or shell execution — purely advisory guidance
Model: claude-haiku-4-5-20251001Analyzed: Sep 9, 2026

Reviews

Add this skill to your library to leave a review.

No reviews yet

Be the first to share your experience.

Version History

  1. v2.0

    Contract changed: description

    ✦ AIClarifies activation guidance: adds explicit use-case triggers (selector, signature, storage slot, or derived address bugs).

    triggering2026-09-09

    LATEST
  2. v1.2

    Content updated

    ✦ AINo behavioral changes detected.

    2026-07-14

    View This Version
  3. v1.1

    Content updated

    ✦ AIAdds LICENSE file; no behavioral changes to skill instructions.

    2026-04-20

    View This Version
  4. v1.0

    2026-04-12

    View This VersionInitial version

Use affaan-m/nodejs-keccak256 in your dev environment

Command Palette

Search for a command to run...