跳到主要内容

BTC PSBT

Bitcoin Air-Gap 流程通常围绕 PSBT 展开:应用构建未签名或部分签名的 PSBT,设备离线补充签名,最后由应用完成交易并广播。

数据项

  • 请求与响应 UR 类型:crypto-psbt
  • 另见:基础 API(通用 UR 数据结构)

步骤

  1. 由钱包或后端构建未签名 PSBT。
  2. 将 PSBT 编码为 crypto-psbt UR,并渲染为动画二维码。
  3. UKey Wallet 扫描后在离线状态下签名,并返回新的 crypto-psbt
  4. 应用解析响应,完成交易组装并广播。

提示:请将 PSBT 控制在实际二维码可承载的大小范围内;如有需要,可拆分为多帧进行传输。

示范

将未签名 PSBT 编码为动画二维码

import { CryptoPSBT } from "@keystonehq/bc-ur-registry-btc";
import { airGapUrUtils } from "@keystonehq/keystone-sdk";

const psbtBytes = Buffer.from(unsignedPsbtBase64, "base64");
const req = CryptoPSBT.fromPSBT(psbtBytes); // 也能直接写成 new CryptoPSBT(psbtBytes)
const ur = req.toUR();
const frames = airGapUrUtils.urToQrcode(ur); // 把这些帧渲染到界面上

将动画二维码解码为已签名 PSBT

import { URDecoder } from "@ngraveio/bc-ur";
import { CryptoPSBT } from "@keystonehq/bc-ur-registry-btc";

const dec = new URDecoder();
// 相机每扫到一帧二维码时:
// hand frameString to dec.receivePart for each frame

if (dec.isComplete()) {
const ur = dec.resultUR(); // 解出来的 ur.type 应该是 'crypto-psbt'
const psbt = CryptoPSBT.fromCBOR(ur.cbor);
const signedPsbt = psbt.getPSBT(); // 得到已签名或部分签名的 PSBT Buffer
// 继续补完交易并发到链上
}