限制与错误
限制
| 项目 | 上限 |
|---|---|
| 每次扫描的二维码帧数 | 2,048(BBQr:1,295) |
| 每帧字符数 | 4,300 |
| 每个会话保留的扫描文本 | 1 MiB |
| 解码后的载荷(CBOR 或 PSBT) | 128 KiB |
| CBOR 嵌套层数 / 数据项 | 24 层 / 20,000 项 |
| 钱包级配对载荷(生成时) | 4,096 字节 |
| 请求 ID | 16 字节(eth-sign-request:1–64) |
| Origin | 256 个字符 |
| Bitcoin 输入和输出 | 各 1–100 个 |
| EVM calldata | 64 KiB |
| EVM 个人消息 | 1–8,192 字节 |
| EIP-712 | 32 个类型,每个类型 64 个字段,数组最多 128 项 |
| TRON 消息 | 1–8,192 字节 |
| Solana 消息(sign-type 2) | 1–1,024 字节的 UTF-8 文本 |
| Solana 交易 | 1–64 条指令,1,232 字节数据包 |
常见拒绝原因
BitTool Signer 拒绝请求时,会在扫描器或审核界面中显示一条简短消息。以下是集成方最常遇到的几种:
| 消息 | 原因 | 解决方法 |
|---|---|---|
| Unsupported signing UR type | UR 类型不是 crypto-psbt、psbt、eth-sign-request、sol-sign-request、tron-sign-request 之一 | 使用公开注册表中的类型;配对二维码无法用于签名 |
| Unsupported signing request field | map 键超出 1–7(ETH)或 1–6(SOL/TRON)的范围 | 删除自定义字段 |
| Invalid request UUID tag / requestId has invalid length | 请求 ID 没有用标签 37 包裹,或者对于 SOL/TRON 不是 16 字节 | 37(16 random bytes) |
| Signing path must be concrete | 使用了 * 通配符、空的子项,或索引 ≥ 231 | 发送完整的叶子路径,并使用 true/false 硬化标志 |
| Transaction data type does not match payload | 类型化交易使用了 data-type 1,或 legacy RLP 使用了 data-type 4 | legacy RLP 用 1,0x01/0x02 交易封装用 4 |
| Unprotected or missing-chain-ID EVM transactions are refused | legacy 交易不带 EIP-155 链 ID | 序列化时带上链 ID(v = chainId,r = s = 0) |
| Chain ID does not match the signing request | 交易、键 4 和/或 EIP-712 domain 中的链 ID 不一致 | 使所有链 ID 保持一致 |
| Unsupported network | 链 ID 不在支持的八个 EVM 网络之内,或请求不是主网的 | 使用支持的网络 |
| Typed message has extra unsigned or missing fields | message 的字段与声明的类型不一致 | 只发送声明的字段,不多也不少 |
| Use strings for large typed integers | EIP-712 数据中有超过 253 的 JSON 数字 | 将其编码为十进制字符串 |
| Full previous transactions (nonWitnessUtxo) are required … | SegWit v0 或 legacy 输入缺少 nonWitnessUtxo | 添加完整的前序交易 |
| Only SIGHASH_ALL or Taproot SIGHASH_DEFAULT is accepted | 某个输入使用了其他 sighash 类型 | 使用 SIGHASH_ALL |
| No unsigned input belongs to this wallet … | 没有任何输入带有该钱包密钥的 bip32Derivation | 添加带有正确指纹和路径的派生数据 |
| Exactly one TRON contract is supported per transaction | raw_data.contract 中有 0 个或多个条目 | 每笔交易只包含一个合约 |
| TRON contract calls require an explicit fee limit | TriggerSmartContract 缺少 fee_limit | 设置 fee_limit |
| Invalid TRON timestamp or expiration | 缺少 timestamp,或 expiration ≤ timestamp | 使用你的节点返回的值 |
| Address lookup tables require independently trusted account data … | 带查找表的 v0 Solana 消息 | 使用静态账户密钥编译 |
| This wallet is not a required signer in the transaction | 键 4 不在消息的必需签名者之中 | 使用必须签名的那个账户 |
| Solana message prefix could represent a transaction header | 对看起来像交易的字节使用了 sign-type 2 | 交易请使用 sign-type 1 |
| Mixed UR fountain sessions / Multiple unrelated QR payloads | 一次扫描中混入了两个不同二维码的帧 | 一次只显示一个请求 |
错误文本只来自引擎自身的检查。意外异常会被报告为通用错误,因此恶意载荷无法向签名器界面注入文本。
匹配结果
在提示输入密码之前,请求会与手机上的钱包进行匹配。只有 ready 状态才可以签名:
| 状态 | 含义 |
|---|---|
ready | 恰好有一个钱包持有该密钥;签名任务已确定 |
noMatch | 这部手机上没有任何钱包持有所请求的密钥(指纹或路径错误,或钱包尚未导入) |
missingSigner | 请求没有说明应由哪个密钥签名(既没有派生数据,也没有地址) |
ambiguous | 有多个钱包符合条件,例如同一组助记词被导入了两次 |
setupRequired | 某个钱包的公开数据需要重建(需输入一次密码) |
invalid | 请求的结构无效 |