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öst
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
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
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
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!
Benutzer19510
buyToken
.Benutzer794468
Benutzer19510
data
Feld ist leer.)Benutzer19510
Benutzer794468
Benutzer794468
Benutzer19510
localhost
? Führen Sie einen Browser innerhalb der VM in AWS aus?Benutzer794468
Benutzer794468
Benutzer19510
buyToken
lö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.Benutzer19510
buyToken
oder 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.Benutzer19510
Benutzer19510
buyToken
mö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.Benutzer794468
Benutzer794468