- 首页 > it技术 > >
package com.example.demo.eth;
import com.google.common.collect.ImmutableList;
import org.bitcoinj.crypto.*;
import org.bitcoinj.wallet.DeterministicSeed;
import org.web3j.abi.FunctionEncoder;
import org.web3j.abi.TypeReference;
import org.web3j.abi.datatypes.Function;
import org.web3j.abi.datatypes.Type;
import org.web3j.crypto.*;
import org.web3j.protocol.Web3j;
import org.web3j.protocol.core.DefaultBlockParameterName;
import org.web3j.protocol.http.HttpService;
import org.web3j.utils.Convert;
import org.web3j.utils.Numeric;
import sun.security.provider.SecureRandom;
import java.io.IOException;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ExecutionException;
public class Wallet {/**
* path路径
*/
private final static ImmutableList BIP44_ETH_ACCOUNT_ZERO_PATH =
ImmutableList.of(new ChildNumber(44, true), new ChildNumber(60, true),
ChildNumber.ZERO_HARDENED, ChildNumber.ZERO);
/**
* 连接web3 节点
*/
private final static Web3j web3j = Web3j.build(new HttpService("https://ropsten.infura.io"));
public static void main(String[] args) throws Exception {
//创建钱包
//createWallet();
//ETH转账交易
//signETHTransaction();
//ETH代币转账交易
signTokenTransaction();
}/**
* 创建钱包
* @throws MnemonicException.MnemonicLengthException
*/
private static void createWallet()throws MnemonicException.MnemonicLengthException {
SecureRandom secureRandom = new SecureRandom();
byte[] entropy = new byte[DeterministicSeed.DEFAULT_SEED_ENTROPY_BITS / 8];
secureRandom.engineNextBytes(entropy);
//生成12位助记词
Liststr = MnemonicCode.INSTANCE.toMnemonic(entropy);
//使用助记词生成钱包种子
byte[] seed = MnemonicCode.toSeed(str, "");
DeterministicKey masterPrivateKey = HDKeyDerivation.createMasterPrivateKey(seed);
DeterministicHierarchy deterministicHierarchy = new DeterministicHierarchy(masterPrivateKey);
DeterministicKey deterministicKey = deterministicHierarchy
.deriveChild(BIP44_ETH_ACCOUNT_ZERO_PATH, false, true, new ChildNumber(0));
byte[] bytes = deterministicKey.getPrivKeyBytes();
ECKeyPair keyPair = ECKeyPair.create(bytes);
//通过公钥生成钱包地址
String address = Keys.getAddress(keyPair.getPublicKey());
System.out.println();
System.out.println("助记词:");
System.out.println(str);
System.out.println();
System.out.println("地址:");
System.out.println("0x"+address);
System.out.println();
System.out.println("私钥:");
System.out.println("0x"+keyPair.getPrivateKey().toString(16));
System.out.println();
System.out.println("公钥:");
System.out.println(keyPair.getPublicKey().toString(16));
}/**
* ETH转账
* @throws IOException
* @throws ExecutionException
* @throws InterruptedException
*/
public static void signETHTransaction() throws IOException, ExecutionException, InterruptedException {//发送方地址
String from = "0x21985541C5e43b0eB3a343c7fbe8a609ce2CB24a";
//转账数量
String amount = "1";
//接收者地址
String to = "0xc290436b3da897115493a1547B52783c50f0Bef3";
//发送方私钥
String privateKey = "0x7c9df206b49522ce955d48b05a0689ed7a6cb4967b195eabea3a20f38cfcd27d";
//查询地址交易编号
BigInteger nonce = web3j.ethGetTransactionCount(from, DefaultBlockParameterName.PENDING).send().getTransactionCount();
//支付的矿工费
BigInteger gasPrice = web3j.ethGasPrice().send().getGasPrice();
BigInteger gasLimit = new BigInteger("210000");
BigInteger amountWei = Convert.toWei(amount, Convert.Unit.ETHER).toBigInteger();
//签名交易
RawTransaction rawTransaction = RawTransaction.createTransaction(nonce, gasPrice, gasLimit, to, amountWei, "");
Credentials credentials = Credentials.create(privateKey);
byte[] signMessage = TransactionEncoder.signMessage(rawTransaction, credentials);
//广播交易
String hash =web3j.ethSendRawTransaction(Numeric.toHexString(signMessage)).sendAsync().get().getTransactionHash();
System.out.println("hash:"+hash);
}/**
* ETH代币转账
* @throws IOException
* @throws ExecutionException
* @throws InterruptedException
*/
public static void signTokenTransaction() throws IOException, ExecutionException, InterruptedException {//发送方地址
String from = "0x21985541C5e43b0eB3a343c7fbe8a609ce2CB24a";
//转账数量
String amount = "1";
//接收者地址
String to = "0xc290436b3da897115493a1547B52783c50f0Bef3";
//发送方私钥
String privateKey = "0x7c9df206b49522ce955d48b05a0689ed7a6cb4967b195eabea3a20f38cfcd27d";
//代币合约地址
String coinAddress = "0x96a02A09EFcb1c0f9deEa33B01FFb991B77Db1eA";
//查询地址交易编号
BigInteger nonce = web3j.ethGetTransactionCount(from, DefaultBlockParameterName.PENDING).send().getTransactionCount();
//支付的矿工费
BigInteger gasPrice = web3j.ethGasPrice().send().getGasPrice();
BigInteger gasLimit = new BigInteger("210000");
Credentials credentials = Credentials.create(privateKey);
BigInteger amountWei = Convert.toWei(amount, Convert.Unit.ETHER).toBigInteger();
//封装转账交易
Function function = new Function(
"transfer",
Arrays.asList(new org.web3j.abi.datatypes.Address(to),
new org.web3j.abi.datatypes.generated.Uint256(amountWei)),
Collections.>emptyList());
String data = https://www.it610.com/article/FunctionEncoder.encode(function);
//签名交易
RawTransaction rawTransaction = RawTransaction.createTransaction(nonce, gasPrice, gasLimit, coinAddress, data);
byte[] signMessage = TransactionEncoder.signMessage(rawTransaction, credentials);
//广播交易
String hash = web3j.ethSendRawTransaction(Numeric.toHexString(signMessage)).sendAsync().get().getTransactionHash();
System.out.println("hash:"+hash);
}
}
推荐阅读