本页目录
ETHSignature
ETHSignature 用于解码设备返回的以太坊签名。类名中的 ETH 必须大写。
参数
构造函数接收 signature: Buffer,以及可选的 requestId: Buffer 和 origin: string。
解码响应
每次扫描会话创建一个新的解码器,并对每个摄像头帧调用 onSignatureFrame。保留原请求的 expectedRequestId,不要接受其他请求的签名。
import { URDecoder } from '@ngraveio/bc-ur';
import { ETHSignature } from '@keystonehq/bc-ur-registry-eth';
const decoder = new URDecoder();
function onSignatureFrame(frame: string, expectedRequestId: string) {
decoder.receivePart(frame);
if (decoder.isError()) {
throw new Error('Could not decode the signature QR code');
}
if (!decoder.isSuccess()) return;
const ur = decoder.resultUR();
if (ur.type !== 'eth-signature') {
throw new Error('Expected an eth-signature response');
}
const result = ETHSignature.fromCBOR(ur.cbor);
const expectedId = Buffer.from(expectedRequestId.replace(/-/g, ''), 'hex');
const receivedId = result.getRequestId();
if (!receivedId || !receivedId.equals(expectedId)) {
throw new Error('Signature request ID does not match');
}
const signature = result.getSignature();
if (signature.length !== 65) {
throw new Error('Expected a 65-byte Ethereum signature');
}
return {
r: signature.subarray(0, 32),
s: signature.subarray(32, 64),
v: signature[64],
};
}使用以太坊库,按原始交易类型和链解释 v、恢复签名者并组装已签名交易。必须使用发送给设备的同一笔未签名交易,不要把签名附加到重新构造或修改过的交易上。
签名格式
签名共 65 字节:r 和 s 各占 32 字节,最后 1 字节为 v。请按原始交易类型和链解释 v。
最后更新于