BTC PSBT
Bitcoin Air-Gap 流程通常围绕 PSBT 展开:应用构建未签名或部分签名的 PSBT,设备离线补充签名,最后由应用完成交易并广播。
数据项
- 请求与响应 UR 类型:
crypto-psbt - 另见:基础 API(通用 UR 数据结构)
步骤
- 由钱包或后端构建未签名 PSBT。
- 将 PSBT 编码为
crypto-psbtUR,并渲染为动画二维码。 - UKey Wallet 扫描后在离线状态下签名,并返回新的
crypto-psbt。 - 应用解析响应,完成交易组装并广播。
提示:请将 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
// 继续补完交易并发到链上
}