SuperAPI AI 工具集

nodejs-keccak256

编程与开发

查看项目

更新于 10-15 08:37

技能介绍

用途

nodejs-keccak256 用于帮助 JavaScript / TypeScript 开发者避免以太坊哈希计算中的一类隐蔽错误:以太坊使用 Keccak-256,而不是 Node.js crypto.createHash('sha3-256') 所暴露的 NIST 标准化 SHA3 变体。两者对同一输入输出不同,Node 不会发出警告,因此容易静默破坏函数选择器、签名、事件主题等以太坊相关数据。

何时需要关注

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

主要能力与示例

条目通过示例说明差异:

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

并分别给出各库的 Keccak 用法:

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

规则

在以太坊上下文中,绝不要使用 crypto.createHash('sha3-256')。应使用 ethers、viem、web3 或其他明确的 Keccak 实现所提供的具备 Keccak 感知能力的辅助函数。

限制

条目未提供关于平台、收费、价格或具体使用步骤的额外信息。