mcpField
N
nodejs-keccak256-v1

nodejs-keccak256-v1

github.com/blockmatic开发1220 次安装5 周前更新
代码仓库

关于 nodejs-keccak256-v1

面向 Node.js 和 TypeScript 开发者的 Ethereum Keccak-256 指南,说明它与 Node.js SHA3-256 的区别。涵盖常见 Ethereum 哈希场景,并强调不要将其用于 SHA-256 应用。

主要功能

  1. 01区分 Keccak-256 与 SHA3-256
  2. 02Ethereum 函数选择器与事件主题
  3. 03EIP-712、签名与 Merkle 哈希
  4. 04存储槽与地址推导示例
  5. 05viem、ethers 和 web3.js 用法

适用场景

  1. 01计算合约函数选择器和事件主题
  2. 02编写 EIP-712 或 Merkle 工具
  3. 03审查 Ethereum 数据哈希实现
  4. 04检查代码中的 SHA3-256 用法

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/blockmatic/basilic-skills --skill nodejs-keccak256-v1

安装后在 Claude Code 中输入/nodejs-keccak256-v1确认已加载。

详细介绍

Node.js Keccak-256

Ethereum 使用的是 Keccak-256,而不是 Node 的 crypto.createHash('sha3-256') 所提供的 NIST 标准化 SHA3 变体。

**范围:**仅限 Ethereum 哈希操作——函数选择器、事件主题、EIP-712、Merkle 证明、存储槽、地址推导。

**绝对不要:**重写用于 JWT 令牌、OAuth PKCE、API 密钥或其他应用机密的 Node createHash('sha256')。Keccak 不是 SHA-256。

**优先使用:**如果项目已依赖 viem,则使用其中的 keccak256。仅当应用已依赖 ethers 时才使用它。

适用场景

  • 计算 Ethereum 函数选择器或事件主题
  • 在 JS/TS 中构建 EIP-712、签名、Merkle 或存储槽辅助工具
  • 审查任何直接使用 Node crypto 对 Ethereum 数据进行哈希的代码

工作原理

对于相同的输入,这两种算法会产生不同的输出,而且 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

交互

  • 与 viem-v2 配合使用,获取 EVM 客户端和 keccak256 辅助工具
  • 非 EVM 地址验证 → solana-v1

规则

在 Ethereum 场景中,绝不要使用 crypto.createHash('sha3-256')。请使用 ethers、viem、web3 中支持 Keccak 的辅助工具,或其他明确实现 Keccak 的工具。

评论

支持 Markdown