@casper-ecosystem/casper-eip-712

中文文档
1.2.1发布于 2026/05/14Apache-2.0TypeScriptESM + CJS构建来源已验证近 30 天下载 1.3万

EIP-712 为卡斯珀网络打入的数据散列和验证

中文使用文档
文档目录7 节
  1. 安装
  2. 快开始
  3. Casper 特定域
  4. 构建犬类类型字符串
  5. 破烂的便利助手
  6. API 表面
  7. 发展

@casper-生态系统/casper-eip-712

Rust 的脚本配套软件包 casper-eip-712 货箱.

它提供EIP-712打入的数据散列加上Casper导向流的ECDSA签名恢复,包括当提供显域类型时支持Casper特定域.

安装

npm install @casper-ecosystem/casper-eip-712

快开始

import {
  hashTypedData,
  recoverTypedDataSigner,
  verifySignature,
  PermitTypes,
  type PermitMessage,
} from "@casper-ecosystem/casper-eip-712";

const domain = {
  name: "My Token",
  version: "1",
  chainId: 1,
  verifyingContract: "0x1111111111111111111111111111111111111111",
};

const message: PermitMessage = {
  owner: "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  spender: "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
  value: "0x01",
  nonce: "0x00",
  deadline: "0xffff",
};

const signature = new Uint8Array(65); // Illustrative placeholder only; use a real 65-byte signature in production.
const digest = hashTypedData(domain, PermitTypes, "Permit", message);
const signer = recoverTypedDataSigner(domain, PermitTypes, "Permit", message, signature);
const isValid = verifySignature(digest, signature, "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");

Casper 特定域

如果您的域使用 Casper 等特定字段 chain_name 或者说 contract_package_hash,通过明确 domainTypes 因此,软件包知道 预定域计划.

这个 chain_name 建议改为: CAIP-2 联合国 窗体的链式 id casper:<chainspec_name> - 比如说 casper:casper 主网和 casper:casper-test 为测试网.

import { hashTypedData } from "@casper-ecosystem/casper-eip-712";

const domain = {
  name: "CSPR",
  version: "1",
  chain_name: "casper:casper-test",
  contract_package_hash:
    "0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
};

const digest = hashTypedData(domain, types, "Permit", message, {
  domainTypes: [
    { name: "name", type: "string" },
    { name: "version", type: "string" },
    { name: "chain_name", type: "string" },
    { name: "contract_package_hash", type: "bytes32" },
  ],
});

构建犬类类型字符串

当您需要初级类型使用的 EIP-712 犬类字串时 buildCanonicalTypeString它按照EIP-712光谱的要求,解决了嵌入式结构依赖并按字母顺序附后.

import { buildCanonicalTypeString, computeTypeHash } from "@casper-ecosystem/casper-eip-712";

const types = {
  Person: [
    { name: "name", type: "string" },
    { name: "wallet", type: "address" },
  ],
  Mail: [
    { name: "from", type: "Person" },
    { name: "to", type: "Person" },
    { name: "contents", type: "string" },
  ],
};

const typeString = buildCanonicalTypeString("Mail", types);
// "Mail(Person from,Person to,string contents)Person(string name,address wallet)"

const typeHash = computeTypeHash(typeString);

破烂的便利助手

对于想要从"Rust"箱子中取出下层形状的呼叫者,包裹也暴露出:

import {
  buildDomain,
  CASPER_DOMAIN_TYPES,
  computeTypeHash,
  encodeAddress,
  encodeUint256,
  hashTypedDataRaw,
} from "@casper-ecosystem/casper-eip-712";

const domain = buildDomain(
  "CasperToken",
  "1",
  "casper:casper-test",
  "0x7777777777777777777777777777777777777777777777777777777777777777",
);

const typeHash = computeTypeHash(
  "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)",
);

const encodedStruct = new Uint8Array(32 * 5);
encodedStruct.set(encodeAddress("0x2222222222222222222222222222222222222222"), 0);
encodedStruct.set(encodeAddress("0x3333333333333333333333333333333333333333"), 32);
encodedStruct.set(encodeUint256(1n), 64);
encodedStruct.set(encodeUint256(0n), 96);
encodedStruct.set(encodeUint256(999999n), 128);

const digest = hashTypedDataRaw(domain, typeHash, encodedStruct, {
  domainTypes: CASPER_DOMAIN_TYPES,
});

API 表面

  • buildDomain(name, version, chainName, contractPackageHash)
  • hashDomainSeparator(domain, domainTypes?)
  • hashStruct(primaryType, types, message)
  • hashTypedData(domain, types, primaryType, message, options?)
  • hashTypedDataRaw(domain, typeHash, encodedStruct, options?)
  • buildCanonicalTypeString(primaryType, types)
  • computeTypeHash(typeString)
  • recoverAddress(digest, signature)
  • recoverTypedDataSigner(domain, types, primaryType, message, signature, options?)
  • verifySignature(digest, signature, expectedAddress)
  • 编码助手 : encodeAddress, (中文(简体) ), encodeUint256, (中文(简体) ), encodeUint64, (中文(简体) ), encodeBytes32, (中文(简体) ), encodeBytes, (中文(简体) ), encodeString, (中文(简体) ), encodeBool, (中文(简体) ), encodeField
  • 域名助手 : CASPER_DOMAIN_TYPES, (中文(简体) ), buildDomainTypeString
  • 预建信件类型 : PermitTypes, (中文(简体) ), ApprovalTypes, (中文(简体) ), TransferTypes

发展

npm test
npm run build

不同语言的对等性由测试矢量覆盖 ../tests/vectors.json。 。 。 .

版本与发布记录

@casper-ecosystem/casper-eip-712 共发布 5 个版本,首次发布于 2026/03/17;过去 12 个月发布了 5 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
1.2.1latest2026/05/145 个月前
1.2.02026/04/266 个月前
1.1.02026/04/106 个月前
1.0.12026/03/187 个月前
1.0.02026/03/177 个月前

关于 @casper-ecosystem/casper-eip-712 的常见问题

@casper-ecosystem/casper-eip-712 是什么?

EIP-712 为卡斯珀网络打入的数据散列和验证

如何安装 @casper-ecosystem/casper-eip-712?

在项目目录运行 npm install @casper-ecosystem/casper-eip-712,或使用 pnpm add / yarn add / bun add。

@casper-ecosystem/casper-eip-712 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@casper-ecosystem/casper-eip-712 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@casper-ecosystem/casper-eip-712 可以商用吗?

@casper-ecosystem/casper-eip-712 使用 Apache-2.0 许可。宽松许可:允许商业使用、修改和再分发,并附带明确的专利授权;分发时需保留许可与 NOTICE 文件,修改过的文件要注明改动。以上为概括,不构成法律意见,请以许可原文为准。

@casper-ecosystem/casper-eip-712 的下载量有多少?

根据 npm 官方下载统计,@casper-ecosystem/casper-eip-712 在 2026/10/09 – 2026/11/07 这 30 天内被下载 13,017 次,日均约 434 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@casper-ecosystem/casper-eip-712 还在维护吗?

最新版本 1.2.1 发布于 2026/05/14(5 个月前);至今共发布 5 个版本,其中过去 12 个月发布了 5 个;首次发布于 2026/03/17。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。