Nodejs Keccak256

affaan-m/ECC/skills/nodejs-keccak256

作者 affaan-mef648e01899ba3e8dc6371642deaaf64b4477775無授權條款275K 個星標收錄於 2026年10月9日更新於 2026年10月9日儲存庫4 天前更新

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.

AI 產生的概覽

指導 JavaScript 與 TypeScript 開發者在以太坊雜湊中使用 Keccak-256,而非 Node 的 NIST SHA3。

功能
此技能說明以太坊使用 Keccak-256,而 Node 的 crypto.createHash('sha3-256') 實作的是 NIST SHA3 變體,兩者對相同輸入會產生不同輸出且不會有警告。它提供使用 ethers、viem 與 web3.js 計算雜湊、函式選擇器、事件主題、EIP-712 型別雜湊、儲存槽與地址的程式碼範例。它也提供用於稽核程式碼庫中錯誤 sha3 用法的 grep 指令。
適用情境
適用於在 JavaScript 或 TypeScript 中為以太坊資料做雜湊時,例如計算函式選擇器、事件主題、簽章、Merkle 樹或儲存槽。也適用於審查直接使用 Node crypto 雜湊以太坊資料的程式碼,或當選擇器、簽章、儲存槽或衍生地址出錯時。
執行需求
不包含指令碼,僅為說明與程式碼範例。依範例操作需要 JavaScript 或 TypeScript 專案,並安裝支援 Keccak 的函式庫,如 ethers、viem 或 web3.js;可選用 Node 的 crypto 模組進行比對。

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.

javascript
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

typescript
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

typescript
import { keccak256, toBytes } from 'viem';
const hash = keccak256(toBytes('hello'));

web3.js

javascript
const hash = web3.utils.keccak256('hello');const packed = web3.utils.soliditySha3(  { type: 'address', value: '0x742d35Cc6634C0532925a3b8D4C9B569890FaC1c' },  { type: 'uint256', value: '100' },);

Common patterns

typescript
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

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

Audit your codebase

bash
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.

來源與署名

來源:affaan-m/ECC位於skills/nodejs-keccak256提交ef648e0

授權條款: 無授權條款

內容歸原作者所有。SourceWeft 從公開儲存庫中收錄這些內容。

檢舉或申請下架