nodejs-keccak256 — скилл для Claude: хеши Ethereum без ошибок
Ловит подмену Keccak-256 на NIST SHA3 в JS и TS. Пригодится, когда селектор, подпись или слот хранилища считаются неверно.
npx skills add affaan-m/ECC --skill nodejs-keccak256 -a claude-codeЧто делает nodejs-keccak256
Node отдаёт crypto.createHash('sha3-256'), а это NIST SHA3, не Ethereum Keccak-256. Для одного и того же входа алгоритмы дают разные хеши, и Node об этом молчит. Селекторы функций, темы событий, EIP-712, Merkle и слоты хранилища ломаются тихо — код работает, значения не те.
Скилл показывает, как считать хеши через ethers v6, viem и web3.js: keccak256, toUtf8Bytes, solidityPackedKeccak256, id, AbiCoder. Есть готовые шаблоны для селектора, typeHash, слота маппинга и адреса из публичного ключа. Для проверки проекта в скилле лежат две команды grep по createHash.*sha3 и по всем keccak256 вне node_modules.
Ставить стоит, если в проекте есть JS или TS рядом с Ethereum. Если хеширование живёт только в Solidity или через готовую библиотеку без самодельных хелперов, скилл ничего не изменит.
Какие задачи решает
- найти в кодовой базе вызовы
createHash('sha3-256') - посчитать селектор функции и тему события правильно
- собрать слот хранилища для маппинга
- вывести адрес из публичного ключа
- проверить хелперы для EIP-712 и Merkle на Keccak-256
Примеры запросов агенту
- проверь, где в проекте хешируют данные Ethereum через Node crypto
- посчитай селектор для `transfer(address,uint256)` через ethers
- напиши функцию для слота маппинга на `AbiCoder`
Как установить nodejs-keccak256
1Через Skills CLI (Vercel)
npx skills add affaan-m/ECC --skill nodejs-keccak256 -a claude-code2Вручную: положить файлы
~/.claude/skills/nodejs-keccak256/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/nodejs-keccak256/
1Через Skills CLI (Vercel)
npx skills add affaan-m/ECC --skill nodejs-keccak256 -a codex2Вручную: положить файлы
.agents/skills/nodejs-keccak256/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add affaan-m/ECC --skill nodejs-keccak256 -a cursor2Вручную: положить файлы
.cursor/skills/nodejs-keccak256/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install affaan-m/ECC nodejs-keccak2562Вручную: положить файлы
.github/skills/nodejs-keccak256/SKILL.md1Через Skills CLI (Vercel)
npx skills add affaan-m/ECC --skill nodejs-keccak256 -a gemini-cli2Командой платформы
gemini skills install https://github.com/affaan-m/ECC --path skills/nodejs-keccak256Вручную: положить файлы
.devin/skills/nodejs-keccak256/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add affaan-m/ECC --skill nodejs-keccak256 -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
Из того же набора146
Весь набор →Похожие
Вопросы о nodejs-keccak256
Как установить nodejs-keccak256 в Claude?
Выполни npx skills add affaan-m/ECC --skill nodejs-keccak256 -a claude-code. Файл скилла окажется по пути ~/.claude/skills/nodejs-keccak256/SKILL.md.
Что делает nodejs-keccak256?
Объясняет разницу между NIST SHA3 и Ethereum Keccak-256 и даёт примеры хеширования через ethers, viem и web3.js. Плюс команды grep для поиска опасных мест в проекте.
Почему `crypto.createHash('sha3-256')` не подходит для Ethereum?
Node реализует стандартизированный NIST SHA3, а Ethereum использует Keccak-256. Выход для одного входа разный, и предупреждения не будет.
Исходный текст
SKILL.md · MIT
---
name: nodejs-keccak256
description: 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.
metadata:
version: "1.0.0"
origin: ECC direct-port adaptation
---
# 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 · MIT · affaan-m/ECC