Helius
2020-06-02 be6979a915b64b831526baf9052726b5bb5cf152
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
package com.xcong.excoin.modules.blackchain.service;
 
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
 
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.admin.Admin;
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.Numeric;
import org.web3j.utils.Convert.Unit;
 
/**
 * 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";
    // 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 {
        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);
    }
 
    /**
     * 
     * 方法描述:获取代币余额
     * 
     * @param fromAddress
     * @param
     * @param
     * @return long
     */
    public BigDecimal tokenGetBalance(String fromAddress) {
        try {
            // 合约地址
            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 privateKey, String fromAddress, String toAddress, String amount)
            throws InterruptedException, ExecutionException {
        // Web3j web3j = Web3j.build(new
        // HttpService("https://mainnet.infura.io/v3/882c66ebcfc141abbea22b948fa44321"));
        String contractAddress = "0xdac17f958d2ee523a2206206994597c13d831ec7";
        Credentials credentials = Credentials.create(privateKey);
 
        EthGetTransactionCount ethGetTransactionCount = web3j
                .ethGetTransactionCount(fromAddress, 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);
 
        RawTransaction rawTransaction = RawTransaction.createTransaction(nonce,
                Convert.toWei("40", Convert.Unit.GWEI).toBigInteger(),// 给矿工开的转账单价 单价越高越快
                Convert.toWei("80000", Convert.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, Convert.Unit.ETHER).toBigInteger();
        RawTransaction rawTransaction = RawTransaction.createEtherTransaction(nonce,
                Convert.toWei("40", Convert.Unit.GWEI).toBigInteger(),
                Convert.toWei("60000", Convert.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;
        }
    }
 
 
}