Go-Ethereum

即使插入了正確的密碼,personalUnlockAccount.accountUnlocked() 也會給出 NullPointerException

  • September 10, 2018

當我嘗試使用 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

引用自:https://ethereum.stackexchange.com/questions/57527