update 全网算力优化,幸运值算法优化

This commit is contained in:
yyb 2025-05-07 17:07:10 +08:00
parent 3565396252
commit 589470260c
6 changed files with 96 additions and 92 deletions

View File

@ -22,8 +22,8 @@ public class BlockDataContext {
@Resource
private DetailedBlockDataV2Strategy detailedBlockDataV2Strategy;
public BlockTimeAndNumberDto getBlockData(Date start, Date end, List<BlockInfoDto> blockPerDays, boolean useAggregated) {
return useAggregated ? detailedBlockDataV2Strategy.getTotalBlocks(start, end,blockPerDays)
: detailedBlockDataV1Strategy.getTotalBlocks(start, end,blockPerDays) ;
public BlockTimeAndNumberDto getBlockData(String coin,Date start, Date end, List<BlockInfoDto> blockPerDays, boolean useAggregated) {
return useAggregated ? detailedBlockDataV2Strategy.getTotalBlocks(coin,start, end,blockPerDays)
: detailedBlockDataV1Strategy.getTotalBlocks(coin,start, end,blockPerDays) ;
}
}

View File

@ -56,4 +56,19 @@ public enum PoolCalParamConfig {
public BigDecimal getPoolFees() {
return poolFees;
}
/**
* 根据 coin 名称获取对应的全网每日出块数
* @param coin 币种名称 "grs", "nexa"
* @return 对应的全网每日出块数
*/
public static BigDecimal getCoinCount(String coin) {
for (PoolCalParamConfig config : PoolCalParamConfig.values()) {
if (config.getCoin().equalsIgnoreCase(coin)) {
return config.getCount();
}
}
return BigDecimal.ZERO;
}
}

View File

@ -11,6 +11,8 @@ import java.math.RoundingMode;
import java.util.Date;
import java.util.List;
import static com.m2pool.pool.enums.PoolCalParamConfig.getCoinCount;
/**
* 旧版
* 用于获取矿池实际报块一段时间内总数
@ -24,26 +26,25 @@ public class DetailedBlockDataV1Strategy implements PoolBlockDataStrategy {
@Override
public BlockTimeAndNumberDto getTotalBlocks(Date start, Date end,List<BlockInfoDto> blockPerDays ) {
public BlockTimeAndNumberDto getTotalBlocks(String coin,Date start, Date end,List<BlockInfoDto> blockPerDays ) {
if (blockPerDays.isEmpty()){
return BlockTimeAndNumberDto.builder().dateLength(BigDecimal.ZERO).height(0).build();
}
long count = blockPerDays.stream()
.filter(e -> (e.getDate().before(end)))
.filter(e -> (e.getDate().after(start) || e.getDate().equals(start)))
.count();
//每日出块数固定的舍弃
// BigDecimal nexaCount = PoolCalParamConfig.NEXA.getCount();
//每日出块数固定的出块数
BigDecimal nexaCount = getCoinCount(coin);
long diffInMillis = end.getTime() - start.getTime();
BigDecimal dateLength2 = BigDecimal.valueOf(diffInMillis).divide(BigDecimal.valueOf(86400000), 0, RoundingMode.HALF_UP);
Date poolStart = blockPerDays.get(blockPerDays.size() - 1).getDate();
//获取时间段内全网的实际报块数
int height = dateLength2.multiply(nexaCount).intValue();
//天数不足时以实际天数计算
if(poolStart.after(start)){
dateLength2 = dateLength2.subtract(BigDecimal.valueOf(poolStart.getTime() - start.getTime()).divide(BigDecimal.valueOf(86400000), 2, BigDecimal.ROUND_HALF_UP));
dateLength2 = dateLength2
.subtract(BigDecimal.valueOf(poolStart.getTime() - start.getTime())
.divide(BigDecimal.valueOf(86400000), 2, RoundingMode.HALF_UP));
height = dateLength2.multiply(nexaCount).intValue();
}
return BlockTimeAndNumberDto.builder().dateLength(dateLength2).height((int) count).build();
return BlockTimeAndNumberDto.builder().dateLength(dateLength2).height(height).build();
}
}

View File

@ -23,7 +23,7 @@ public class DetailedBlockDataV2Strategy implements PoolBlockDataStrategy {
private PoolMapper poolMapper;
@Override
public BlockTimeAndNumberDto getTotalBlocks(Date start, Date end, List<BlockInfoDto> blockPerDays) {
public BlockTimeAndNumberDto getTotalBlocks(String coin,Date start, Date end, List<BlockInfoDto> blockPerDays) {
List<BlockInfoDto> collect = blockPerDays.stream()
.filter(e -> (e.getDate().before(end)))
.filter(e -> (e.getDate().after(start) || e.getDate().equals(start)))

View File

@ -14,9 +14,10 @@ public interface PoolBlockDataStrategy {
/**
* 获取矿池区块数 计算幸运值
* @param coin 币种名
* @param start 查询开始时间
* @param end 查询结束时间当前系统时间
* @return
*/
BlockTimeAndNumberDto getTotalBlocks(Date start, Date end, List<BlockInfoDto> blockPerDays);
BlockTimeAndNumberDto getTotalBlocks(String coin,Date start, Date end, List<BlockInfoDto> blockPerDays);
}

View File

@ -416,45 +416,40 @@ public class DataTask {
//获取全网实际90天内的报块数(v2)
List<BlockInfoDto> blockPerDays = poolMapper.selectNetBlock("nexa_net_block");
//获取矿池实际90天内的报块数(v1)
List<BlockInfoDto> list = poolMapper.getNEXABlockInfoList();
boolean useAggregated = blockPerDays.size() >= 3;
//获取3天内全网的实际报块数
blockPerDays = useAggregated ? blockPerDays : list;
BlockTimeAndNumberDto blockData = blockDataContext.getBlockData(start3d, end,blockPerDays, useAggregated);
BlockTimeAndNumberDto blockData = blockDataContext.getBlockData("nexa",start3d, end,blockPerDays, useAggregated);
//3天矿池理论报块数
BigDecimal dayChunk = getTheoreticalBlocks("nexa",start3d, end, blockData);
BigDecimal throreticalBlocks = getTheoreticalBlocks("nexa",start3d, end, blockData);
//3天矿池实际报块数
int actualBlocks = poolMapper.selectPoolBlock(3);
//3天幸运值
dto.setLuck3d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,8, RoundingMode.HALF_UP).doubleValue());
dto.setLuck3d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue());
//7天幸运值
useAggregated = blockPerDays.size() >= 7;
blockPerDays = useAggregated ? blockPerDays : list;
blockData = blockDataContext.getBlockData(start7d, end,blockPerDays, useAggregated);
dayChunk = getTheoreticalBlocks("nexa",start7d, end, blockData);
blockData = blockDataContext.getBlockData("nexa",start7d, end,blockPerDays, useAggregated);
throreticalBlocks= getTheoreticalBlocks("nexa",start7d, end, blockData);
actualBlocks = poolMapper.selectPoolBlock(7);
dto.setLuck7d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,8, RoundingMode.HALF_UP).doubleValue());
dto.setLuck7d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue());
//30天幸运值
useAggregated = blockPerDays.size() >= 30;
blockPerDays = useAggregated ? blockPerDays : list;
blockData = blockDataContext.getBlockData(start30d, end,blockPerDays, useAggregated);
dayChunk = getTheoreticalBlocks("nexa",start30d, end, blockData);
blockData = blockDataContext.getBlockData("nexa",start30d, end,blockPerDays, useAggregated);
throreticalBlocks= getTheoreticalBlocks("nexa",start30d, end, blockData);
actualBlocks = poolMapper.selectPoolBlock(30);
dto.setLuck30d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,8, RoundingMode.HALF_UP).doubleValue());
dto.setLuck30d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue());
//90天幸运值
useAggregated = blockPerDays.size() >= 90;
blockPerDays = useAggregated ? blockPerDays : list;
blockData = blockDataContext.getBlockData(start90d, end,blockPerDays, useAggregated);
dayChunk = getTheoreticalBlocks("nexa",start90d, end, blockData);
blockData = blockDataContext.getBlockData("nexa",start90d, end,blockPerDays, useAggregated);
throreticalBlocks= getTheoreticalBlocks("nexa",start90d, end, blockData);
actualBlocks = poolMapper.selectPoolBlock(90);
dto.setLuck90d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,8, RoundingMode.HALF_UP).doubleValue());
dto.setLuck90d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue());
redisService.deleteObject("NEXALuck");
@ -883,45 +878,39 @@ public class DataTask {
//获取全网实际90天内的报块数(v2)
List<BlockInfoDto> blockPerDays = poolMapper.selectNetBlock("grs_net_block");
//获取矿池实际90天内的报块数(v1)
List<BlockInfoDto> list = poolMapper.getNEXABlockInfoList();
boolean useAggregated = blockPerDays.size() >= 3;
//获取3天内全网的实际报块数
blockPerDays = useAggregated ? blockPerDays : list;
BlockTimeAndNumberDto blockData = blockDataContext.getBlockData(start3d, end,blockPerDays, useAggregated);
BlockTimeAndNumberDto blockData = blockDataContext.getBlockData("grs",start3d, end,blockPerDays, useAggregated);
//3天矿池理论报块数
BigDecimal dayChunk = getTheoreticalBlocks("grs",start3d, end, blockData);
BigDecimal throreticalBlocks= getTheoreticalBlocks("grs",start3d, end, blockData);
//3天矿池实际报块数
int actualBlocks = poolMapper.selectPoolBlock(3);
//3天幸运值
dto.setLuck3d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,8, RoundingMode.HALF_UP).doubleValue());
dto.setLuck3d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue());
//7天幸运值
useAggregated = blockPerDays.size() >= 7;
blockPerDays = useAggregated ? blockPerDays : list;
blockData = blockDataContext.getBlockData(start7d, end,blockPerDays, useAggregated);
dayChunk = getTheoreticalBlocks("grs",start7d, end, blockData);
blockData = blockDataContext.getBlockData("grs",start7d, end,blockPerDays, useAggregated);
throreticalBlocks= getTheoreticalBlocks("grs",start7d, end, blockData);
actualBlocks = poolMapper.selectPoolBlock(7);
dto.setLuck7d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,8, RoundingMode.HALF_UP).doubleValue());
dto.setLuck7d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue());
//30天幸运值
useAggregated = blockPerDays.size() >= 30;
blockPerDays = useAggregated ? blockPerDays : list;
blockData = blockDataContext.getBlockData(start30d, end,blockPerDays, useAggregated);
dayChunk = getTheoreticalBlocks("grs",start30d, end, blockData);
blockData = blockDataContext.getBlockData("grs",start30d, end,blockPerDays, useAggregated);
throreticalBlocks= getTheoreticalBlocks("grs",start30d, end, blockData);
actualBlocks = poolMapper.selectPoolBlock(30);
dto.setLuck30d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,8, RoundingMode.HALF_UP).doubleValue());
dto.setLuck30d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue());
//90天幸运值
useAggregated = blockPerDays.size() >= 90;
blockPerDays = useAggregated ? blockPerDays : list;
blockData = blockDataContext.getBlockData(start90d, end,blockPerDays, useAggregated);
dayChunk = getTheoreticalBlocks("grs",start90d, end, blockData);
blockData = blockDataContext.getBlockData("grs",start90d, end,blockPerDays, useAggregated);
throreticalBlocks= getTheoreticalBlocks("grs",start90d, end, blockData);
actualBlocks = poolMapper.selectPoolBlock(90);
dto.setLuck90d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,8, RoundingMode.HALF_UP).doubleValue());
dto.setLuck90d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue());
@ -1293,45 +1282,44 @@ public class DataTask {
//获取全网实际90天内的报块数(v2)
List<BlockInfoDto> blockPerDays = poolMapper.selectNetBlock("mona_net_block");
//获取矿池实际90天内的报块数(v1)
List<BlockInfoDto> list = poolMapper.getNEXABlockInfoList();
boolean useAggregated = blockPerDays.size() >= 3;
//获取3天内全网的实际报块数
blockPerDays = useAggregated ? blockPerDays : list;
BlockTimeAndNumberDto blockData = blockDataContext.getBlockData(start3d, end,blockPerDays, useAggregated);
BlockTimeAndNumberDto blockData = blockDataContext.getBlockData("mona",start3d, end,blockPerDays, useAggregated);
//3天矿池理论报块数
BigDecimal dayChunk = getTheoreticalBlocks("mona",start3d, end, blockData);
BigDecimal throreticalBlocks= getTheoreticalBlocks("mona",start3d, end, blockData);
//3天矿池实际报块数
int actualBlocks = poolMapper.selectPoolBlock(3);
//3天幸运值
dto.setLuck3d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,8, RoundingMode.HALF_UP).doubleValue());
dto.setLuck3d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue());
//7天幸运值
useAggregated = blockPerDays.size() >= 7;
blockPerDays = useAggregated ? blockPerDays : list;
blockData = blockDataContext.getBlockData(start7d, end,blockPerDays, useAggregated);
dayChunk = getTheoreticalBlocks("mona",start7d, end, blockData);
blockData = blockDataContext.getBlockData("mona",start7d, end,blockPerDays, useAggregated);
throreticalBlocks= getTheoreticalBlocks("mona",start7d, end, blockData);
actualBlocks = poolMapper.selectPoolBlock(7);
dto.setLuck7d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,8, RoundingMode.HALF_UP).doubleValue());
dto.setLuck7d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue());
//30天幸运值
useAggregated = blockPerDays.size() >= 30;
blockPerDays = useAggregated ? blockPerDays : list;
blockData = blockDataContext.getBlockData(start30d, end,blockPerDays, useAggregated);
dayChunk = getTheoreticalBlocks("nexa",start30d, end, blockData);
blockData = blockDataContext.getBlockData("mona",start30d, end,blockPerDays, useAggregated);
throreticalBlocks= getTheoreticalBlocks("nexa",start30d, end, blockData);
actualBlocks = poolMapper.selectPoolBlock(30);
dto.setLuck30d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,8, RoundingMode.HALF_UP).doubleValue());
dto.setLuck30d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue());
//90天幸运值
useAggregated = blockPerDays.size() >= 90;
blockPerDays = useAggregated ? blockPerDays : list;
blockData = blockDataContext.getBlockData(start90d, end,blockPerDays, useAggregated);
dayChunk = getTheoreticalBlocks("mona",start90d, end, blockData);
blockData = blockDataContext.getBlockData("mona",start90d, end,blockPerDays, useAggregated);
throreticalBlocks= getTheoreticalBlocks("mona",start90d, end, blockData);
actualBlocks = poolMapper.selectPoolBlock(90);
dto.setLuck90d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,8, RoundingMode.HALF_UP).doubleValue());
dto.setLuck90d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue());
redisService.deleteObject("MONALuck");
redisService.setCacheObject("MONALuck",dto);
@ -3417,45 +3405,44 @@ public class DataTask {
//获取全网实际90天内的报块数(v2)
List<BlockInfoDto> blockPerDays = poolMapper.selectNetBlock("rxd_net_block");
//获取矿池实际90天内的报块数(v1)
List<BlockInfoDto> list = poolMapper.getNEXABlockInfoList();
boolean useAggregated = blockPerDays.size() >= 3;
//获取3天内全网的实际报块数
blockPerDays = useAggregated ? blockPerDays : list;
BlockTimeAndNumberDto blockData = blockDataContext.getBlockData(start3d, end,blockPerDays, useAggregated);
BlockTimeAndNumberDto blockData = blockDataContext.getBlockData("rxd",start3d, end,blockPerDays, useAggregated);
//3天矿池理论报块数
BigDecimal dayChunk = getTheoreticalBlocks("rxd",start3d, end, blockData);
BigDecimal throreticalBlocks= getTheoreticalBlocks("rxd",start3d, end, blockData);
//3天矿池实际报块数
int actualBlocks = poolMapper.selectPoolBlock(3);
//3天幸运值
dto.setLuck3d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,8, RoundingMode.HALF_UP).doubleValue());
dto.setLuck3d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue());
//7天幸运值
useAggregated = blockPerDays.size() >= 7;
blockPerDays = useAggregated ? blockPerDays : list;
blockData = blockDataContext.getBlockData(start7d, end,blockPerDays, useAggregated);
dayChunk = getTheoreticalBlocks("rxd",start7d, end, blockData);
blockData = blockDataContext.getBlockData("rxd",start7d, end,blockPerDays, useAggregated);
throreticalBlocks= getTheoreticalBlocks("rxd",start7d, end, blockData);
actualBlocks = poolMapper.selectPoolBlock(7);
dto.setLuck7d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,8, RoundingMode.HALF_UP).doubleValue());
dto.setLuck7d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue());
//30天幸运值
useAggregated = blockPerDays.size() >= 30;
blockPerDays = useAggregated ? blockPerDays : list;
blockData = blockDataContext.getBlockData(start30d, end,blockPerDays, useAggregated);
dayChunk = getTheoreticalBlocks("rxd",start30d, end, blockData);
blockData = blockDataContext.getBlockData("rxd",start30d, end,blockPerDays, useAggregated);
throreticalBlocks= getTheoreticalBlocks("rxd",start30d, end, blockData);
actualBlocks = poolMapper.selectPoolBlock(30);
dto.setLuck30d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,8, RoundingMode.HALF_UP).doubleValue());
dto.setLuck30d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue());
//90天幸运值
useAggregated = blockPerDays.size() >= 90;
blockPerDays = useAggregated ? blockPerDays : list;
blockData = blockDataContext.getBlockData(start90d, end,blockPerDays, useAggregated);
dayChunk = getTheoreticalBlocks("rxd",start90d, end, blockData);
blockData = blockDataContext.getBlockData("rxd",start90d, end,blockPerDays, useAggregated);
throreticalBlocks= getTheoreticalBlocks("rxd",start90d, end, blockData);
actualBlocks = poolMapper.selectPoolBlock(90);
dto.setLuck90d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,8, RoundingMode.HALF_UP).doubleValue());
dto.setLuck90d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue());
redisService.deleteObject("RXDLuck");
redisService.setCacheObject("RXDLuck",dto);