Angesichts der Tatsache, dass sich ABI öffentlich auf der Blockchain befindet, warum kann dann niemand transferFrom() aufrufen und Token stehlen?

Ich versuche nur zu verstehen, wie es tatsächlich funktioniert und wie die in der Blockchain gespeicherten Vermögenswerte geschützt sind. Da ABI-Definitionen öffentlich sind, ist auch die Vertragsadresse verfügbar, kann jeder mit einem Smart Contract interagieren? Wenn ja, wie schränken Sie es ein?

Wenn es beispielsweise ein ERC20-Token gibt, das implementiert wird, transferFromkann dann nicht jemand diese Funktionseinstellungsadresse _tosein Eigen nennen?

Antworten (1)

Ab dem ERC20-Standard kann die transferFrom-Funktion von jedem aufgerufen werden. Aber um erfolgreich zu sein, muss der Token-Besitzer dem Spender erlaubt haben, seinen Token auszugeben.

Das Beispiel online ist nicht korrekt, aber hier ist eines:

  function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
        uint256 value = _value * 10 ** uint256(decimals);
        require(value <= allowance[_from][msg.sender]);
        allowance[_from][msg.sender] -= value;
        _transfer(_from, _to, _value);
        return true;
    }

Sehen Sie sich die Zeile require an, wenn dies falsch ist, wird die Revert-Funktion aufgerufen und der EVM-Status wird auf den Zustand vor dieser Transaktion zurückgesetzt.


Hinweis: Wie Smarx in Kommentaren sagte, die folgende Zeile:

uint256 value = _value * 10 ** uint256(decimals);

Ist spezifisch für meinen Code, verwenden Sie ihn nicht in Ihrem, es sei denn, Sie wissen, was Sie tun (auch wenn es gut funktioniert).

Ist die Zulage nicht für etwas anderes gedacht? Vielleicht verstehe ich das falsch, aber soweit ich weiß, ist die Zulage dafür gedacht, jemandem zu genehmigen, Geld für ihn auszugeben. Beispielsweise kann die Buchhaltung jedem Mitarbeiter genehmigen, 100 Token pro Monat auszugeben, auch wenn die Mitarbeiter selbst keine Token besitzen.
Unabhängig von der Frage hier wollte ich nur darauf hinweisen, dass das Multiplizieren mit 10 ** decimalshier kein Standard und wahrscheinlich eine schlechte Idee ist. Es geht darum decimals, Menschen zu erlauben, Beträge wie „0,01 Token“ zu überweisen. Wenn Sie alle Ihre Argumente mit multiplizieren 10 ** decimals, entfernen Sie die Möglichkeit dazu. (Sie können auch einfach decimalsauf gesetzt haben 0.)
@eth.block "... soweit ich weiß, ist eine Zulage dafür gedacht, jemandem zu genehmigen, in seinem Namen Geld auszugeben." Exakt. Damit Sie erfolgreich callen können transferFrom(foo, ...), foomüssen Sie zunächst autorisiert sein, ihren Ether auszugeben. Das macht dieser Code.
transferFromErfordert also eine vorherige Genehmigung. Bußgeld. Was ist mit transfer? Was ist, wenn ich als meine eigene Adresse übergebe _tound _fromauf eine Adresse setze, von der ich weiß, dass sie genügend Token hat? Ist das überhaupt möglich?
Nein, denn die from-Variable ist eigentlich der message.sender.
@smarx Eigentlich ist das vollkommen in Ordnung, wenn Sie den Rest meines Codes kennen. ;)
@Andromelus, dazu kann ich nichts sagen; Ich wollte andere Leser nur darauf hinweisen, dass sie dies nicht in ihre eigenen Verträge kopieren sollten.
@smarx Du hast Recht, ich werde meine Antwort dafür bearbeiten