Nodejs Keccak256

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

JavaScriptとTypeScriptにおけるEthereumハッシュバグを防ぐ。NodeのSHA3-256はNIST SHA3であり、Ethereum Keccak-256ではなく、セレクター、署名、ストレージスロット、アドレス導出を静かに破壊する。

AI 產生的概覽

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

功能
說明以太坊使用 Keccak-256,而 Node 的 crypto.createHash('sha3-256') 所提供的是 NIST 標準化的 SHA3 變體,兩者對相同輸入會產生不同輸出且不會有任何警告。它提供使用 ethers v6、viem 與 web3.js 計算雜湊、函式選擇器、事件主題、EIP-712 型別雜湊、儲存槽與位址的程式碼範例,並附上用於稽核程式庫的 grep 指令。它明確規定:在以太坊情境中絕不使用 crypto.createHash('sha3-256')。
適用情境
適用於計算以太坊函式選擇器或事件主題、在 JS/TS 中建構 EIP-712、簽章、Merkle 或儲存槽輔助函式,或審查使用 Node crypto 模組雜湊以太坊資料的程式碼時。
執行需求
需要 JavaScript/TypeScript 專案,以及範例中某個支援 Keccak 的函式庫(ethers、viem 或 web3.js)。不隨附指令碼,僅為說明與程式碼範例。

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は警告しない。

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

例

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

一般的なパターン

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

公開鍵からアドレス

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

コードベースの監査

bash
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対応ヘルパーを使用すること。

來源與署名

來源:affaan-m/ecc位於docs/ja-JP/skills/nodejs-keccak256提交ef648e0

授權條款: 無授權條款

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

檢舉或申請下架