Wie kommt es, dass web3 send keinen privaten Schlüssel oder keine Signatur benötigt?

Ich baue eine , auf die über die Bibliothek ERC20 smart contractzugegriffen 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.jsweb3web3.eth.Contractsendfrommsg.senderfrom

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 sendMethode offen ist, um die Geschäftslogik zu umgehen, scheint ein großes Sicherheitsproblem zu sein.

Da fehlt mir etwas?

Sie verpassen die Tatsache, dass Sie contract_owner_addressauf 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.

Antworten (3)

Jede Transaktion zu einer tatsächlichen Ethereum-Blockchain muss mit einem privaten Schlüssel signiert werden.

Damit der obige Code funktioniert (nur eine fromAdresse angeben), muss der Knoten, mit dem Sie verbunden sind, die Signatur für Sie übernehmen. Solange die fromAdresse in diesem Knoten "entsperrt" ist (der Standardwert unter einem Testnetzwerk wie ganacheoder 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 web3Bibliothek 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 fromFeld zu senden.

Das msg.senderEigentum kann nicht gefälscht werden - zumindest in dem Maße, dass jemand keine Transaktion mit msg.sendereiner 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.senderAdresse die Person ist, die die Transaktion durchführt.