@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。 。 。 .