Ich baue eine , auf die über die Bibliothek ERC20 smart contract
zugegriffen wird . Ich sehe, dass das die Funktion hat, die den Parameter übernimmt , der dem im Smart Contract zugeordnet wird. Soweit ich verstehe (und mein Debugging unterstützt dies), kann ich das Feld in nahezu jede Adresse ändern und dadurch die Geschäftslogik des Vertrags umgehen, znode.js
web3
web3.eth.Contract
send
from
msg.sender
from
token.methods.method_only_owner_can_activate(<some_data>).send({ from: <contract_owner_address>, <gas> });
oder sogar den Besitzer festlegen:
token.methods.setOwner(<my_not_owner_address>).send({ from: <contract_owner_address>, <gas> });
Da die Adresse öffentlich sein sollte, kann jeder Benutzer einen Prozess erstellen, der dieses Verhalten nachahmt und meine Sicherheitslogik umgeht.
Es gibt andere Methoden, die eine Transaktion mit signieren private key
, aber die Tatsache, dass die send
Methode offen ist, um die Geschäftslogik zu umgehen, scheint ein großes Sicherheitsproblem zu sein.
Da fehlt mir etwas?
Jede Transaktion zu einer tatsächlichen Ethereum-Blockchain muss mit einem privaten Schlüssel signiert werden.
Damit der obige Code funktioniert (nur eine from
Adresse angeben), muss der Knoten, mit dem Sie verbunden sind, die Signatur für Sie übernehmen. Solange die from
Adresse in diesem Knoten "entsperrt" ist (der Standardwert unter einem Testnetzwerk wie ganache
oder explizit mit einem normalen Knoten wie Geth oder Parity), kann er die Transaktion mit diesem Schlüssel signieren und senden.
In einer realen Situation wären Benutzer Ihrer App nicht mit einem Knoten verbunden, der Ihren privaten Schlüssel hatte, daher ist dies kein Problem.
Die web3
Bibliothek erstellt eine Transaktion, die von dem in angegebenen Konto signiert werden muss from
. Es wird entweder signiert, indem mit einem lokalen Knoten gesprochen wird, der über den privaten Schlüssel zu diesem Konto verfügt und ihn derzeit entsperrt hat, oder durch eine Software wie Metamask, die diesen privaten Schlüssel kontrolliert und die Transaktion nur signiert, wenn der Benutzer dies bestätigt.
Es ist nicht möglich, eine gültige (signierte) Transaktion ohne den privaten Schlüssel des Kontos im from
Feld zu senden.
Das msg.sender
Eigentum kann nicht gefälscht werden - zumindest in dem Maße, dass jemand keine Transaktion mit msg.sender
einer Adresse erstellen kann, die nicht seine eigene Adresse ist.
Unabhängig von den Sicherheitsmaßnahmen, die Sie in Ihrem Vertrag haben, können Sie sich darauf verlassen, dass die msg.sender
Adresse die Person ist, die die Transaktion durchführt.
gute Stimmung
contract_owner_address
auf dem Ethereum-Knoten, mit dem Sie verbunden sind, entsperrt sind. Entweder Sie entsperren es (unwissentlich) in Ihrem Code, oder der Knoten entsperrt es (unwissentlich) für Sie.