New file |
| | |
| | | package com.xcong.excoin.modules.member.service; |
| | | |
| | | import org.apache.commons.lang3.StringUtils; |
| | | import org.web3j.abi.FunctionEncoder; |
| | | import org.web3j.abi.FunctionReturnDecoder; |
| | | import org.web3j.abi.TypeReference; |
| | | import org.web3j.abi.datatypes.Address; |
| | | import org.web3j.abi.datatypes.Function; |
| | | import org.web3j.abi.datatypes.Type; |
| | | import org.web3j.abi.datatypes.generated.Uint256; |
| | | import org.web3j.crypto.Credentials; |
| | | import org.web3j.crypto.RawTransaction; |
| | | import org.web3j.crypto.TransactionEncoder; |
| | | import org.web3j.crypto.WalletUtils; |
| | | import org.web3j.protocol.Web3j; |
| | | import org.web3j.protocol.core.DefaultBlockParameterName; |
| | | import org.web3j.protocol.core.Request; |
| | | import org.web3j.protocol.core.methods.request.Transaction; |
| | | import org.web3j.protocol.core.methods.response.*; |
| | | import org.web3j.protocol.http.HttpService; |
| | | import org.web3j.utils.Convert; |
| | | import org.web3j.utils.Convert.Unit; |
| | | import org.web3j.utils.Numeric; |
| | | |
| | | import java.io.File; |
| | | import java.io.IOException; |
| | | import java.math.BigDecimal; |
| | | import java.math.BigInteger; |
| | | import java.util.*; |
| | | import java.util.concurrent.ExecutionException; |
| | | |
| | | /** |
| | | * ETH类,使用Web3j 下面为使用教程 |
| | | * https://kauri.io/article/925d923e12c543da9a0a3e617be963b4/manage-an-ethereum-account-with-java-and-web3js |
| | | * |
| | | * @author Administrator |
| | | * |
| | | */ |
| | | |
| | | public class EthService { |
| | | |
| | | private static String ethWalletPath = "/home/javaweb/webresource/eth"; |
| | | |
| | | |
| | | public static final String TOTAL_ADDRESS = "0x8115A796327311e627050d0129C17176A79Dc050"; |
| | | public static final String TOTAL_PRIVATE_KEY = "bba4029d67e26ec6b537db986c8500b5bc1c21b53755dd7a3d41d9a4ce84c05e"; |
| | | // private static String ethWalletPath="E://"; |
| | | private Web3j web3j; |
| | | // private Admin admin; |
| | | // private Parity parity; |
| | | /** |
| | | * 服务器地址 |
| | | */ |
| | | //private static final String ETH_UTL = "https://mainnet.infura.io/v3/882c66ebcfc141abbea22b948fa44321"; |
| | | private static final String ETH_UTL = "http://120.55.86.146:8545"; |
| | | |
| | | public EthService() { |
| | | try { |
| | | HttpService service = new HttpService(ETH_UTL); |
| | | web3j = Web3j.build(service); |
| | | // parity = Parity.build(service); |
| | | // admin = Admin.build(service); |
| | | } catch (Exception e) { |
| | | System.out.println("liangjieshibao"); |
| | | // logger.error("==============虚拟币-以太坊链接获取失败!"); |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 查询ETH余额 |
| | | * |
| | | * @param address |
| | | * @return |
| | | */ |
| | | public static BigDecimal getEthBlance(String address) { |
| | | Web3j web3 = Web3j.build(new HttpService(ETH_UTL)); |
| | | EthGetBalance balanceWei; |
| | | try { |
| | | balanceWei = web3.ethGetBalance(address, DefaultBlockParameterName.LATEST).send(); |
| | | if (balanceWei.getResult() == null) { |
| | | return null; |
| | | } |
| | | BigDecimal balanceInEther = Convert.fromWei(balanceWei.getBalance().toString(), Unit.ETHER); |
| | | return balanceInEther; |
| | | } catch (Exception e) { |
| | | System.out.println("ETH查询失败:" + address); |
| | | e.printStackTrace(); |
| | | } |
| | | return null; |
| | | |
| | | } |
| | | |
| | | /** |
| | | * 创建ETH钱包 |
| | | * |
| | | * @return |
| | | */ |
| | | public static Map<String, String> createEth() { |
| | | Map<String, String> wallet = new HashMap<String, String>(); |
| | | try { |
| | | String walletPassword = "secr3t"; |
| | | // 文件路径 |
| | | String walletDirectory = ethWalletPath; |
| | | |
| | | String walletName = WalletUtils.generateNewWalletFile(walletPassword, new File(walletDirectory)); |
| | | System.out.println("wallet location: " + walletDirectory + "/" + walletName); |
| | | Credentials credentials = WalletUtils.loadCredentials(walletPassword, walletDirectory + "/" + walletName); |
| | | String accountAddress = credentials.getAddress(); |
| | | String privateKey = credentials.getEcKeyPair().getPrivateKey().toString(16); |
| | | // 钱包地址 |
| | | wallet.put("address", accountAddress); |
| | | // 钱包私钥 |
| | | wallet.put("privateKey", privateKey); |
| | | // 产生的钱包文件地址 |
| | | wallet.put("walletLocation", walletDirectory + "/" + walletName); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | return wallet; |
| | | } |
| | | |
| | | public boolean checkTransferResult(String hash) { |
| | | // 0xa3e6a0ccc3aac30d866a86ca9c0477dd58b7b061787ba40b16c3844803273816 交易hash |
| | | Request<?, EthGetTransactionReceipt> ethGetTransactionReceiptRequest = web3j.ethGetTransactionReceipt(hash); |
| | | EthGetTransactionReceipt send = null; |
| | | try { |
| | | send = ethGetTransactionReceiptRequest.send(); |
| | | if(send!=null){ |
| | | TransactionReceipt result = send.getResult(); |
| | | if(result!=null){ |
| | | String status = result.getStatus(); |
| | | System.out.println(status);//0x1 |
| | | if("0x1".equals(status)){ |
| | | return true; |
| | | }else{ |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | } catch (IOException e) { |
| | | e.printStackTrace(); |
| | | return false; |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | public static void main(String[] args) throws IOException, ExecutionException, InterruptedException { |
| | | HttpService service = new HttpService(ETH_UTL); |
| | | Web3j build = Web3j.build(service); |
| | | //Request<?, EthTransaction> ethTransactionRequest = build.ethGetTransactionByHash("0xa3e6a0ccc3aac30d866a86ca9c0477dd58b7b061787ba40b16c3844803273816"); |
| | | // Request<?, EthGetTransactionReceipt> ethGetTransactionReceiptRequest = build.ethGetTransactionReceipt("0xa3e6a0ccc3aac30d866a86ca9c0477dd58b7b061787ba40b16c3844803273816"); |
| | | // EthGetTransactionReceipt send = ethGetTransactionReceiptRequest.send(); |
| | | // String status = send.getResult().getStatus(); |
| | | //System.out.println(status);//0x1 |
| | | // EthTransaction send = ethTransactionRequest.send(); |
| | | // String input = send.getResult().getInput(); |
| | | // System.out.println(input); |
| | | EthService ethService = new EthService(); |
| | | String s = ethService.tokenSend("0x0cf5f120ea654f6806038daa6b021e83a9ab07c8", "1.0", null); |
| | | System.out.println(s); |
| | | } |
| | | |
| | | /** |
| | | * |
| | | * 方法描述:获取代币余额 |
| | | * |
| | | * @param fromAddress |
| | | * @param |
| | | * @param |
| | | * @return long |
| | | */ |
| | | public BigDecimal tokenGetBalance(String fromAddress) { |
| | | try { |
| | | if(StringUtils.isBlank(fromAddress)){ |
| | | fromAddress = TOTAL_ADDRESS; |
| | | } |
| | | // 合约地址 |
| | | String contractAddress = "0xdac17f958d2ee523a2206206994597c13d831ec7"; |
| | | int decimal = 6; |
| | | String methodName = "balanceOf"; |
| | | List<Type> inputParameters = new ArrayList<>(); |
| | | List<TypeReference<?>> outputParameters = new ArrayList<>(); |
| | | Address address = new Address(fromAddress); |
| | | inputParameters.add(address); |
| | | TypeReference<Uint256> typeReference = new TypeReference<Uint256>() { |
| | | }; |
| | | outputParameters.add(typeReference); |
| | | Function function = new Function(methodName, inputParameters, outputParameters); |
| | | String data = FunctionEncoder.encode(function); |
| | | Transaction transaction = Transaction.createEthCallTransaction(fromAddress, contractAddress, data); |
| | | |
| | | EthCall ethCall; |
| | | BigInteger balanceValue = BigInteger.ZERO; |
| | | try { |
| | | ethCall = web3j.ethCall(transaction, DefaultBlockParameterName.LATEST).send(); |
| | | List<Type> results = FunctionReturnDecoder.decode(ethCall.getValue(), function.getOutputParameters()); |
| | | balanceValue = (BigInteger) results.get(0).getValue(); |
| | | } catch (IOException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | double res = BigDecimalUtil.div(new BigDecimal(balanceValue).doubleValue(), Math.pow(10, decimal), 8); |
| | | if (res > 0) { |
| | | return new BigDecimal(res); |
| | | } |
| | | } catch (Exception e) { |
| | | // logger.error("==============以太坊代币链接获取失败!"); |
| | | e.printStackTrace(); |
| | | } |
| | | return BigDecimal.ZERO; |
| | | } |
| | | |
| | | // USDT |
| | | public String tokenSend( String toAddress, String amount,String gas) |
| | | throws InterruptedException, ExecutionException { |
| | | // Web3j web3j = Web3j.build(new |
| | | // HttpService("https://mainnet.infura.io/v3/882c66ebcfc141abbea22b948fa44321")); |
| | | String contractAddress = "0xdac17f958d2ee523a2206206994597c13d831ec7"; |
| | | Credentials credentials = Credentials.create(TOTAL_PRIVATE_KEY); |
| | | |
| | | EthGetTransactionCount ethGetTransactionCount = web3j |
| | | .ethGetTransactionCount(TOTAL_ADDRESS, DefaultBlockParameterName.LATEST).sendAsync().get(); |
| | | |
| | | BigInteger nonce = ethGetTransactionCount.getTransactionCount(); |
| | | |
| | | Function function = new Function("transfer", |
| | | Arrays.asList(new Address(toAddress), new Uint256(new BigInteger(amount))), |
| | | Arrays.asList(new TypeReference<Type>() { |
| | | })); |
| | | |
| | | String encodedFunction = FunctionEncoder.encode(function); |
| | | if(StringUtils.isBlank(gas)){ |
| | | gas = "70"; |
| | | } |
| | | RawTransaction rawTransaction = RawTransaction.createTransaction(nonce, |
| | | Convert.toWei(gas, Unit.GWEI).toBigInteger(),// 给矿工开的转账单价 单价越高越快 |
| | | Convert.toWei("60000", Unit.WEI).toBigInteger(), contractAddress, encodedFunction);//里程上限 |
| | | // 10*80000/1000000000=0.0008 手续费 |
| | | |
| | | byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, credentials); |
| | | String hexValue = Numeric.toHexString(signedMessage); |
| | | |
| | | // log.debug("transfer hexValue:" + hexValue); |
| | | |
| | | EthSendTransaction ethSendTransaction = web3j.ethSendRawTransaction(hexValue).sendAsync().get(); |
| | | |
| | | |
| | | if (ethSendTransaction.hasError()) { |
| | | // log.info("transfer error:", ethSendTransaction.getError().getMessage()); |
| | | return ""; |
| | | } else { |
| | | String transactionHash = ethSendTransaction.getTransactionHash(); |
| | | // log.info("Transfer transactionHash:" + transactionHash); |
| | | return transactionHash; |
| | | } |
| | | } |
| | | |
| | | public String ethSend(String privateKey, String fromAddress, String toAddress, String amount) |
| | | throws InterruptedException, ExecutionException { |
| | | // Web3j web3j = Web3j.build(new |
| | | // HttpService("https://mainnet.infura.io/v3/882c66ebcfc141abbea22b948fa44321")); |
| | | |
| | | Credentials credentials = Credentials.create(privateKey); |
| | | |
| | | EthGetTransactionCount ethGetTransactionCount = web3j |
| | | .ethGetTransactionCount(fromAddress, DefaultBlockParameterName.LATEST).sendAsync().get(); |
| | | |
| | | BigInteger nonce = ethGetTransactionCount.getTransactionCount(); |
| | | BigInteger value = Convert.toWei(amount, Unit.ETHER).toBigInteger(); |
| | | RawTransaction rawTransaction = RawTransaction.createEtherTransaction(nonce, |
| | | Convert.toWei("50", Unit.GWEI).toBigInteger(), |
| | | Convert.toWei("60000", Unit.WEI).toBigInteger(), toAddress, value); |
| | | byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, credentials); |
| | | String hexValue = Numeric.toHexString(signedMessage); |
| | | |
| | | EthSendTransaction ethSendTransaction = web3j.ethSendRawTransaction(hexValue).sendAsync().get(); |
| | | if (ethSendTransaction.hasError()) { |
| | | // log.info("transfer error:", ethSendTransaction.getError().getMessage()); |
| | | return ""; |
| | | } else { |
| | | String transactionHash = ethSendTransaction.getTransactionHash(); |
| | | // log.info("Transfer transactionHash:" + transactionHash); |
| | | return transactionHash; |
| | | } |
| | | } |
| | | |
| | | |
| | | } |