From ad379bfa58a01f3c39205d459ef85ae7f687946d Mon Sep 17 00:00:00 2001 From: yyb <1416014977@qq.com> Date: Tue, 20 Jan 2026 10:04:58 +0800 Subject: [PATCH] =?UTF-8?q?update=20m2pool=20alph=E5=B9=B8=E8=BF=90?= =?UTF-8?q?=E5=80=BC=E8=8E=B7=E5=8F=96=E6=AD=BB=E5=BE=AA=E7=8E=AF=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/m2pool/pool/task/DataTask.java | 430 +++++++++--------- 1 file changed, 218 insertions(+), 212 deletions(-) diff --git a/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/task/DataTask.java b/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/task/DataTask.java index ed0043d..e67e635 100644 --- a/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/task/DataTask.java +++ b/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/task/DataTask.java @@ -3969,221 +3969,227 @@ public class DataTask { LuckDto dto = new LuckDto(); Date end = DateUtils.parseDate(DateUtils.dateTimeNow(DateUtils.YYYY_MM_DD)); do { - //幸运值 - // N天应出块数量 = N天矿池平均算力/ N天全网平均算力 * 币种每日出块数 * N天 取同一时间点的矿池算力/全网算力 - // 币种每日出块数 = 720 数值来源: 每日分钟数(24*60) / 出一个块需要的时间(根据具体币种 nexa是2分钟) - // N天实际出块量 数据库查询N天实际出块量 - // N天幸运值 = N天实际出块量 / N天应出块量 * 100 结果即百分比数字% - /** 全网每日出块数 */ - BigDecimal nexaCount = PoolCalParamConfig.ALPH.getCount(); + //代码出错一次,time++防止死循环。目前获取alph 幸运值这个可能和enx一样不要了 + try{ + //幸运值 + // N天应出块数量 = N天矿池平均算力/ N天全网平均算力 * 币种每日出块数 * N天 取同一时间点的矿池算力/全网算力 + // 币种每日出块数 = 720 数值来源: 每日分钟数(24*60) / 出一个块需要的时间(根据具体币种 nexa是2分钟) + // N天实际出块量 数据库查询N天实际出块量 + // N天幸运值 = N天实际出块量 / N天应出块量 * 100 结果即百分比数字% + /** 全网每日出块数 */ + BigDecimal nexaCount = PoolCalParamConfig.ALPH.getCount(); - //计算矿池每日实际应出块数 block中算力单位是H/s - int hRate = PoolUnits.ALPH.gethRate(); - //先把矿池算力单位转换为H/s 再除以全网算力 得到比值 再乘以每日全网出块数 得到矿池每日应出块数 - List netPowerList = poolMapper.getDailyNetPower("alph"); - if(netPowerList.size() < 1){ - continue; + //计算矿池每日实际应出块数 block中算力单位是H/s + int hRate = PoolUnits.ALPH.gethRate(); + //先把矿池算力单位转换为H/s 再除以全网算力 得到比值 再乘以每日全网出块数 得到矿池每日应出块数 + List netPowerList = poolMapper.getDailyNetPower("alph"); + if(netPowerList.size() < 1){ + continue; + } + + List poolPowerList = poolMapper.getDailyPoolPower("alph"); + + //拿报块list 筛选实际出块数 + List list = poolMapper.getNEXABlockInfoList(); + + if (list.size() < 1){ + continue; + } + + //第一条报块数据的时间 + Date poolStart = list.get(list.size() - 1).getDate(); + Date start3d = DateUtils.addDays(end,-3); + Date start7d = DateUtils.addDays(end,-7); + Date start30d = DateUtils.addDays(end,-30); + Date start90d = DateUtils.addDays(end,-90); + //(矿池平均/全网平均) * (全网计算平均的时间/矿池计算平均的时间) * 每日全网出块数 = 矿池每日应出块数 + long pDay3d = poolPowerList.stream() + .filter(e -> (e.getPDate().before(end))) + .filter(e -> (e.getPDate().after(start3d) || e.getPDate().equals(start3d))).count(); + + //矿池单位转换 + BigDecimal pPow3d = poolPowerList.stream() + .filter(e -> (e.getPDate().before(end))) + .filter(e -> (e.getPDate().after(start3d) || e.getPDate().equals(start3d))) + .map(e -> e.getValue()).reduce(BigDecimal.ZERO, BigDecimal::add) + .multiply(BigDecimal.valueOf(hRate)); + + long nDay3d = netPowerList.stream() + .filter(e -> (e.getPDate().before(end))) + .filter(e -> (e.getPDate().after(start3d) || e.getPDate().equals(start3d))).count(); + + BigDecimal nPow3d = netPowerList.stream() + .filter(e -> (e.getPDate().before(end))) + .filter(e -> (e.getPDate().after(start3d) || e.getPDate().equals(start3d))) + .map(e -> e.getValue()).reduce(BigDecimal.ZERO, BigDecimal::add); + + if(pDay3d == 0 || nDay3d == 0){ + continue; + } + //计算3天 每日出块量 + BigDecimal dayChunk3d = pPow3d + .multiply(BigDecimal.valueOf(nDay3d * nDay3d)) + .divide(nPow3d.multiply(BigDecimal.valueOf(pDay3d * pDay3d)),8,BigDecimal.ROUND_HALF_UP) + .multiply(nexaCount) + .setScale(8, BigDecimal.ROUND_HALF_UP); + + long pDay7d = poolPowerList.stream() + .filter(e -> (e.getPDate().before(end))) + .filter(e -> (e.getPDate().after(start7d) || e.getPDate().equals(start7d))).count(); + + BigDecimal pPow7d = poolPowerList.stream() + .filter(e -> (e.getPDate().before(end))) + .filter(e -> (e.getPDate().after(start7d) || e.getPDate().equals(start7d))) + .map(e -> e.getValue()).reduce(BigDecimal.ZERO, BigDecimal::add) + .multiply(BigDecimal.valueOf(hRate)); + + long nDay7d = netPowerList.stream() + .filter(e -> (e.getPDate().before(end))) + .filter(e -> (e.getPDate().after(start7d) || e.getPDate().equals(start7d))).count(); + + BigDecimal nPow7d = netPowerList.stream() + .filter(e -> (e.getPDate().before(end))) + .filter(e -> (e.getPDate().after(start7d) || e.getPDate().equals(start7d))) + .map(e -> e.getValue()).reduce(BigDecimal.ZERO, BigDecimal::add); + + if(pDay7d == 0 || nDay7d == 0){ + continue; + } + + //计算7d 每日应出块量 + BigDecimal dayChunk7d = pPow7d + .multiply(BigDecimal.valueOf(nDay7d * nDay7d)) + .divide(nPow7d.multiply(BigDecimal.valueOf(pDay7d * pDay7d)),8,BigDecimal.ROUND_HALF_UP) + .multiply(nexaCount) + .setScale(8, BigDecimal.ROUND_HALF_UP); + + long pDay30d = poolPowerList.stream() + .filter(e -> (e.getPDate().before(end))) + .filter(e -> (e.getPDate().after(start30d) || e.getPDate().equals(start30d))).count(); + + BigDecimal pPow30d = poolPowerList.stream() + .filter(e -> (e.getPDate().before(end))) + .filter(e -> (e.getPDate().after(start30d) || e.getPDate().equals(start30d))) + .map(e -> e.getValue()).reduce(BigDecimal.ZERO, BigDecimal::add) + .multiply(BigDecimal.valueOf(hRate)); + + long nDay30d = netPowerList.stream() + .filter(e -> (e.getPDate().before(end))) + .filter(e -> (e.getPDate().after(start30d) || e.getPDate().equals(start30d))).count(); + + BigDecimal nPow30d = netPowerList.stream() + .filter(e -> (e.getPDate().before(end))) + .filter(e -> (e.getPDate().after(start30d) || e.getPDate().equals(start30d))) + .map(e -> e.getValue()).reduce(BigDecimal.ZERO, BigDecimal::add); + + if(pDay30d == 0 || nDay30d == 0){ + continue; + } + + //计算30d 每日应出块量 + BigDecimal dayChunk30d = pPow30d + .multiply(BigDecimal.valueOf(nDay30d * nDay30d)) + .divide(nPow30d.multiply(BigDecimal.valueOf(pDay30d * pDay30d)),8,BigDecimal.ROUND_HALF_UP) + .multiply(nexaCount) + .setScale(8, BigDecimal.ROUND_HALF_UP); + + long pDay90d = poolPowerList.stream() + .filter(e -> (e.getPDate().before(end))) + .filter(e -> (e.getPDate().after(start90d) || e.getPDate().equals(start90d))).count(); + + BigDecimal pPow90d = poolPowerList.stream() + .filter(e -> (e.getPDate().before(end))) + .filter(e -> (e.getPDate().after(start90d) || e.getPDate().equals(start90d))) + .map(e -> e.getValue()).reduce(BigDecimal.ZERO, BigDecimal::add) + .multiply(BigDecimal.valueOf(hRate)); + + long nDay90d = netPowerList.stream() + .filter(e -> (e.getPDate().before(end))) + .filter(e -> (e.getPDate().after(start90d) || e.getPDate().equals(start90d))).count(); + + BigDecimal nPow90d = netPowerList.stream() + .filter(e -> (e.getPDate().before(end))) + .filter(e -> (e.getPDate().after(start90d) || e.getPDate().equals(start90d))) + .map(e -> e.getValue()).reduce(BigDecimal.ZERO, BigDecimal::add); + + if(pDay90d == 0 || nDay90d == 0){ + continue; + } + + //计算90d 每日应出块量 + BigDecimal dayChunk90d = pPow90d + .multiply(BigDecimal.valueOf(nDay90d * nDay90d)) + .divide(nPow90d.multiply(BigDecimal.valueOf(pDay90d * pDay90d)),8,BigDecimal.ROUND_HALF_UP) + .multiply(nexaCount) + .setScale(8, BigDecimal.ROUND_HALF_UP); + + //3天时间出块数 + long count3d = list.stream() + .filter(e -> (e.getDate().before(end))) + .filter(e -> (e.getDate().after(start3d) || e.getDate().equals(start3d))) + .count(); + BigDecimal chunk3d = BigDecimal.valueOf(count3d); + //7天时间出块数 + long count7d = list.stream() + .filter(e -> (e.getDate().before(end))) + .filter(e -> (e.getDate().after(start7d) || e.getDate().equals(start7d))) + .count(); + BigDecimal chunk7d = BigDecimal.valueOf(count7d); + //30天时间出块数 + long count30d = list.stream() + .filter(e -> (e.getDate().before(end))) + .filter(e -> (e.getDate().after(start30d) || e.getDate().equals(start30d))) + .count(); + BigDecimal chunk30d = BigDecimal.valueOf(count30d); + //90天时间出块数 + long count90d = list.stream() + .filter(e -> (e.getDate().before(end))) + .filter(e -> (e.getDate().after(start90d) || e.getDate().equals(start90d))) + .count(); + BigDecimal chunk90d = BigDecimal.valueOf(count90d); + + if(poolStart.after(start3d)){ + System.out.println("不足3天"); + long needTime = poolStart.getTime()-start3d.getTime(); + chunk3d = chunk3d + .add(dayChunk3d.multiply(BigDecimal.valueOf(needTime).divide(BigDecimal.valueOf(86400000),8,BigDecimal.ROUND_HALF_UP))); + } + System.out.println("3天出块量"+chunk3d); + dto.setLuck3d(chunk3d.divide(dayChunk3d.multiply(BigDecimal.valueOf(3)),4,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).doubleValue()); + + if(poolStart.after(start7d)){ + System.out.println("不足7天"); + long needTime = poolStart.getTime()-start7d.getTime(); + chunk7d = chunk7d + .add(dayChunk7d.multiply(BigDecimal.valueOf(needTime).divide(BigDecimal.valueOf(86400000),8,BigDecimal.ROUND_HALF_UP))); + } + System.out.println("7天出块量"+chunk7d); + dto.setLuck7d(chunk7d.divide(dayChunk7d.multiply(BigDecimal.valueOf(7)),4,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).doubleValue()); + + + if(poolStart.after(start30d)){ + System.out.println("不足30天"); + long needTime = poolStart.getTime()-start30d.getTime(); + chunk30d = chunk30d + .add(dayChunk30d.multiply(BigDecimal.valueOf(needTime).divide(BigDecimal.valueOf(86400000),8,BigDecimal.ROUND_HALF_UP))); + } + System.out.println("30天出块量"+chunk30d); + dto.setLuck30d(chunk30d.divide(dayChunk30d.multiply(BigDecimal.valueOf(30)),4,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).doubleValue()); + + if(poolStart.after(start90d)){ + System.out.println("不足90天"); + long needTime = poolStart.getTime()-start90d.getTime(); + chunk90d = chunk90d + .add(dayChunk90d.multiply(BigDecimal.valueOf(needTime).divide(BigDecimal.valueOf(86400000),8,BigDecimal.ROUND_HALF_UP))); + } + System.out.println("90天出块量"+chunk90d); + dto.setLuck90d(chunk90d.divide(dayChunk90d.multiply(BigDecimal.valueOf(90)),4,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).doubleValue()); + + break; + }catch (Exception e){ + time++; } - List poolPowerList = poolMapper.getDailyPoolPower("alph"); - - //拿报块list 筛选实际出块数 - List list = poolMapper.getNEXABlockInfoList(); - - if (list.size() < 1){ - continue; - } - - //第一条报块数据的时间 - Date poolStart = list.get(list.size() - 1).getDate(); - Date start3d = DateUtils.addDays(end,-3); - Date start7d = DateUtils.addDays(end,-7); - Date start30d = DateUtils.addDays(end,-30); - Date start90d = DateUtils.addDays(end,-90); - //(矿池平均/全网平均) * (全网计算平均的时间/矿池计算平均的时间) * 每日全网出块数 = 矿池每日应出块数 - long pDay3d = poolPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start3d) || e.getPDate().equals(start3d))).count(); - - //矿池单位转换 - BigDecimal pPow3d = poolPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start3d) || e.getPDate().equals(start3d))) - .map(e -> e.getValue()).reduce(BigDecimal.ZERO, BigDecimal::add) - .multiply(BigDecimal.valueOf(hRate)); - - long nDay3d = netPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start3d) || e.getPDate().equals(start3d))).count(); - - BigDecimal nPow3d = netPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start3d) || e.getPDate().equals(start3d))) - .map(e -> e.getValue()).reduce(BigDecimal.ZERO, BigDecimal::add); - - if(pDay3d == 0 || nDay3d == 0){ - continue; - } - //计算3天 每日出块量 - BigDecimal dayChunk3d = pPow3d - .multiply(BigDecimal.valueOf(nDay3d * nDay3d)) - .divide(nPow3d.multiply(BigDecimal.valueOf(pDay3d * pDay3d)),8,BigDecimal.ROUND_HALF_UP) - .multiply(nexaCount) - .setScale(8, BigDecimal.ROUND_HALF_UP); - - long pDay7d = poolPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start7d) || e.getPDate().equals(start7d))).count(); - - BigDecimal pPow7d = poolPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start7d) || e.getPDate().equals(start7d))) - .map(e -> e.getValue()).reduce(BigDecimal.ZERO, BigDecimal::add) - .multiply(BigDecimal.valueOf(hRate)); - - long nDay7d = netPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start7d) || e.getPDate().equals(start7d))).count(); - - BigDecimal nPow7d = netPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start7d) || e.getPDate().equals(start7d))) - .map(e -> e.getValue()).reduce(BigDecimal.ZERO, BigDecimal::add); - - if(pDay7d == 0 || nDay7d == 0){ - continue; - } - - //计算7d 每日应出块量 - BigDecimal dayChunk7d = pPow7d - .multiply(BigDecimal.valueOf(nDay7d * nDay7d)) - .divide(nPow7d.multiply(BigDecimal.valueOf(pDay7d * pDay7d)),8,BigDecimal.ROUND_HALF_UP) - .multiply(nexaCount) - .setScale(8, BigDecimal.ROUND_HALF_UP); - - long pDay30d = poolPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start30d) || e.getPDate().equals(start30d))).count(); - - BigDecimal pPow30d = poolPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start30d) || e.getPDate().equals(start30d))) - .map(e -> e.getValue()).reduce(BigDecimal.ZERO, BigDecimal::add) - .multiply(BigDecimal.valueOf(hRate)); - - long nDay30d = netPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start30d) || e.getPDate().equals(start30d))).count(); - - BigDecimal nPow30d = netPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start30d) || e.getPDate().equals(start30d))) - .map(e -> e.getValue()).reduce(BigDecimal.ZERO, BigDecimal::add); - - if(pDay30d == 0 || nDay30d == 0){ - continue; - } - - //计算30d 每日应出块量 - BigDecimal dayChunk30d = pPow30d - .multiply(BigDecimal.valueOf(nDay30d * nDay30d)) - .divide(nPow30d.multiply(BigDecimal.valueOf(pDay30d * pDay30d)),8,BigDecimal.ROUND_HALF_UP) - .multiply(nexaCount) - .setScale(8, BigDecimal.ROUND_HALF_UP); - - long pDay90d = poolPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start90d) || e.getPDate().equals(start90d))).count(); - - BigDecimal pPow90d = poolPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start90d) || e.getPDate().equals(start90d))) - .map(e -> e.getValue()).reduce(BigDecimal.ZERO, BigDecimal::add) - .multiply(BigDecimal.valueOf(hRate)); - - long nDay90d = netPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start90d) || e.getPDate().equals(start90d))).count(); - - BigDecimal nPow90d = netPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start90d) || e.getPDate().equals(start90d))) - .map(e -> e.getValue()).reduce(BigDecimal.ZERO, BigDecimal::add); - - if(pDay90d == 0 || nDay90d == 0){ - continue; - } - - //计算90d 每日应出块量 - BigDecimal dayChunk90d = pPow90d - .multiply(BigDecimal.valueOf(nDay90d * nDay90d)) - .divide(nPow90d.multiply(BigDecimal.valueOf(pDay90d * pDay90d)),8,BigDecimal.ROUND_HALF_UP) - .multiply(nexaCount) - .setScale(8, BigDecimal.ROUND_HALF_UP); - - //3天时间出块数 - long count3d = list.stream() - .filter(e -> (e.getDate().before(end))) - .filter(e -> (e.getDate().after(start3d) || e.getDate().equals(start3d))) - .count(); - BigDecimal chunk3d = BigDecimal.valueOf(count3d); - //7天时间出块数 - long count7d = list.stream() - .filter(e -> (e.getDate().before(end))) - .filter(e -> (e.getDate().after(start7d) || e.getDate().equals(start7d))) - .count(); - BigDecimal chunk7d = BigDecimal.valueOf(count7d); - //30天时间出块数 - long count30d = list.stream() - .filter(e -> (e.getDate().before(end))) - .filter(e -> (e.getDate().after(start30d) || e.getDate().equals(start30d))) - .count(); - BigDecimal chunk30d = BigDecimal.valueOf(count30d); - //90天时间出块数 - long count90d = list.stream() - .filter(e -> (e.getDate().before(end))) - .filter(e -> (e.getDate().after(start90d) || e.getDate().equals(start90d))) - .count(); - BigDecimal chunk90d = BigDecimal.valueOf(count90d); - - if(poolStart.after(start3d)){ - System.out.println("不足3天"); - long needTime = poolStart.getTime()-start3d.getTime(); - chunk3d = chunk3d - .add(dayChunk3d.multiply(BigDecimal.valueOf(needTime).divide(BigDecimal.valueOf(86400000),8,BigDecimal.ROUND_HALF_UP))); - } - System.out.println("3天出块量"+chunk3d); - dto.setLuck3d(chunk3d.divide(dayChunk3d.multiply(BigDecimal.valueOf(3)),4,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).doubleValue()); - - if(poolStart.after(start7d)){ - System.out.println("不足7天"); - long needTime = poolStart.getTime()-start7d.getTime(); - chunk7d = chunk7d - .add(dayChunk7d.multiply(BigDecimal.valueOf(needTime).divide(BigDecimal.valueOf(86400000),8,BigDecimal.ROUND_HALF_UP))); - } - System.out.println("7天出块量"+chunk7d); - dto.setLuck7d(chunk7d.divide(dayChunk7d.multiply(BigDecimal.valueOf(7)),4,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).doubleValue()); - - - if(poolStart.after(start30d)){ - System.out.println("不足30天"); - long needTime = poolStart.getTime()-start30d.getTime(); - chunk30d = chunk30d - .add(dayChunk30d.multiply(BigDecimal.valueOf(needTime).divide(BigDecimal.valueOf(86400000),8,BigDecimal.ROUND_HALF_UP))); - } - System.out.println("30天出块量"+chunk30d); - dto.setLuck30d(chunk30d.divide(dayChunk30d.multiply(BigDecimal.valueOf(30)),4,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).doubleValue()); - - if(poolStart.after(start90d)){ - System.out.println("不足90天"); - long needTime = poolStart.getTime()-start90d.getTime(); - chunk90d = chunk90d - .add(dayChunk90d.multiply(BigDecimal.valueOf(needTime).divide(BigDecimal.valueOf(86400000),8,BigDecimal.ROUND_HALF_UP))); - } - System.out.println("90天出块量"+chunk90d); - dto.setLuck90d(chunk90d.divide(dayChunk90d.multiply(BigDecimal.valueOf(90)),4,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).doubleValue()); - - break; }while (time < 4); redisService.deleteObject("ALPHLuck");