Soliditätsvertrag:
contract MyContract {
bytes32 public product;
uint public amount;
function setOrder(bytes32 _product, uint _reorderAmount,) public returns (bool success);
}
Javascript web3js (ohne node.js):
<script src="./web3.min.js"></script>
<script>
web3 = new Web3(new Web3.providers.HttpProvider("https://ropsten.infura.io/key"));
web3.eth.defaultAccount = "0x...address of my account...";
var myContract = web3.eth.contract([...abi...]);
var contractInstance = myContract.at('0x...contract address...');
contractInstance.setOrder(web3.toHex('ProductName'),3000);
</script>
Dies funktioniert, wenn ich ganache-cli laufen habe, aber nicht auf einem Testnet (z. B. Ropsten). In einem Testnetz kann ich nur Getter-Funktionen abrufen, aber wie rufe ich eine Setter-Funktion auf? Was fehlt mir hier?
Transaktionen müssen mit dem privaten Schlüssel des sendenden Kontos signiert werden.
Sie verwenden Infura als Ihren Web3-Anbieter und bitten ihn, eine Transaktion für Sie zu senden. Das kann es nicht, weil es den privaten Schlüssel für Ihr Konto nicht kennt.
Sie müssen entweder selbst Code schreiben, um die Transaktion zu signieren, oder (der typischere Ansatz) einen Web3-Anbieter wie MetaMask im Browser verwenden. MetaMask hält die privaten Schlüssel des Benutzers und signiert Transaktionen in seinem Namen (nach Aufforderung zur Genehmigung).
Laut dem Dokument müssen Sie die contractInstance.setOrder(web3.toHex('ProductName'),3000);
Methode in ändern
Senden Sie eine Transaktion: (Ihr Fall)
contractInstance.setOrder.sendTransaction(web3.toHex('ProductName'),3000, { from: ethaddress }, function(err, result){ ... })
Wenn Sie nur eine Funktion aufrufen möchten, die den Status nicht aktualisiert (und nichts kostet):
contractInstance.product.call(param1, , function(err, result){ ... })
methods
nachdem ich die Instanz in eine Browserkonsole geschrieben habe. Muss ich nicht auch irgendwie einen Schlüssel angeben, um eine Statusänderungstransaktion zu signieren? from: ethaddress
kann nicht genug sein oder?Sie müssen Web3js verwenden , um Ihre Transaktion auf der Clientseite zu signieren, bevor Sie sie an Infura senden:
web3.eth.sendSignedTransaction(
web3.eth.accounts.signTransaction(
{
to: contractInstance.address,
data: contractInstance.methods.setOrder.encodeABI(
web3.toHex('ProductName'),3000),
gas: 100000
}));
Weitere Details finden Sie in der Dokumentation
Kaki Meister der Zeit
siloContract
? und welche version von web3 verwendest du?sunwarr10r
MyContract
. Ich verwende 0.20.6Kaki Meister der Zeit
coinbase
), um Transaktionen auf Ropsten aufrufen zu können.