Cryptography
使用 Web3j 載入智能合約,我如何指定我的憑據?
我正在使用 Web3j 庫為我的 Solidity 合約生成 Java 包裝器,我已經將契約部署到區塊鏈並且它已經被探勘,我現在想使用 java 包裝器在 java 中載入契約。
java 包裝器是 SimpleStorage,Web3j 生成了以下方法簽名用於載入合約;
public static SimpleStorage load(String contractAddress, Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit) { return new SimpleStorage(contractAddress, web3j, credentials, gasPrice, gasLimit); } public static SimpleStorage load(String contractAddress, Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit) { return new SimpleStorage(contractAddress, web3j, transactionManager, gasPrice, gasLimit); }
我如何提供 Credentials 對象?我有我在區塊鏈上部署合約的節點的公鑰、私鑰和地址,但是 Credentials 對象採用 ECKeyPair,它期望私鑰和公鑰是 BigInteger,但是我的密鑰只是任意字元串人物。
有什麼我想念的嗎?
為了更清楚一點,我有以下內容;
String publicKey String privateKey String 地址
而且我要
憑證 憑證
傳遞給 load 方法,但 Credentials 只需要
public static Credentials create(String privateKey, String publicKey) { return create(new ECKeyPair(Numeric.toBigInt(privateKey), Numeric.toBigInt(publicKey))); }
我的公鑰和私鑰失敗的地方,因為它們無法轉換為 BigInt
如果您有一個普通的公鑰和私鑰,要生成憑證,您需要將它們轉換為十六進製表示,然後將它們傳遞給憑證的建構子
String hexPrivateKey = String.format("%040x", new BigInteger(1, privateKey.getBytes())); String hexPublicKey = String.format("%040x", new BigInteger(1, publicKey.getBytes())); Credentials creds = Credentials.create(hexPrivateKey, hexPublicKey);
其中 publicKey 和 privateKey 是包含您的普通 pub 和 priv 密鑰的字元串