Json-Rpc
json rpc十六進製字元串奇怪的填充/編碼
當發送 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”。