Web3j

Web3j 測試賬戶和 Credentials 對象

  • April 24, 2019

我通過執行啟動乙太坊區塊鏈testrpc。那就是創建 10 個有足夠資金的測試賬戶。當我使用 web3 和 node.js 來部署新的智能合約時,我可以使用:

MyContract.new(['MyProps'],{data: byteCode, from: web3.eth.accounts[0], gas: 4800000})

當我在 Java 中使用 web3 時,我需要一個 Credentials 對象。以下行似乎不起作用,因為部署返回帳戶沒有足夠的資金。

String account = web3.ethAccounts().send().getAccounts().get(0);
Credentials c = Credentials.create(account);
Contract_sol_Contract contract = Contract_sol_Contract.deploy(web3, c, new BigInteger("240000"),new BigInteger("2400000"), props).send();

-->sender doesn't have enough funds to send tx. The upfront cost is: 576 and the sender's account only has: 0

顯然,Credentials 對像不正確。據我了解,必須傳遞私鑰並且我使用了公共地址。

  1. 如何訪問 Java web3j 中的私有地址?
  2. 為什麼在 web3 (node.js) 中使用公共地址來部署合約就足夠了?

在此先感謝,馬可

這是一個比您提供的更完整的程序。唯一未定義的部分是Contract_sol_Contract,您沒有定義。注意privateKeypublicKey是如何計算的。

import org.web3j.crypto.Credentials;
import org.web3j.crypto.ECKeyPair;
import org.web3j.protocol.Web3j;
import org.web3j.protocol.http.HttpService;

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

public class SO3 {
   public SO3() throws IOException {
       Web3j web3 = Web3j.build(new HttpService("http://localhost:8545"));
       String account = web3.ethAccounts().send().getAccounts().get(0);
       Credentials credentials = Credentials.create(account);
       ECKeyPair keyPair = credentials.getEcKeyPair();
       BigInteger privateKey = keyPair.getPrivateKey();
       BigInteger publicKey = keyPair.getPublicKey();
       Contract_sol_Contract contract = Contract_sol_Contract.deploy(web3, credentials, new BigInteger("240000"), new BigInteger("2400000"), props).send();
   }
}

我認為web3j偏離web3只需要公鑰或私鑰的原因是因為提供更少的資訊是一種更好的安全實踐。web3帳戶文件有這個警告:The accounts private key. This should never be shared or stored unencrypted in localstorage! Also make sure to null the memory after usage.這意味著不鼓勵傳遞整個帳戶對象。

似乎web3作者知道他們製造了一個安全問題,因為在同一頁面的早些時候,他們給出了這個大警告:This package has NOT been audited and might potentially be unsafe. Take precautions to clear memory properly, store the private keys safely, and test transaction receiving and sending functionality properly before using in production!.

非常感謝。我通過從命令終端粘貼私鑰來管理它testrpc

當我在合約上呼叫一個方法時,結果是TransactionReceipt

TransactionReceipt tx = contract.currentAnswerCount(items.get(0)).send();

實際上,返回值應該是一個 uint。我怎樣才能訪問該值。TransactionReceipt沒有類似getResult()或類似的東西。

適當的solidity程式碼在這裡:

 function currentAnswersCount(bytes32 item) public returns (uint8) {
   return answers[item];
 }

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