限制與錯誤
限制
| 項目 | 限制 |
|---|---|
| 每次掃描的 QR 幀數 | 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 之一 | 使用公開 registry 中的類型;配對 QR Code 無法用於簽名 |
| 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 搭配型別化交易,或 data-type 4 搭配 legacy RLP | legacy RLP 使用 1,0x01/0x02 封裝使用 4 |
| Unprotected or missing-chain-ID EVM transactions are refused | 沒有 EIP-155 chain ID 的 legacy 交易 | 帶入 chain ID 進行序列化(v = chainId,r = s = 0) |
| Chain ID does not match the signing request | 交易、鍵 4 和/或 EIP-712 domain 不一致 | 讓所有 chain ID 保持一致 |
| Unsupported network | chain 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 … | 使用 lookup table 的 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 | 一次掃描中混入了兩個不同 QR Code 的幀 | 一次只顯示一個請求 |
錯誤文字只來自引擎自身的檢查。非預期的例外會以通用錯誤回報,因此惡意酬載無法將文字注入簽名器的介面。
比對結果
在要求輸入密碼之前,請求會先與手機上的錢包進行比對。只有 ready 狀態可以簽名:
| 狀態 | 意義 |
|---|---|
ready | 恰好有一個錢包持有該金鑰;簽名工作已確定 |
noMatch | 這支手機上沒有任何錢包具有所請求的金鑰(指紋或路徑錯誤,或錢包尚未匯入) |
missingSigner | 請求沒有指明應由哪把金鑰簽名(沒有衍生資料,也沒有地址) |
ambiguous | 有多個錢包符合,例如同一組助記詞匯入了兩次 |
setupRequired | 某個錢包的公開資料需要重建(輸入一次密碼) |
invalid | 請求的結構無效 |