EthSignRequest
EthSignRequest 用于描述 Ethereum 或 EVM 兼容链的离线签名请求。它会把待签名数据、签名类型、链 ID、派生路径和请求来源打包为 UR,供设备扫描确认。
DataType 枚举
enum DataType {
transaction = 1, // Legacy 交易,对应 RLP 编码的未签名数据
typedData = 2, // EIP-712 类型数据,对应 JSON 字符串字节
personalMessage = 3, // 个人消息的签名场景
typedTransaction = 4, // 类型化交易,例如 EIP-1559
}
入参
| 字段 | 值类型 | 用途 |
|---|---|---|
requestId | Buffer | 请求唯一标识,通常来自 UUID |
signData | Buffer | 待签名数据 |
dataType | DataType | 说明 signData 的签名类型 |
chainId | number | EVM 链 ID,可选 |
derivationPath | CryptoKeypath | 本次签名使用的账户路径 |
address | Buffer | 预期签名地址,可选 |
origin | string | 发起请求的应用名称或来源,可选 |
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 解码响应。