即使插入了正確的密碼,personalUnlockAccount.accountUnlocked() 也會給出 NullPointerException
當我嘗試使用 web3j 庫的 PersonalUnlockAccount 類的 personalUnlockAccount.accountUnlocked() 方法解鎖帳戶時,即使我輸入正確的密碼,它也會給出 NullPointerException。
請指出錯誤的做法,我在下面的程式碼中送出。
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"); } } }
現在這是我得到的錯誤。請幫幫我。
[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)
請反過來建議我。在我的項目中,我想從 UI 發送地址和密碼。有沒有其他方法,我可以採用,從使用者的角度來看應該很容易?
我需要為 RPC 顯式使用個人 api。使用這個標誌對我有用。
--rpcapi "db,eth,net,web3,personal"
感謝@Ismael 的幫助。
多一些見解。我似乎在這裡得到了一些不一致的結果。在此程式碼段中,RawResponce 為空,但布爾值正確返回。
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 $$資訊 com.abelgo.eth.EthAdaptor - 呼叫解鎖!10:35:42.552$$ main $$調試 org.web3j.protocol.ipc.IpcService - >> {“jsonrpc”:“2.0”,“method”:“personal_unlockAccount”,“params”:$$ “0xf1b0725bd64cbe62a5160357d53e92c54788f2e5”,"-SECRET-",7 $$“身份證”:13} 10:35:43.245$$ main $$調試 org.web3j.protocol.ipc.IpcService - << {“jsonrpc”:“2.0”,“id”:13,“result”:true} 10:35:43.247
$$ main $$資訊 com.abelgo.eth.EthAdaptor - 原始響應是:空 10:35:43.247$$ main $$資訊 com.abelgo.eth.EthAdaptor - BOOLEAN IS:true