---
id: daily-nodejs-keccak256
name: "nodejs-keccak256"
url: https://skills.yangsir.net/skill/daily-nodejs-keccak256
author: affaan-m
domain: web3
tags: ["ethereum", "cryptography", "hash", "blockchain", "smart-contracts"]
install_count: 2500
rating: 4.30 (8 reviews)
github: https://github.com/affaan-m/everything-claude-code
---

# nodejs-keccak256

> 在 Node.js 中计算以太坊 Keccak-256 哈希，用于函数选择器、事件主题、EIP-712 签名和默克尔树验证

**Stats**: 2,500 installs · 4.3/5 (8 reviews)

## Before / After 对比

### 哈希计算

**Before**:

使用 Node.js 的 SHA3-256 计算哈希，结果与以太坊不兼容，需要手动调试和修复代码

**After**:

直接使用正确的 Keccak-256 实现，结果与以太坊完全一致，避免签名验证失败

| Metric | Before | After | Change |
|---|---|---|---|
| 调试时间 | 60分钟 | 0分钟 | -100% |

## Readme

# nodejs-keccak256

# 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.
Weekly Installs530Repository[affaan-m/everyt…ude-code](https://github.com/affaan-m/everything-claude-code)GitHub Stars157.6KFirst Seen11 days agoSecurity Audits[Gen Agent Trust HubPass](/affaan-m/everything-claude-code/nodejs-keccak256/security/agent-trust-hub)[SocketPass](/affaan-m/everything-claude-code/nodejs-keccak256/security/socket)[SnykPass](/affaan-m/everything-claude-code/nodejs-keccak256/security/snyk)Installed oncodex500opencode484gemini-cli481cursor480kimi-cli480antigravity480

---
*Source: https://skills.yangsir.net/skill/daily-nodejs-keccak256*
*Markdown mirror: https://skills.yangsir.net/api/skill/daily-nodejs-keccak256/markdown*