Json-Rpc

json rpc十六進製字元串奇怪的填充/編碼

  • May 22, 2020

當發送 eth_call 以獲取 erc20 令牌 WETH 名稱和符號時,我得到用一堆零和一個神秘數字“2”填充的十六進制響應。

對於符號我得到回應:

“0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045745544800000000000000000000000000000000000000000000000000”

對於名稱,我得到回應:

0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d57726170706564204574686572000000000000000000000000000000000000“

當我將響應轉換為 utf8 字元串時,我得到:

��������������������������������WETH 
�������������������������������Wrapped Ether

從 ethereum.js 解碼十六進製字元串的常式僅取消填充它找到的第一個“2”。儘管用零填充會繼續,直到實際字元開始。

為什麼要對響應進行如此“奇怪”的編碼以及如何正確解碼?

它們是使用solidity abi編碼的

  • 前 32 個字節是字元串在響應中出現的偏移量:0000000000000000000000000000000000000000000000000000000000000020。所以字元串從位置 20h = 32 開始。
  • 在指定的偏移量處,前 32 個字節表示字元串的長度:0000000000000000000000000000000000000000000000000000000000000004. 所以字元串的長度為 4h = 4。
  • 在長度之後接下來的 4 個字節是字元串本身:57455448. 從 utf-8 你有“WETH”。

引用自:https://ethereum.stackexchange.com/questions/83576