Web3js

使用 Web3 以程式方式獲取 ERC20 代幣的 ABI 數據

  • February 12, 2018

我剛剛開始深入研究 Web3。我正在嘗試顯示給定乙太坊地址的各種 ERC20 代幣值。

我需要這樣做的部分是:

  • 代幣合約地址
  • 代幣合約 ABI

有沒有任何程序化的方法可以從區塊鏈中獲取給定合約地址的合約 ABI?

如果不是,那麼假設合約 ABI 對於任何代幣合約都是不變的似乎是公平的……是否有人集中了一個數據庫,可用於以程式方式與這些 ERC20 代幣進行互動?

如果沒有完整的 ABI,你是否能夠與代幣合約進行互動?例如,根據 ERC20 標準,每個合約都必須有balanceOf(),我們可以在給定地址而沒有 ABI 的情況下呼叫這個函式嗎?

感謝 K.Fichter 的幫助,我只想為可能遇到此問題的其他人完全澄清答案。

假設您想在乙太坊地址獲取代幣的餘額。使用 Web3,您將執行以下操作:

var tokenContract = web3.eth.contract(contractABI).at(contractAddress)
var decimal = tokenContract.decimals()
var balance = tokenContract.balanceOf(address)
var adjustedBalance = balance / Math.pow(10, decimal)
var tokenName = tokenContract.name()
var tokenSymbol = tokenContract.symbol()

那麼你的最終輸出可能是這樣的:

output = adjustedBalance + " " +  tokenSymbol + " (" + tokenName + ")";

我認為我需要contractABI為每個令牌載入一個新的,contractAddress因為每個令牌可能都有自己的功能,即使它們遵循 ERC20 標準。但是,您只需要為您正在使用的函式定義 ABI

所以在我的例子中,你只需要定義:

  1. balanceOf()
  2. decimals()
  3. name()
  4. symbol()

假設代幣遵循 ERC20 標準,這些功能將始終相同,並且可以用此 ABI 表示:

[
 {
   "constant": true,
   "inputs": [],
   "name": "name",
   "outputs": [
     {
       "name": "",
       "type": "string"
     }
   ],
   "payable": false,
   "type": "function"
 },
 {
   "constant": true,
   "inputs": [],
   "name": "decimals",
   "outputs": [
     {
       "name": "",
       "type": "uint8"
     }
   ],
   "payable": false,
   "type": "function"
 },
 {
   "constant": true,
   "inputs": [
     {
       "name": "_owner",
       "type": "address"
     }
   ],
   "name": "balanceOf",
   "outputs": [
     {
       "name": "balance",
       "type": "uint256"
     }
   ],
   "payable": false,
   "type": "function"
 },
 {
   "constant": true,
   "inputs": [],
   "name": "symbol",
   "outputs": [
     {
       "name": "",
       "type": "string"
     }
   ],
   "payable": false,
   "type": "function"
 }
]

使用它,您可以連接到任何一個contractAddress並能夠獲取餘額資訊,假設它們遵循 ERC20 標準。

編輯:我在這裡寫了一篇關於這個的部落格文章。我希望它可以幫助別人!

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