Programmatisches Abrufen von ABI-Daten für ERC20-Token mit Web3 [Duplikat]

Ich fange gerade an, in Web3 einzutauchen. Ich versuche, die verschiedenen ERC20-Token-Werte für eine bestimmte Ethereum-Adresse anzuzeigen.

Die Stücke, die ich dazu brauche, sind:

  • Token-Vertragsadresse
  • Token-Vertrag ABI

Gibt es programmatische Möglichkeiten, um der Vertrags-ABI eine Vertragsadresse aus der Blockchain zuzuweisen?

Wenn nicht, scheint es fair anzunehmen, dass die Vertrags-ABI für jeden Token-Vertrag konstant ist ... hat jemand eine Datenbank zentralisiert, die verwendet werden kann, um programmatisch mit diesen ERC20-Token zu interagieren?

Können Sie überhaupt ohne die vollständige ABI mit einem Token-Vertrag interagieren? Zum Beispiel muss nach dem ERC20-Standard jeder Vertrag haben balanceOf(), können wir diese Funktion bei einer Adresse und ohne ABI aufrufen?

Antworten (2)

Vielen Dank K.Fichter für die Hilfe. Ich möchte die Antwort nur für alle anderen, die auf dieses Problem stoßen, vollständig klären.

Angenommen, Sie möchten das Guthaben eines Tokens an einer Ethereum-Adresse erhalten. Mit Web3 würden Sie Folgendes tun:

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()

Dann könnte Ihre endgültige Ausgabe in etwa so aussehen:

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

contractABIIch dachte, dass ich für jeden einen neuen laden müsste, contractAddressda jeder Token seine eigenen Funktionen haben kann, selbst wenn sie dem ERC20-Standard folgen. Sie müssen die ABI jedoch nur für die Funktionen definieren, die Sie verwenden .

In meinem Beispiel müssen Sie also nur Folgendes definieren:

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

Unter der Annahme, dass der Token dem ERC20-Standard folgt, sind diese Funktionen immer gleich und können mit diesem ABI dargestellt werden:

[
  {
    "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"
  }
]

Auf diese Weise können Sie sich mit jedem verbinden contractAddressund die Guthabeninformationen abrufen, vorausgesetzt, sie folgen dem ERC20-Standard.

EDIT: Ich habe hier einen Blogbeitrag darüber geschrieben . Ich hoffe es hilft anderen!

Danke Shawn, ich wusste nicht, dass das gesamte abi nicht notwendig ist, um mit dem Vertrag in Verbindung zu treten !!

Wenn Sie mit einem Standard-ERC20-Token interagieren, teilen sich alle Verträge dieselbe Basis-ABI. Dieser ABI ist online verfügbar , kann aber auch abgerufen werden, indem Sie Ihren eigenen Standard ERC20 implementieren und den ABI zusammenstellen.

ABI ist wirklich nur eine Schnittstelle, die Web3 mitteilt, wie das "Vertrags"-Objekt erstellt werden soll, mit dem Sie interagieren können. Es enthält im Wesentlichen jeden Feld-/Funktionsnamen und einige daran angehängte Metadaten. Da die Funktionen für Standard-ERC20-Token alle dem hier beschriebenen Standard entsprechen sollten , werden diese Felder/Funktionen und Metadaten immer übereinstimmen.

Da ERC20 -Token denselben ABI verwenden, können Sie den Standard-ERC20-ABI im Grunde genommen einfach fest in Ihre App codieren und für jeden Token verwenden . Ohne den Quellcode des Vertrags können Sie jedoch keine Vertrags-ABI erhalten.

Danke, das hat meine Frage beantwortet. Um es für mich sinnvoller auszudrücken: (1) Die vollständige ABI für einen Token ist nur verfügbar, wenn Sie den Solidity-Quellcode haben, der nicht auf der Blockchain dekompiliert ist. (2) Sie können Etherscan.io als Basis-API für Vertrags-ABIs verwenden . (3) Sie benötigen NICHT die vollständige ABI für einen Vertrag, um damit zu interagieren. Sie müssen nur die Funktionen in der ABI definieren, mit denen Sie interagieren möchten, und ERC20 hat dies standardisiert, sodass Sie bei der Interaktion mit diesen Token immer eine Basis-ABI haben können.
Ja! Entschuldigung, ich habe mich mehr auf Ihren Anwendungsfall konzentriert, aber das ist definitiv eine gute Frage. Vielleicht möchten Sie erwägen, Ihre eigene Antwort einzureichen, da ich denke, dass dies eine viel klarere Lösung für Ihre ursprüngliche Frage ist.
Nochmals vielen Dank für Ihre Hilfe. Lassen Sie mich wissen, wenn etwas in meiner Antwort falsch aussieht.
@ShawnTabrizi ja, es sieht gut aus!