personalUnlockAccount.accountUnlocked() gibt NullPointerException aus, selbst wenn die richtige Passphrase eingefügt wurde

Wenn ich versuche, das Konto mit der Methode personalUnlockAccount.accountUnlocked() der Klasse PersonalUnlockAccount der web3j-Bibliothek zu entsperren, wird eine NullPointerException ausgegeben, selbst wenn ich das richtige Passwort eingebe.

Bitte weisen Sie auf das Fehlverhalten hin, das ich im folgenden Code begehe.

package com.kaushik.blockchain;

import java.io.IOException;
import java.math.BigInteger;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.web3j.protocol.admin.Admin;
import org.web3j.protocol.admin.methods.response.PersonalUnlockAccount;
import org.web3j.protocol.core.DefaultBlockParameterName;
import org.web3j.protocol.core.methods.request.Transaction;
import org.web3j.protocol.core.methods.response.EthGetBalance;
import org.web3j.protocol.core.methods.response.EthGetTransactionCount;
import org.web3j.protocol.core.methods.response.EthGetTransactionReceipt;
import org.web3j.protocol.core.methods.response.EthSendTransaction;
import org.web3j.protocol.core.methods.response.TransactionReceipt;
import org.web3j.protocol.http.HttpService;
import org.web3j.utils.Convert;

public class MainTransferApp {
    private static final Logger log =
            LoggerFactory.getLogger(MainTransferApp.class);
    public static void main(String[] args) throws Exception {
        new MainTransferApp().run();
    }
    private void run() throws IOException, InterruptedException {
        String from = "0xe8fbbddf73c128e50f824ec6af65cb15c237fe58";
        String to =   "0x288a49996ae58aa9999389912cba8cf908a0990e";
        Admin web3j = Admin.build(new HttpService());
        //web3j
        log.info("Connected to Ethereum client version: "
                + web3j.web3ClientVersion().send().getWeb3ClientVersion());
        PersonalUnlockAccount personalUnlockAccount = web3j.personalUnlockAccount(from, "passPhrase").send();
        log.info("Unlocked: "+personalUnlockAccount.accountUnlocked());
        if(personalUnlockAccount.accountUnlocked()){
        EthGetTransactionCount transactionCount = 
                web3j.ethGetTransactionCount(from, DefaultBlockParameterName.LATEST).send();
        BigInteger value = Convert.toWei("45.0", Convert.Unit.ETHER).toBigInteger();
        Transaction transaction = Transaction.createEtherTransaction(from, 
                transactionCount.getTransactionCount(), 
                BigInteger.valueOf(10000), BigInteger.valueOf(4500000), 
                to, value);
        EthSendTransaction response = web3j.ethSendTransaction(transaction).send();
        if (response.getError() != null) {
            log.info("Transaction error: {}", response.getError().getMessage());
        }
        log.info("Transaction: {}", response.getResult());
        EthGetTransactionReceipt receipt = 
                web3j.ethGetTransactionReceipt(response.getTransactionHash()).send();
        if (receipt.getTransactionReceipt().isPresent()) {
            TransactionReceipt r = receipt.getTransactionReceipt().get();
            log.info("Tx receipt: from={}, to={}, gas={}, cumulativeGas={}", r.getFrom(), r.getTo(), r.getGasUsed().intValue(), r.getCumulativeGasUsed().intValue());
        }
        Thread.sleep(5000);
        EthGetBalance balance = web3j.ethGetBalance(from, DefaultBlockParameterName.LATEST).send();
        log.info("Balance: address={}, amount={}", from, balance.getBalance().longValue());
        balance = web3j.ethGetBalance(to, DefaultBlockParameterName.LATEST).send();
        log.info("Balance: address={}, amount={}", to, balance.getBalance().longValue());
        }else{
            log.info("Error occurred while unlocking account");
        }

    }
}

Das ist jetzt der Fehler, den ich bekomme. Bitte hilf mir.

[main] INFO com.kaushik.blockchain.MainTransferApp - Connected to Ethereum client version: Geth/nodeSOL/v1.8.13-stable-225171a4/windows-amd64/go1.10.3
[main] INFO com.kaushik.blockchain.MainTransferApp - Unlocked: null
Exception in thread "main" java.lang.NullPointerException
    at com.kaushik.blockchain.MainTransferApp.run(MainTransferApp.java:35)
    at com.kaushik.blockchain.MainTransferApp.main(MainTransferApp.java:24)

Bitte schlagen Sie mir den umgekehrten Weg vor. In meinem Projekt möchte ich Adresse und Passwort von der Benutzeroberfläche senden. Gibt es einen anderen Ansatz, mit dem ich gehen kann, der aus Benutzersicht einfach sein sollte?

Mit welchem ​​Befehl wird geth gestartet? Ist die personalAPI aktiviert?
@Ismael Ich verwende den folgenden Befehl. geth --datadir=E:/BC_Private/node1 --networkid 2061 --port 30304 --nodiscover --rpc --rpcaddr 127.0.0.1 --rpcport 8545 --ipcpath=E:/BC_Private/node1/geth.ipc - -mine --minerthreads 1 --gasprice "10000" --etherbase 0xd0831f602d3e10c2c4442918abb0a84cef5582f5 --targetgaslimit "5800000"--ausführlichkeit 3-Konsole
Aus dieser Antwort ethereum.stackexchange.com/a/1414 müssen Sie es explizit für RPC mit aktivieren --rpcapi "db,eth,net,web3,personal".
@Ismael Wenn ich dieses Flag nicht verwende, bedeutet dies, dass es standardmäßig "db,eth,net,web3,personal" hat. Ist es nicht? Bitte klären Sie meine Zweifel.
Aus Sicherheitsgründen personalist RPC nicht aktiviert, Sie müssen es explizit aktivieren.
@Ismael Ich werde diese Lösung ausprobieren und Sie auf den neuesten Stand bringen. :)
Ich habe das gleiche Problem. Personal ist eindeutig in --rpcapi aktiviert, die Verwendung der Java-Script-Client-Attach-Option bestätigt dies, wobei personal.unlockAccount true mit derselben Adresse und Pass-Option zurückgibt. Vom API-Aufruf mit web3j wird jedoch null zurückgegeben ... Jede Lösung wird geschätzt
@Abelgo Versuchen Sie diese alle Flags explizit --rpcapi "db,eth,net,web3,personal". Oder teilen Sie Ihren Code.
Ich habe die Trace-Protokollierung in der web3j-Java-Bibliothek aktiviert. Mein Fazit ist. Die Anrufe funktionieren, das Konto wird entsperrt und die korrekte Antwort von Json RPC protokolliert. Allerdings ist web3j defekt, es gibt trotzdem null zurück. Ich habe auch mit IPC getestet, wo Personal standardmäßig aktiviert sein sollte. Dasselbe Ergebnis, web3j scheint hier kaputt zu sein.
Es gibt auch eine Methode zum Entsperren und Senden derselben Transaktion. siehe "personal_sendTransaction" speichert den Entsperrschritt. org.web3j.protocol.core.methods.request.Transaction txn = org.web3j.protocol.core.methods.request.Transaction.createEtherTransaction(eth_address, nonce.incrementAndGet(), gassPrice, gassLimit, toAddress, value); EthSendTransaction sentTXN = node_admin.personalSendTransaction(txn, this.getPrivateKey() ).send();
Kannst du dein Konto drinnen entsperren geth?

Antworten (2)

Ich muss die persönliche API explizit für RPC verwenden. Die Verwendung dieses Flags hat bei mir funktioniert.

--rpcapi "db,eth,net,web3,personal"

Danke @Ismael für die Hilfe.

Etwas mehr Einblick. Ich scheine hier einige inkonsistente Ergebnisse zu bekommen. In diesem Codesegment ist die RawResponce null, der boolesche Wert wird jedoch korrekt zurückgegeben.

                LOG.info("CALLING UNLOCK !!");
                PersonalUnlockAccount ok = RPC_ADMIN.personalUnlockAccount(HOT_WALLET, ac.getPrivateKey(), ACCOUNT_UNLOCK_SECONDS).send();
                LOG.info("RAW RESPONCE IS: " + ok.getRawResponse());
                LOG.info( "BOOLEAN IS:"  +  ok.accountUnlocked().toString());

10:35:42.550 [main] INFO com.abelgo.eth.EthAdaptor - RUFEN ENTSPERREN !! 10:35:42.552 [main] DEBUG org.web3j.protocol.ipc.IpcService - >> {"jsonrpc":"2.0","method":"personal_unlockAccount","params":["0xf1b0725bd64cbe62a5160357d53e92c54788f2e5","-SECRET -",7],"id":13} 10:35:43.245 [main] DEBUG org.web3j.protocol.ipc.IpcService - << {"jsonrpc":"2.0","id":13,"Ergebnis ":Stimmt}

10:35:43.247 [main] INFO com.abelgo.eth.EthAdaptor – RAW RESPONCE IS: null 10:35:43.247 [main] INFO com.abelgo.eth.EthAdaptor – BOOLEAN IS:true