跳到主要内容

EthSignRequest

EthSignRequest 用于描述 Ethereum 或 EVM 兼容链的离线签名请求。它会把待签名数据、签名类型、链 ID、派生路径和请求来源打包为 UR,供设备扫描确认。

DataType 枚举

enum DataType {
transaction = 1, // Legacy 交易,对应 RLP 编码的未签名数据
typedData = 2, // EIP-712 类型数据,对应 JSON 字符串字节
personalMessage = 3, // 个人消息的签名场景
typedTransaction = 4, // 类型化交易,例如 EIP-1559
}

入参

字段值类型用途
requestIdBuffer请求唯一标识,通常来自 UUID
signDataBuffer待签名数据
dataTypeDataType说明 signData 的签名类型
chainIdnumberEVM 链 ID,可选
derivationPathCryptoKeypath本次签名使用的账户路径
addressBuffer预期签名地址,可选
originstring发起请求的应用名称或来源,可选

UR例子

UR:ETH-SIGN-REQUEST/ONADTPDAGDSWNNYAHGTOKPFPIAPANNROLNSAVYDTHHAOHDECAOWFLYLDLFAAUELPATAEGWSOLALPBAVYGUYTHNLFGMAYMWSGBYZOIYHTRDCFBANBFPBNDSPRJPNSDLGLBYIMJELTCNLNWZJLSEAEAELARTAXAAAACSLDAHTAADDYOEADLECSDWYKCSFNYKAEYKAEWKADWKAOCYTIZSYLCNSSDKGOCA

示范

EIP-1559 交易

import { KeystoneEthereumSDK } from "@keystonehq/keystone-sdk";

const eth = new KeystoneEthereumSDK();
const ur = eth.generateSignRequest({
requestId, // UUID 字符串
signData: unsignedTxHex, // 这里传不含 0x 的十六进制字符串
dataType: 4, // typedTransaction value
path: "m/44'/60'/0'/0/0",
xfp: "12345678",
chainId: 1,
origin: "sample-client",
});
// 把 UR 编码成动态二维码帧并展示

Legacy 交易

const ur = eth.generateSignRequest({
requestId,
signData: unsignedLegacyHex,
dataType: 1, // transaction value
path: "m/44'/60'/0'/0/0",
xfp: "12345678",
chainId: 1,
origin: "sample-client",
});

EIP-712 TypedData

const dataHex = Buffer.from(typedDataJson, "utf8").toString("hex");
const ur = eth.generateSignRequest({
requestId,
signData: dataHex,
dataType: 2, // typedData value
path: "m/44'/60'/0'/0/0",
xfp: "12345678",
origin: "sample-client",
});

Personal Message

const dataHex = Buffer.from(message, "utf8").toString("hex");
const ur = eth.generateSignRequest({
requestId,
signData: dataHex,
dataType: 3, // personalMessage value
path: "m/44'/60'/0'/0/0",
xfp: "12345678",
origin: "sample-client",
});

下一步

设备签名后,使用 EthSignature 解码响应。