跳至主要内容

WalletConnect 與 dApp

BitTool Signer 從不連接 dApp:它沒有網路。WalletConnect 工作階段由你的錢包持有;當 dApp 要求 BitTool Signer 帳戶簽名時,你的錢包會將請求轉換為簽名 QR Code、等待回應,再回覆 dApp。BitTool Wallet 就是這樣運作的。

你的錢包持有 WalletConnect 工作階段
BitTool Signer離線
  1. 1接收來自 dApp 的工作階段請求,例如 eip155:1 上的 personal_sign。
  2. 2向使用者顯示請求,視需要補齊內容(nonce、gas、手續費),並鎖定確切的位元組。
  3. ur:eth-sign-request · ur:sol-sign-request · ur:tron-sign-request ▶
  4. 3解碼、審核,並在使用者輸入錢包密碼後簽名。
  5. ◀ ur:eth-signature · ur:sol-signature · ur:tron-signature
  6. 4驗證簽名,若方法需要則進行廣播,並將 JSON-RPC 結果傳回 dApp。

WalletConnect 工作階段會逾時,dApp 也可能放棄等待。請盡快顯示 QR Code 並讓使用者可以取消;如果使用者取消,請以使用者拒絕錯誤回覆 dApp(EVM 鏈上為 4001)。

方法對應​

命名空間dApp 方法傳給 BitTool Signer 的請求傳回 dApp 的結果
eip155personal_sign [message, address]eth-sign-request,data-type 3,訊息位元組0x 簽名,65 位元組,v = 27/28
eip155eth_signTypedData_v4 [address, typedData]data-type 2,typed-data JSON0x 簽名,65 位元組,v = 27/28
eip155eth_sendTransaction [tx]補齊 nonce、gas 與手續費;data-type 4(EIP-1559)或 1(legacy)廣播後的交易雜湊
eip155eth_signTransaction [tx]同上已簽名的原始交易(不廣播)
eip155eth_sign不支援:BitTool Signer 絕不簽署原始的 32 位元組雜湊拒絕請求
solanasolana_signMessage {message, pubkey}sol-sign-request,sign-type 2,解碼後的訊息位元組Base58 格式的 { signature }
solanasolana_signTransaction {transaction}sign-type 1,交易的 訊息 位元組Base58 格式的 { signature }
solanasolana_signAndSendTransaction {transaction}sign-type 1廣播後的 { signature }
trontron_signMessage {address, message}tron-sign-request,data-type 2,訊息位元組v = 27/28 的 0x 簽名
trontron_signTransaction {address, transaction}data-type 1,raw_data_hex 位元組加入 signature 後的交易物件

工作階段中要提供的 Chain ID(CAIP-2):

鏈CAIP-2
EVMeip155:1、eip155:56、eip155:42161、eip155:8453、eip155:10、eip155:137、eip155:100、eip155:43114
Solana 主網solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp
TRON 主網tron:0x2b6653dc

只提供使用者已配對的帳戶,以及 BitTool Signer 能夠簽名的網路。在其他任何 chain ID 上的 eth_sendTransaction 都會被簽名器拒絕。

常見的陷阱​

  • personal_sign 的參數順序。 規格為 [message, address],但有些 dApp 會送出 [address, message]。請偵測其中 20 位元組的地址。若訊息為位元組,會以 hex(0x…)表示;請將解碼後的位元組作為 sign-data 傳入,絕不要傳入 hex 文字。
  • Typed data 以字串形式傳入。 eth_signTypedData_v4 通常會將 JSON 以字串傳送。請直接以 UTF-8 位元組傳遞,不要重新序列化,讓整數與地址的寫法完全維持 dApp 原本的樣子。如果必須重新序列化,請將大整數保留為字串。
  • Solana:送出訊息,而不是交易。 solana_signTransaction 會給你一筆 Base64 序列化的交易,其中的簽名位置是空的。請將它反序列化,只送出訊息位元組。如果 dApp 建構的是使用 address lookup table 的 v0 交易,BitTool Signer 就無法簽署。
  • Solana 訊息編碼。 solana_signMessage 以 Base58 傳送訊息。請先將它解碼為位元組。
  • TRON 交易結構。 各 dApp 包裝交易的方式不同:params.transaction.transaction、params.transaction 或 params 本身。請取出含有 raw_data_hex 的物件,檢查 txID = SHA-256(raw_data),並簽署 raw_data_hex 的位元組。
  • TRON 訊息簽名。 簽名器傳回的復原位元組為 0/1;使用 TronWeb 的 dApp 預期為 27/28。請將最後一個位元組加上 27。

完整範例​

每個範例都會列出你的錢包從 dApp 收到的請求、與 BitTool Signer 之間的 QR 往返,以及你傳回的結果。全部使用測試助記詞;各鏈的完整細節請參閱 EVM、Solana 與 TRON 頁面。

一次 Sign-In with Ethereum 登入。

dApp 請求(chainId eip155:1)
{
"method": "personal_sign",
"params": [
"0x6170702e6578616d706c652e6f72672077616e747320796f7520746f207369676e20696e207769746820796f757220457468657265756d206163636f756e743a0a3078393835384566464432333242343033334534376439303030334434314543333445636145646139340a0a5369676e20696e20746f204578616d706c65204170702e0a0a5552493a2068747470733a2f2f6170702e6578616d706c652e6f72670a56657273696f6e3a20310a436861696e2049443a20310a4e6f6e63653a203866336b326d39710a4973737565642041743a20323032362d31302d31385430393a33303a30302e3030305a",
"0x9858EfFD232B4033E47d90003D41EC34EcaEda94"
]
}

請求(你的錢包 → BitTool Signer)

eth-sign-request2 幀
UR:ETH-SIGN-REQUEST/1-2/LPADAOCFADFDCYCMDSCMFHHDOXOSADTPDAGDHECKNDDWKIFTGLJLLEBDCEDPFMGWHTAMAOHDWEHSJOJODMIHKSHSJNJOJZIHDMJLJPIOCXKTHSJTJYJKCXKKJLKPCXJYJLCXJKINIOJTCXINJTCXKTINJYISCXKKJLKPJPCXFEJYISIHJPIHKPJNCXHSIAIAJLKPJTJYFTBKDYKSESETECETFEIYFGFYEYEOEYFWEEDYEOEOFEEEEMIEESDYDYDYEOFYEEEHFEFXEOEEFEIAHSFEIEHSESEEBKBKGUINIOJTCXINJTCXJYJLCXFEKSHSJNJOJZIHCXFPJOJODMBKBKGOGMGAFTCXISCPDEGMOY
1 / 2
CBOR 欄位
{
"1 request-id": {
"uuid (tag 37)": "5f1e9b2c7d3a4e6f8a0b1c2d3e4f5a06"
},
"2 sign-data": "6170702e6578616d706c652e6f72672077616e747320796f7520746f207369676e20696e207769746820796f757220457468657265756d206163636f756e743a0a3078393835384566464432333242343033334534376439303030334434314543333445636145646139340a0a5369676e20696e20746f204578616d706c65204170702e0a0a5552493a2068747470733a2f2f6170702e6578616d706c652e6f72670a56657273696f6e3a20310a436861696e2049443a20310a4e6f6e63653a203866336b326d39710a4973737565642041743a20323032362d31302d31385430393a33303a30302e3030305a",
"3 data-type": 3,
"4 chain-id": 1,
"5 derivation-path": {
"crypto-keypath (tag 304)": {
"1 components": [
44,
true,
60,
true,
0,
true,
0,
false,
0,
false
],
"2 source-fingerprint": 1942346250
}
},
"6 address": "9858effd232b4033e47d90003d41ec34ecaeda94",
"7 origin": "BitTool Wallet"
}
顯示 QR 文字與原始 CBOR
QR 文字 · ur:eth-sign-request
UR:ETH-SIGN-REQUEST/1-2/LPADAOCFADFDCYCMDSCMFHHDOXOSADTPDAGDHECKNDDWKIFTGLJLLEBDCEDPFMGWHTAMAOHDWEHSJOJODMIHKSHSJNJOJZIHDMJLJPIOCXKTHSJTJYJKCXKKJLKPCXJYJLCXJKINIOJTCXINJTCXKTINJYISCXKKJLKPJPCXFEJYISIHJPIHKPJNCXHSIAIAJLKPJTJYFTBKDYKSESETECETFEIYFGFYEYEOEYFWEEDYEOEOFEEEEMIEESDYDYDYEOFYEEEHFEFXEOEEFEIAHSFEIEHSESEEBKBKGUINIOJTCXINJTCXJYJLCXFEKSHSJNJOJZIHCXFPJOJODMBKBKGOGMGAFTCXISCPDEGMOY
UR:ETH-SIGN-REQUEST/2-2/LPAOAOCFADFDCYCMDSCMFHHDOXJYJYJOJKFTDLDLHSJOJODMIHKSHSJNJOJZIHDMJLJPIOBKHFIHJPJKINJLJTFTCXEHBKFXISHSINJTCXGAFYFTCXEHBKGLJLJTIAIHFTCXETIYEOJEEYJNESJSBKGAJKJKKPIHIECXFPJYFTCXEYDYEYENDPEHDYDPEHETGHDYESFTEODYFTDYDYDMDYDYDYHTAXAXAAADAHTAADDYOEADLECSDWYKCSFNYKAEYKAEWKAEWKAOCYJKSKTNBKAMGHMKHDWSZCCNDNFZEOVEKIMHAEFSFPWPEEWPPLTNMWATJTFWINJYGHJLJLJZCXHGHSJZJZIHJYCWTTFYJT
UR CBOR(hex)
a701d825505f1e9b2c7d3a4e6f8a0b1c2d3e4f5a060258ed6170702e6578616d706c652e6f72672077616e747320796f7520746f207369676e20696e207769746820796f757220457468657265756d206163636f756e743a0a3078393835384566464432333242343033334534376439303030334434314543333445636145646139340a0a5369676e20696e20746f204578616d706c65204170702e0a0a5552493a2068747470733a2f2f6170702e6578616d706c652e6f72670a56657273696f6e3a20310a436861696e2049443a20310a4e6f6e63653a203866336b326d39710a4973737565642041743a20323032362d31302d31385430393a33303a30302e3030305a0303040105d90130a2018a182cf5183cf500f500f400f4021a73c5da0a06549858effd232b4033e47d90003d41ec34ecaeda94076e426974546f6f6c2057616c6c6574

回應(BitTool Signer → 你的錢包)

解碼後的回應 · ur:eth-signature
{
"request-id": {
"uuid": "5f1e9b2c7d3a4e6f8a0b1c2d3e4f5a06"
},
"signature": "23c5ba3f5d247b4c81d55b7c44a3951a14c82e70f17ef2c19abea893c4e5bef05795a7261ac2bd9da29be2dfef529327e1b0724580fccac106bed3d007854f6b1b"
}
顯示 QR 文字與原始 CBOR
QR 文字 · ur:eth-signature
UR:ETH-SIGNATURE/OEADTPDAGDHECKNDDWKIFTGLJLLEBDCEDPFMGWHTAMAOHDFPCNSKRDFHHLDKKGGSLYTLHPKEFYOTMDCYBBSPDMJOWNKBWZSENYRNPDMUSSVWRNWTHGMDOSDSCYSARYNTOENDVOURWSGMMUDIVYPFJPFELAZTSGSEAMRNTETIATLPGWJECWWNKEFGEH
UR CBOR(hex)
a201d825505f1e9b2c7d3a4e6f8a0b1c2d3e4f5a0602584123c5ba3f5d247b4c81d55b7c44a3951a14c82e70f17ef2c19abea893c4e5bef05795a7261ac2bd9da29be2dfef529327e1b0724580fccac106bed3d007854f6b1b

由你的錢包組裝

walletConnectResult
0x23c5ba3f5d247b4c81d55b7c44a3951a14c82e70f17ef2c19abea893c4e5bef05795a7261ac2bd9da29be2dfef529327e1b0724580fccac106bed3d007854f6b1b
傳回 dApp 的 JSON-RPC 結果
0x23c5ba3f5d247b4c81d55b7c44a3951a14c82e70f17ef2c19abea893c4e5bef05795a7261ac2bd9da29be2dfef529327e1b0724580fccac106bed3d007854f6b1b

顯示請求​

使用者需要核准兩次:一次在你的錢包中,一次在 BitTool Signer 中。請讓兩個畫面的內容一致。顯示 dApp 的名稱與 URL、網路,以及與 BitTool Signer 將顯示的相同解碼內容:金額、收款人、spender,若是訊息則顯示完整文字。對於未知的合約呼叫,請標示為未知,而不是用猜的;BitTool Signer 也同樣會將它們標示為未解碼。