想让你的去中心化应用在比特币 Signet 测试网上丝滑运行?这篇 2025 最新升级版的 Signet Provider API 教程一次性讲透「连接钱包、签名消息、批量签名 PSBT」全流程,专为中文开发者和产品经理量身打造。
Signet Provider API 到底能做什么?
Signet Provider API(业内昵称 Injection API)是一套由扩展钱包注入到网页里的 JavaScript 接口。借助它,前端 DApp 能够:
- 连接测试链:直接请求用户的比特币 Signet 钱包地址与公钥。
- 读取链上数据:无需自建节点就能得到账户余额或交易列表。
- 安全签名:无论是普通文本消息还是复杂的多输入 PSBT,都能一键让用户确认。
一句话总结:Signet Provider 就是能让网页里跑原生比特币 Signet 交易的「万能胶水」。
⚠️ 当前功能需要钱包扩展 ≥ 2.82.32 版本,旧客户端会直接返回 undefined。
第一条调用:connect() 打通钱包
核心关键词:connect、连接钱包、Signet
await okxwallet.bitcoinSignet.connect()参数与返回值
| 名称 | 类型 | 说明 |
|---|---|---|
| 无 | — | 无需任何参数 |
| address | string | 返回用户当前选中的 Signet 地址 |
| publicKey | string | 32 字节压缩公钥 |
实战场景
很多新手把 connect() 误以为需要传参,结果在控制台打出 undefined。实际上,只需一句 await,页面就能自动唤起钱包授权弹窗。
安全提醒: 授权信息只在当前标签页会话有效,刷新页面即失效。
房屋地基:签名消息 signMessage()
核心关键词:signMessage、签名消息、ECDSA、BIP-322
await okxwallet.bitcoinSignet.signMessage('登录验证码123', 'ecdsa')
await okxwallet.bitcoinSignet.signMessage('登录验证码123', 'bip322-simple')signStr:任意 UTF-8 字符串,前端常用作登录挑战信息。type:可选字段ecdsa:生成传统签名,轻量快速,浏览器兼容性更好。bip322-simple:生成可验证原生脚本的签名,更适合链上记录。
两种类型 哈希算法与编码格式不同,别在库里混用。若第一次开发拿不准,用默认的 ecdsa 即可。
集中行动:单 PSBT 与批 PSBT 签名技巧
signPsbt() — 单交易精修模式
核心关键词:PSBT、签名 Taproot、sighashTypes
const signed = await okxwallet.bitcoinSignet.signPsbt(psbtHex, {
autoFinalized: false,
toSignInputs: [
{ index: 0, address: 'tb1p...' },
{ index: 1, publicKey: userPubKeyBuffer }
],
sighashTypes: [1, 3],
disableTweakSigner: false
})零弯头 FAQ
- Q:为什么提示“Missing publicKey for Taproot input”?
A:Taproot 地址生成签名时需要自带公钥,必须在toSignInputs里显式给出publicKey。 - Q:自动 final 还是不 final?】
A:仅需继续编辑 PSBT 就选autoFinalized:false;多数场景直接默认true省事。
signPsbts() — 多交易流水线
const signedArray = await okxwallet.bitcoinSignet.signPsbts([psbt1, psbt2], [
{
toSignInputs: [
{ index: 0, address: 'tb1p...' }
]
},
{
toSignInputs: [
{ index: 0, address: 'tb1q...' },
{ index: 2, publicKey: userPubKeyBuffer }
]
}
])批量签名把 signPsbt() 拆成数组输入,提高一次性 UTXO 清算效率,常被空投脚本和 NFT 铸造工厂用于节省用户点击次数。
快速调试:3 个必踩坑
- CORS 警告
只在本地启动一个http-server可能报错。请务必使用 HTTPS 或localhost证书。 - 扩展识别失败
windows 对象没有okxwallet?可能是用户禁用了内容脚本或使用了夜间版 Canary,引导用户重启浏览器即可。 - PSBT 格式错误
十六进制字符串需忽略空格,且务必大写0x前缀会被钱包自动去除,别再手滑加回。
高频 FAQ 速查
Q1:Signet 主网或 Testnet 能否复用同一套 API?
A:不能。Signet 专属命名空间为 bitcoinSignet,用错会直接 undefined。
Q2:如何让网页识别不出来 Signet,自动降级?
A:在 try/catch 里检测 okxwallet.bitcoinSignet;没有时提示“当前网络不支持”。
Q3:签名完成后怎样广播交易?
A:Provider API 只负责签名,广播仍需自建节点 或第三方 API。👉 点击这里查看无需搭建节点就能一键广播的极简方案。
Q4:能否一次性请求不同地址签名?
A:可以。只需在 toSignInputs 指定不同 address/publicKey,钱包会逐一匹配并生成签名。
Q5:Taproot 与 P2WPKH 的 PSBT 参数有什么不同?
A:Taproot 多了 disableTweakSigner 选项;P2WPKH 无需添加 publicKey,但两者都支持 sighashTypes。
Q6:移动端是否支持?
A:目前仅桌面浏览器扩展。移动端计划 2025 Q3 开放内测,敬请期待。
进阶实战:构建一个「零后端」NFT 铸造页
场景设定:用户前端上传图片 → 生成元数据 → 拼成 PSBT → 用户点击铸造。
代码片段:
// 1. 拿地址
const { address, publicKey } = await okxwallet.bitcoinSignet.connect()
// 2. 获取最新 UTXO(示例使用 fetch)
const utxo = await fetch(`/api/utxo/${address}`).then(r => r.json())
// 3. 组装 PSBT
const psbt = buildNftPsbt(address, publicKey, utxo)
// 4. 签名
const signedHex = await okxwallet.bitcoinSignet.signPsbt(psbt)
// 5. 前端广播
await fetch('https://blockstream.info/signet/api/tx', {
method: 'POST',
body: signedHex
})在线源码已在 README 开源,复制即可跑通。👉 直达开源仓库——无需任何后端即可秒发 NFT。
结语与下一步
读到这里,你已经掌握了从连接 Signet 钱包到批量签名 PSBT 的全部核心 API。下一步建议:
- 立即本地试跑一次
signPsbt(),观察返回的十六进制字符串格式。 - 把
connect()封装到单页面组件里,优雅地处理“未安装扩展”场景。 - 写下固化日志
console.log('Signet 地址:', address),方便 QA 快速定位。
Signet Provider API 的中文开发者社区正在极速扩张,任何疑问欢迎在官方论坛提问,或者用本文示例直接撸一个 Demo 打怪升级。祝编码愉快,链上见!