Web3js

解碼 Etherscan.io 合約輸入數據

  • February 17, 2022

在 etherscan 上讀取我的輸入數據,我將每個值都視為十六進制值。閱讀地址很好。但我想將金額[1]&&[3]視為數字。

合約方式

Function: trade(address tokenGet, uint256 amountGet, address tokenGive, uint256 amountGive, uint256 expires, uint256 nonce, address user, uint8 v, bytes32 r, bytes32 s, uint256 amount)

輸入數據

MethodID: 0x0a19b14a
[0]:0000000000000000000000000000000000000000000000000000000000000000
[1]:000000000000000000000000000000000000000000000016d8fceafcef3c0000
[2]:000000000000000000000000340d2bde5eb28c1eed91b2f790723e3b160613b7
[3]:00000000000000000000000000000000000000000008b7363b040ca2bb600000

我在購買25代幣的地方進行了一次交易 etherdelta。因此,輸入數據的預期轉換值[1]應該是2525 * 10^18(以 wei 為單位)或至少是 的任何倍數25*10^x

問題

如何將十六進制轉換為期望值?

嘗試

  1. 使用乙太坊輸入解碼器 向我顯示與 etherscan.io 上相同的值
  2. 轉換為 Ascii 會產生垃圾(此處推薦:如何從事務中解碼輸入數據?
  3. web3.utils.hexToNumberString&web3.utils.hexToNumber錯誤
  4. console.log(0x000000000000000000000000000000000000000000000016d8fceafcef3c0000) 顯示一些任意值

Miguel Mota 頁面,使用 Etherdelta ABI,我得到你的交易輸入

{
 "name": "trade",
 "types": [ .. ],
 "inputs": [
   "0",
   "16d8fceafcef3c0000",      // <- amountGet
   "340d2bde5eb28c1eed91b2f790723e3b160613b7",
   "8b7363b040ca2bb600000",   // <- amountGive
   "46eeac",
   "87d84d79",
   "14ce500a86f1e3ace039571e657783e069643617",
   "1c",
   {
     "type": "Buffer",
     "data": [..]
   },
   {
     "type": "Buffer",
     "data": [..]
   },
   "38d7ea4c68000"            // <- amount
 ]
}

註釋值是用於計算您收到的值的值。這是在 EthedeletatradeBalances函式中完成的

 function tradeBalances(address tokenGet, uint amountGet, 
     address tokenGive, uint amountGive, 
     address user, uint amount) private {
   ...
   tokens[tokenGive][msg.sender] = 
      safeAdd(tokens[tokenGive][msg.sender], 
      safeMul(amountGive, amount) / amountGet);
 }

您應該收到 amountGive * amount / amountGet

0x8b7363b040ca2bb600000 * 0x38d7ea4c68000 / 0x16d8fceafcef3c0000 25000000000000000000L = 25*10^18

這是你所期望的。

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