Skip to Content
本页目录

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。

最后更新于