上限とエラー
上限
| 対象 | 上限 |
|---|---|
| 1 回のスキャンあたりの 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) | UTF-8 テキストで 1〜1,024 バイト |
| Solana のトランザクション | 命令 1〜64 個、1,232 バイトのパケット |
よくある拒否
BitTool Signer はリクエストを拒否すると、スキャナーまたは確認画面に短いメッセージを表示します(アプリの表示は英語です)。統合時によく遭遇するものは次のとおりです。
| メッセージ | 原因 | 対処法 |
|---|---|---|
| Unsupported signing UR type | UR 型が crypto-psbt、psbt、eth-sign-request、sol-sign-request、tron-sign-request のいずれでもない | 公開レジストリの型を使う。ペアリング QR コードには署名できない |
| Unsupported signing request field | マップのキーが 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、またはレガシー RLP に 4 を指定 | レガシー RLP には 1、0x01/0x02 エンベロープには 4 |
| Unprotected or missing-chain-ID EVM transactions are refused | EIP-155 のチェーン ID のないレガシートランザクション | チェーン ID を含めてシリアライズする(v = chainId、r = s = 0) |
| Chain ID does not match the signing request | トランザクション、キー 4、EIP-712 ドメインの間で値が一致しない | すべてのチェーン ID を一致させる |
| Unsupported network | チェーン ID が対応する 8 つの EVM ネットワーク以外、またはメインネット以外のリクエスト | 対応ネットワーク を使う |
| Typed message has extra unsigned or missing fields | message のフィールドが宣言された型と異なる | 宣言されたフィールドを過不足なく送る |
| Use strings for large typed integers | EIP-712 データ内に 253 を超える JSON の数値がある | 10 進文字列としてエンコードする |
| Full previous transactions (nonWitnessUtxo) are required … | SegWit v0 またはレガシーのインプットに 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 個または複数 | 1 トランザクションにつき 1 コントラクト |
| TRON contract calls require an explicit fee limit | fee_limit のない TriggerSmartContract | 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 | 1 回のスキャンに 2 つの異なる QR コードのフレームが混在 | リクエストは一度に 1 つだけ表示する |
エラーメッセージは、エンジン自身のチェックからのみ生成されます。想定外の例外は汎用的なエラーとして報告されるため、悪意あるペイロードが署名デバイスの画面に任意のテキストを差し込むことはできません。
照合結果
パスワードの入力を求める前に、リクエストは iPhone 上のウォレットと照合されます。署名できるのは ready の場合だけです。
| ステータス | 意味 |
|---|---|
ready | ちょうど 1 つのウォレットが鍵を保持しており、署名タスクが確定している |
noMatch | この iPhone のどのウォレットも要求された鍵を持っていない(フィンガープリントやパスの誤り、またはウォレットが未インポート) |
missingSigner | どの鍵で署名すべきかがリクエストに示されていない(導出情報もアドレスもない) |
ambiguous | 該当するウォレットが複数ある(たとえば同じフレーズを 2 回インポートしている) |
setupRequired | ウォレットの公開データの再構築が必要(パスワードを 1 回入力) |
invalid | リクエストの構造が不正 |