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?
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
Ismael
personal
API aktiviert?kaushik_pm
Ismael
--rpcapi "db,eth,net,web3,personal"
.kaushik_pm
Ismael
personal
ist RPC nicht aktiviert, Sie müssen es explizit aktivieren.kaushik_pm
Abelgo
kaushik_pm
Abelgo
Abelgo
Alper
geth
?