Cuando intento desbloquear la cuenta con el método personalUnlockAccount.accountUnlocked() de la clase PersonalUnlockAccount de la biblioteca web3j, está dando NullPointerException incluso si estoy ingresando la contraseña correcta.
Señale el mal que estoy cometiendo en el siguiente código.
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");
}
}
}
Ahora bien, este es el error que estoy recibiendo. Por favor, ayúdame.
[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)
Por favor sugiérame al revés. En mi proyecto, quiero enviar desde la dirección y la contraseña desde la interfaz de usuario. ¿Hay algún otro enfoque con el que pueda ir, que debería ser fácil desde la perspectiva del usuario?
Necesito usar explícitamente la API personal para RPC. Usar esta bandera funcionó para mí.
--rpcapi "db,eth,net,web3,personal"
Gracias @Ismael por la ayuda.
Un poco más de información. Parece que estoy obteniendo algunos resultados inconsistentes aquí. En este segmento de código, RawResponce es nulo, sin embargo, el valor booleano se devuelve correctamente.
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 [principal] INFORMACIÓN com.abelgo.eth.EthAdaptor - ¡DESBLOQUEO DE LLAMADAS! 10:35:42.552 [principal] DEPURAR org.web3j.protocol.ipc.IpcService - >> {"jsonrpc":"2.0","método":"personal_unlockAccount","params":["0xf1b0725bd64cbe62a5160357d53e92c54788f2e5","-SECRET -",7],"id":13} 10:35:43.245 [principal] DEPURAR org.web3j.protocol.ipc.IpcService - << {"jsonrpc":"2.0","id":13,"resultado ":verdadero}
10:35:43.247 [principal] INFORMACIÓN com.abelgo.eth.EthAdaptor - LA RESPUESTA SIN PROCESAR ES: nula 10:35:43.247 [principal] INFORMACIÓN com.abelgo.eth.EthAdaptor - BOOLEAN ES: verdadero
ismael
personal
habilitada la API?kaushik_pm
ismael
--rpcapi "db,eth,net,web3,personal"
.kaushik_pm
ismael
personal
, no está habilitado en RPC, debe habilitarlo explícitamente.kaushik_pm
abelgo
kaushik_pm
abelgo
abelgo
alper
geth
?