java.lang.RuntimeException: Fehler bei der Verarbeitung der Transaktionsanforderung: unzureichende Mittel für Gas * Preis + Wert beim Aufrufen der Smart-Contract-Funktion

Verwendung web3jzum Laden eines Vertrags, der im privaten Netzwerk bereitgestellt wird, gemäß diesem Tutorial https://web3j.readthedocs.io/en/latest/smart_contracts.html#constant-methods

intelligenter Vertrag

pragma solidity ^0.4.10;

contract Counter {
    uint256 counter =0;

    function increase() public {
        counter++;
    }

    function  decrease() public{
        counter--;
    }

    function getCounter() public constant  returns (uint256) {
        return counter;
    }
}

den Vertrag kompiliert und seinen Java-Wrapper-Code erstellt hat, ist sein Java-Wrapper-Code

package models.smartcontract;

import java.math.BigInteger;
import java.util.Arrays;
import java.util.Collections;
import org.web3j.abi.TypeReference;
import org.web3j.abi.datatypes.Function;
import org.web3j.abi.datatypes.Type;
import org.web3j.abi.datatypes.generated.Uint256;
import org.web3j.crypto.Credentials;
import org.web3j.protocol.Web3j;
import org.web3j.protocol.core.RemoteCall;
import org.web3j.protocol.core.methods.response.TransactionReceipt;
import org.web3j.tx.Contract;
import org.web3j.tx.TransactionManager;

/**
 * <p>Auto generated code.
 * <p><strong>Do not modify!</strong>
 * <p>Please use the <a href="https://docs.web3j.io/command_line.html">web3j command line tools</a>,
 * or the org.web3j.codegen.SolidityFunctionWrapperGenerator in the 
 * <a href="https://github.com/web3j/web3j/tree/master/codegen">codegen module</a> to update.
 *
 * <p>Generated with web3j version 3.4.0.
 */
public class Counter extends Contract {
    private static final String BINARY = "60806040526000805534801561001457600080fd5b5060ea806100236000396000f30060806040526004361060525763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416638ada066e81146057578063d732d95514607b578063e8927fbc14608f575b600080fd5b348015606257600080fd5b50606960a1565b60408051918252519081900360200190f35b348015608657600080fd5b50608d60a7565b005b348015609a57600080fd5b50608d60b3565b60005490565b60008054600019019055565b6000805460010190555600a165627a7a72305820e1abe3f0dcb8c434de0fe090f66a6d6965a9a74dd54b521d92c04bbe40d5069f0029";

    public static final String FUNC_GETCOUNTER = "getCounter";

    public static final String FUNC_DECREASE = "decrease";

    public static final String FUNC_INCREASE = "increase";

    protected Counter(String contractAddress, Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit) {
        super(BINARY, contractAddress, web3j, credentials, gasPrice, gasLimit);
    }

    protected Counter(String contractAddress, Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit) {
        super(BINARY, contractAddress, web3j, transactionManager, gasPrice, gasLimit);
    }

    public RemoteCall<BigInteger> getCounter() {
        final Function function = new Function(FUNC_GETCOUNTER, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Uint256>() {}));
        return executeRemoteCallSingleValueReturn(function, BigInteger.class);
    }

    public RemoteCall<TransactionReceipt> decrease() {
        final Function function = new Function(
                FUNC_DECREASE, 
                Arrays.<Type>asList(), 
                Collections.<TypeReference<?>>emptyList());
        return executeRemoteCallTransaction(function);
    }

    public RemoteCall<TransactionReceipt> increase() {
        final Function function = new Function(
                FUNC_INCREASE, 
                Arrays.<Type>asList(), 
                Collections.<TypeReference<?>>emptyList());
        return executeRemoteCallTransaction(function);
    }

    public static RemoteCall<Counter> deploy(Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit) {
        return deployRemoteCall(Counter.class, web3j, credentials, gasPrice, gasLimit, BINARY, "");
    }

    public static RemoteCall<Counter> deploy(Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit) {
        return deployRemoteCall(Counter.class, web3j, transactionManager, gasPrice, gasLimit, BINARY, "");
    }

    public static Counter load(String contractAddress, Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit) {
        return new Counter(contractAddress, web3j, credentials, gasPrice, gasLimit);
    }

    public static Counter load(String contractAddress, Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit) {
        return new Counter(contractAddress, web3j, transactionManager, gasPrice, gasLimit);
    }
}

Java-Klassencode ist

Web3j web3 = Web3j.build(new org.web3j.protocol.http.HttpService("http://localhost:8080"));
            Web3ClientVersion web3ClientVersion = web3.web3ClientVersion().send();
            String clientVersion = web3ClientVersion.getWeb3ClientVersion();
            System.out.println("clientVersion is -> "+clientVersion);   
            Credentials credentials = WalletUtils.loadCredentials("wss123456", "/home/sara/.ethereum/privatenet/keystore/UTC--2018-07-20T11-40-45.429000000Z--9e0910461ff92d0b77a5aa90769764a8f1a8d6d9.json");
BigInteger gp = BigInteger.valueOf(86440);
            BigInteger gl = BigInteger.valueOf(186440);

Counter contract = Counter.load("0xF9DdE8E8dE5fd4A0a79BA96a9aAf4F7C7c860E13",web3, credentials,gp,gl);  // constructor params



        System.out.println("before increase counter "+contract.getCounter().send());
        TransactionReceipt transactionReceipt = contract1.increase().send();

        System.out.println("after increase counter "+contract.getCounter().send());

contract.getCounter().send()zeigt 0 an und ich erhalte eine Ausnahme in dieser Zeile

TransactionReceipt transactionReceipt = contract1.increase().send();

Hier sind die Ausnahmeprotokolle

info] clientVersion is -> Geth/MyNodeName/v1.8.10-stable-eae63c51/linux-amd64/go1.10
[info] before increase counter 0
[error] java.lang.RuntimeException: Error processing transaction request: insufficient funds for gas * price + value
[error]     at org.web3j.tx.TransactionManager.processResponse(TransactionManager.java:67)
[error]     at org.web3j.tx.TransactionManager.executeTransaction(TransactionManager.java:51)
[error]     at org.web3j.tx.ManagedTransaction.send(ManagedTransaction.java:87)
[error]     at org.web3j.tx.Contract.executeTransaction(Contract.java:275)
[error]     at org.web3j.tx.Contract.executeTransaction(Contract.java:259)
[error]     at org.web3j.tx.Contract.executeTransaction(Contract.java:253)
[error]     at org.web3j.tx.Contract.lambda$executeRemoteCallTransaction$3(Contract.java:305)
[error]     at org.web3j.protocol.core.RemoteCall.send(RemoteCall.java:30)
[error]     at models.smartcontract.FirstContractJava.main(FirstContractJava.java:46)

Ist das der richtige Weg, um die Methoden aufzurufen? auch warum contract1.increase().send(); Methoden werfen eine Ausnahme aus Gibt es etwas, das fehlt? bitte führen

Antworten (1)

Es scheint, dass das Konto 0x9e0910461ff92d0b77a5aa90769764a8f1a8d6d9leer ist (0 Ether). Wie hoch ist der Saldo dieses Kontos in Ihrer privaten Blockchain?

Sie können das Guthaben mit dem folgenden Code überprüfen:

Web3j web3 = Web3j.build(new org.web3j.protocol.http.HttpService("http://localhost:8080"));

EthGetBalance ethGetBalance = web3
  .ethGetBalance("0x9e0910461ff92d0b77a5aa90769764a8f1a8d6d9", DefaultBlockParameterName.LATEST)
  .sendAsync()
  .get();

BigInteger wei = ethGetBalance.getBalance();

Beim Senden einer Transaktion wird dem Absender ein kleiner Betrag von seinem Konto zur Berechnung belastet (Gas genannt). Sie müssen also das Konto aufladen, um eine Transaktion senden zu können.

Es gibt kein Konto in meinem Code "0x9e0910461ff92d0b77a5aa90769764a8f1a8d6d9"
In der Zeile Credentials credentials = WalletUtils.loadCredentials("wss123456", "/home/sara/.ethereum/privatenet/keystore/UTC--2018-07-20T11-40-45.429000000Z--9e0910461ff92d0b77a5aa90769764a8f1a8d6d9.json");entsperren Sie das Konto 0x9e0910461ff92d0b77a5aa90769764a8f1a8d6d9(Wallet-Datei: UTC--2018-07-20T11-40-45.429000000Z--9e0910461ff92d0b77a5aa90769764a8f1a8d6d9.json) mit dem Passwortwss123456
eth.accounts gibt ["0x4f7f384236f79a5e3322e33cc7bb2ccd5143a87c", "0x6723d7db7458e4eef63d6edbe43fa75397fbfab0"] zurück, nicht die in der Brieftasche erwähnte, was soll ich jetzt tun?
Sie können eines dieser Genesis-Konten verwenden, sie müssen finanziert werden, nehme ich an.