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, transferFrom
kann dann nicht jemand diese Funktionseinstellungsadresse _to
sein Eigen nennen?
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).
eth.block
Benutzer19510
10 ** decimals
hier kein Standard und wahrscheinlich eine schlechte Idee ist. Es geht darumdecimals
, Menschen zu erlauben, Beträge wie „0,01 Token“ zu überweisen. Wenn Sie alle Ihre Argumente mit multiplizieren10 ** decimals
, entfernen Sie die Möglichkeit dazu. (Sie können auch einfachdecimals
auf gesetzt haben0
.)Benutzer19510
transferFrom(foo, ...)
,foo
müssen Sie zunächst autorisiert sein, ihren Ether auszugeben. Das macht dieser Code.eth.block
transferFrom
Erfordert also eine vorherige Genehmigung. Bußgeld. Was ist mittransfer
? Was ist, wenn ich als meine eigene Adresse übergebe_to
und_from
auf eine Adresse setze, von der ich weiß, dass sie genügend Token hat? Ist das überhaupt möglich?Wiederholung 122442
Wiederholung 122442
Benutzer19510
Wiederholung 122442