Das Auslösen von Smart Contracts sendet eine Ether-Transaktion, die nicht im Vertrag enthalten ist

Ich brauche Hilfe bei meinem Smart Contract, hier ist der Smart Contract Code

pragma solidity ^0.4.18;

contract UserToken {
    mapping (bytes32 => uint8) public tokenBalance;

    bytes32[] public userList;

    // Constructor
    function UserToken(bytes32[] userName) public payable {
        userList = userName;
    }

    // Returns the total votes a candidate has received
    function totalTokensFor(bytes32 user) view public returns (uint8) {
        require(validUser(user));
        return tokenBalance[user];
    }

    // Increments the token count of user
    function buyToken(bytes32 user, uint8 token) public {
        require(validUser(user));
        tokenBalance[user] += token;
    }

    function validUser(bytes32 user) view public returns (bool) {
        for(uint i = 0; i < userList.length; i++) {
          if (userList[i] == user) {
            return true;
          }
        }

        return false;
    }
}

Ich habe einen Geth-Knoten, der mit rinkeby verbunden ist und auf meiner ec2-Instanz in AWS läuft, von dort aus habe ich die eth-Kontoadresse erstellt und dann die JSON-Datei in Metamask importiert.

Das ist nun das Problem, immer wenn ich die Funktion „ buyToken “ aufrufe, werden vier Transaktionen ausgelöstGeben Sie hier die Bildbeschreibung ein

Die erste Transaktion ist diese https://rinkeby.etherscan.io/tx/0x3206678cdd6fdcfc4eddf3871002b77320d5e83f3bb5f9e2d9c0c0aa9bbc8817

Eine Ether-Überweisung an eine andere Adresse w/c ist nicht im Vertrag, und der Ether, den sie überwiesen hat 2.994817 Ether, war wiederum nicht im Vertrag, wodurch die nächsten drei Transaktionen verschwinden, da das Guthaben auf dem Konto nicht ausreicht, der ursprüngliche Kontostand betrug 3 Ether .

Hier ist der Code, der das BuyToken aufruft

var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
var userContract = web3.eth.contract(ABI);
var userInstance = userContract.at(contract address)

$("#buy_button").click(function(e) {
    let tx_hash = userInstance.buyToken("John", 3);
    e.preventDefault();
});

Meine Frage ist, warum passiert das? Es gibt keinen Ether-Transfercode in meinem Vertrag, also was ist die mögliche Ursache dafür?

Danke

Wo ist der Code, der diese Transaktionen tatsächlich generiert? Sie haben den Vertragscode geteilt, aber nicht, wo Sie anrufen buyToken.
@smarx Ich habe meinen Beitrag aktualisiert
Ich glaube nicht, dass der Code, den Sie geteilt haben, diese Transaktionen generiert. Zum einen generiert dieser Code nur eine einzige Transaktion, und Sie sehen mehrere. Aber auch die Transaktion, die Sie geteilt haben, ist überhaupt kein Aufruf zu einem Vertrag. (Das dataFeld ist leer.)
Sie haben MetaMask erwähnt, aber der von Ihnen freigegebene Code verwendet MetaMask nicht. Was vermisse ich?
@smarx Ja, es wird keine Metamask verwendet, ich verwende nur Metamask, um schnell den Kontostand des von mir erstellten Kontos zu überprüfen. Eine weitere seltsame Sache ist, dass es auf meinem lokalen Computer einwandfrei funktioniert, dieselbe Einrichtung, aber wenn ich versuche, die Transaktion im Internet durchzuführen app in aws, wenn es mehrere Transaktionen auslöst
Ich habe auch den bezahlbaren Modifikator im Konstruktor entfernt, immer noch das gleiche Problem
Ich bin verwirrt wegen deiner Einstellung. Wie funktioniert die Verwendung der Web-App in AWS localhost? Führen Sie einen Browser innerhalb der VM in AWS aus?
Ja, ich habe eine Django-Anwendung in AWS, dann verwendet diese Web-App web3, um mit dem Geth-Knoten zu kommunizieren, der Knoten befindet sich auch in AWS VM, also habe ich zwei laufende Web-Apps und zwei laufende Ethereum-Geth-Vollknoten, 1 In meinem lokalen Computer und einem in AWS verwenden sie alle denselben Vertrag, der in rinkeby bereitgestellt wird, und beide Knoten verwenden dasselbe Konto. Ich habe gerade den Schlüsselspeicher des Kontos von meinem lokalen Computer in AWS importiert
Auch hier löst es auf meinem lokalen Rechner nur 1 Transaktion aus, sodass es problemlos funktioniert, aber in AWS löst Buytoken mehrere Transaktionen aus und die erste ist eine Ether-Übertragung. Hier ist die letzte Transaktion, die von BuyToken in AWS ausgelöst wurde rinkeby.etherscan.io/ tx/…
Ich denke, es gibt einige Verwirrung. buyTokenlöst keine Transaktionen aus ... es wird überhaupt nicht aufgerufen. Ist die Geth-Instanz auf AWS von außerhalb der VM zugänglich? Oder verhindern Firewall-Regeln das? Ich frage mich, ob dies im Wesentlichen ein Hack ist ... ein automatisierter Prozess, der vielleicht nicht erkennt, dass der Knoten nur mit Rinkeby verbunden ist.
Wenn Sie Ether auf dieses Konto überweisen und dann nichts tun (versuchen Sie nicht anzurufen buyTokenoder irgendetwas anderes), frage ich mich, ob eine Transaktion zustande kommt, wenn Sie den Ether an einen anderen Ort senden. Wenn ja, wäre ich ziemlich zuversichtlich, dass es jemand ist, der den Ether-Diebstahl automatisiert.
(Stellen Sie jedoch sicher, dass das Konto entsperrt ist, da ein Angreifer das Konto nicht selbst entsperren könnte.)
Ich sollte klarstellen, dass dies buyTokenmöglicherweise angerufen wird (allerdings nicht in der Transaktion, mit der Sie verknüpft sind). Aber die Ether-Transfers sind völlig unabhängig von Ihrem Vertrag.
@smarx ja, die Geth-Instanz auf AWS ist außerhalb der VM zugänglich, ich kann 8545 von meinem lokalen Computer aus telnet, werde Ihren Vorschlag versuchen, Ether auf das Konto des Empfängers zu übertragen, das Problem ist, dass ich bereits alle meine Social-Media-Konten verwendet habe, um Token vom Wasserhahn zu erhalten muss noch 7 Stunden warten
Die Empfänger der Ether-Transfers sind tatsächlich unterschiedlich

Antworten (2)

Warum beziehen Sie sich auf Etherscan für Rinkeby, wenn Ihr Code eindeutig auf Ihre eigene lokale Kette verweist? http://localhost:8545 ist kein Rinkeby-Anbieter.

Ihr Link zu Rinkeby stammt wahrscheinlich vollständig von der Aktion einer anderen Person, und Ihr Code zeigt auf Ihre eigene lokale Instanz von Geth

Mein vollständiger Geth-Knoten in AWS ist ein Live-Knoten, der mit rinkeby verbunden ist, und meine Web-App befindet sich in derselben AWS-VM-Instanz, in der mein vollständiger Knoten ausgeführt wird

Dies liegt nicht an Ihrem Vertrag, sondern an Ihrer Netzwerkeinrichtung.
Bitte überprüfen Sie das Netzwerk, mit dem Sie verbunden sind. Ihr Problem scheint, dass Sie Ihr eigenes Netzwerk erstellen. Kommen wir zum Problem. Ein solches Problem kann aufgrund der von Ihnen vorgenommenen Konfiguration auftreten -

Ihr Netzwerk-Setup

  • Sie haben Ihren in AWS ausgeführten Knoten als validierenden Knoten konfiguriert.
  • Sie haben den RPC-Port im selben Validierungsknoten aktiviert.
  • Sie haben das Konto entsperrt, sodass Ihr Validierungsknoten einwandfrei funktioniert.

Dies liegt daran, dass Geth dieses Problem hatte und wir oft mit diesem Problem konfrontiert waren. Deaktivieren Sie den RPC-Port des Validierungsknotens und fügen Sie einen weiteren Knoten hinzu, um mit der Blockchain zu interagieren. Dieser Knoten sollte kein entsperrtes Konto haben, sodass Ihr Geth nicht automatisch Ether an ein beliebiges Konto senden kann.
Ich hoffe es hilft!