Warum ist diese ERC20-"Stehl"-Transaktion gültig?

Ich sende ein Token von Konto A nach B. Das Konto, das die Transaktion ausgibt, ist C. Überraschenderweise ist die Transaktion gültig und funktioniert einwandfrei. Warum?

Das bedeutet, dass ich als Transaktionsaussteller ein beliebiges Konto A dazu bringen kann, Token an ein beliebiges Konto B zu geben? Bedeutet dies nicht, dass ich auf diese Weise buchstäblich Token stehlen kann, vorausgesetzt, B ist eine andere Adresse von mir.

Ich bin mir ziemlich sicher, dass ich hier etwas Grundlegendes übersehe.

Die JSON-RPC-Nutzlast zur Darstellung der Frage lautet wie folgt:

{
  "jsonrpc": "2.0",
  "method": "eth_sendTransaction",
  "params": [
    {
      "to": "0x5928ead021bd523e6d3531de920d78b7a02efa60",
      "from": "0xef2b050377007e45ba43d9c2bf0d7acc2039c112",
      "data": "0x23b872dd000000000000000000000000d8e05701eFf33acfDA0A8e24C04070347703c72C000000000000000000000000ad9c9b5085bec8e8013296dc12bd9cecad102356000000000000000000000000000000000000000000000000000000005a9187bf",
      "gas": "0x3d0900",
      "gasPrice": "0x51f4d5c00"
    }
  ],
  "id": 1
}

Die Transaktion fand in einem ropstenNetzwerk statt und kann hier eingesehen werden: https://ropsten.etherscan.io/tx/0x3a1d9800565e93a7ff0e85958dcf49a9e7752d099f4b061598e8b73f1e453814

Hier:

  • 0x5928ead021bd523e6d3531de920d78b7a02efa60– Vertragsadresse,
  • 0xef2b050377007e45ba43d9c2bf0d7acc2039c112– Transaktionsaussteller (derjenige, der die Transaktionsgebühr zahlt),
  • 0xd8e05701eFf33acfDA0A8e24C04070347703c72C– Benutzer A, eigentlich Vertragsersteller, der alle Token besitzt; derjenige, dessen Token gestohlen werden,
  • 0xad9c9b5085bec8e8013296dc12bd9cecad102356– Benutzer B, derjenige, dem einige Token geschenkt werden.

Wie kommt es, dass diese Transaktion gültig ist?

Antworten (2)

Sehen Sie sich diesen Token-Vertrag unter https://ropsten.etherscan.io/address/0x5928ead021bd523e6d3531de920d78b7a02efa60#code an

function transferFrom(address _from, address _to, uint _value) returns (bool success) {
    if (_from == 0x0 && _to == 0x0) throw;
    if (balanceOf[_from] >= _value && _value > 0) {
      balanceOf[_from] -= _value;
      balanceOf[_to] += _value;
      Transfer(_from, _to, _value);
      return true;
    }
    return false;
  }

Die transferFromFunktion überprüft nicht, wer der Initiator der Transaktion ist, daher kann jeder von jedem überweisen.

Dieses Token implementiert nur zwei Methoden von ERC20, und es implementiert sie falsch. Verwenden Sie für die korrekte Implementierung entweder die zeppelin-solitidyBibliothek oder werfen Sie einen Blick auf https://theethereum.wiki/w/index.php/ERC20_Token_Standard

Im ERC20-Standard kann ein Absender einem Dritten die Übertragung in seinem Namen genehmigen. Dies wird als Allowance bezeichnet und erfolgt über die Methode apply(). Anwendungsfälle wie der dezentrale Austausch benötigen dies, um zu funktionieren.

Es folgt ein gut geschriebener Artikel über ERC20 und eine gute Erklärung der Zulagen. https://medium.com/@jgm.orinoco/understanding-erc-20-token-contracts-a809a7310aa5

Danke für den Kommentar, @Sumanth. Dieser Artikel war aufschlussreich!