diff --git a/beacon-interface/src/main/java/com/example/beacon/vdf/application/VdfController.java b/beacon-interface/src/main/java/com/example/beacon/vdf/application/VdfController.java index 5ec0c57..222ff60 100644 --- a/beacon-interface/src/main/java/com/example/beacon/vdf/application/VdfController.java +++ b/beacon-interface/src/main/java/com/example/beacon/vdf/application/VdfController.java @@ -38,7 +38,7 @@ public ModelAndView home() { mv.addObject("uri", appUri.getUri()); - Long maxId = combinationRepository.findMaxId(); + Long maxId = combinationRepository.findMaxPulseIndex(); CombinationEntity previous = null; if (maxId!=null) { CombinationEntity byPulseIndex = combinationRepository.findByPulseIndex(maxId); diff --git a/beacon-interface/src/main/java/com/example/beacon/vdf/application/combination/CombinationResource.java b/beacon-interface/src/main/java/com/example/beacon/vdf/application/combination/CombinationResource.java index bc3351d..decbf5c 100644 --- a/beacon-interface/src/main/java/com/example/beacon/vdf/application/combination/CombinationResource.java +++ b/beacon-interface/src/main/java/com/example/beacon/vdf/application/combination/CombinationResource.java @@ -120,7 +120,7 @@ public ResponseEntity previous(@PathVariable String timeStamp){ public ResponseEntity last(){ try { - Long maxId = combinationRepository.findMaxId(); + Long maxId = combinationRepository.findMaxPulseIndex(); CombinationEntity byPulseIndex = combinationRepository.findByPulseIndex(maxId); diff --git a/beacon-interface/src/main/java/com/example/beacon/vdf/application/combination/CombinationServiceCalcAndPersist.java b/beacon-interface/src/main/java/com/example/beacon/vdf/application/combination/CombinationServiceCalcAndPersist.java index 9732eb7..f1c902e 100644 --- a/beacon-interface/src/main/java/com/example/beacon/vdf/application/combination/CombinationServiceCalcAndPersist.java +++ b/beacon-interface/src/main/java/com/example/beacon/vdf/application/combination/CombinationServiceCalcAndPersist.java @@ -14,6 +14,7 @@ import com.example.beacon.vdf.scheduling.CombinationResultDto; import com.example.beacon.vdf.sources.SeedBuilder; import com.example.beacon.vdf.sources.SeedCombinationResult; +import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -27,27 +28,21 @@ import java.security.PrivateKey; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; import java.util.List; +import java.util.Optional; @Service +@Slf4j public class CombinationServiceCalcAndPersist { - private final CombinationRepository combinationRepository; - private final String certificateId = "04c5dc3b40d25294c55f9bc2496fd4fe9340c1308cd073900014e6c214933c7f7737227fc5e4527298b9e95a67ad92e0310b37a77557a10518ced0ce1743e132"; - private final ICipherSuite cipherSuite; - private final SeedBuilder seedBuilder; - private final VdfUnicornService vdfUnicornService; - private final Environment env; - private final SeedCombinationResult seedCombinationResult; - private static final Logger logger = LoggerFactory.getLogger(CombinationServiceCalcAndPersist.class); - @Autowired public CombinationServiceCalcAndPersist(CombinationRepository combinationRepository, SeedBuilder seedBuilder, VdfUnicornService vdfUnicornService, @@ -60,21 +55,21 @@ public CombinationServiceCalcAndPersist(CombinationRepository combinationReposit this.seedCombinationResult = seedCombinationResult; } - @Async("threadPoolTaskExecutor") public void run(String timeStamp, List seedUnicordCombinationVos, BigInteger x) throws Exception { int iterations = Integer.parseInt(env.getProperty("beacon.combination.iterations")); - logger.warn("Start combination sloth"); + log.warn("Start combination sloth"); BigInteger y = VdfSloth.mod_op(x, iterations); - logger.warn("End combination sloth"); + log.warn("End combination sloth"); persist(timeStamp, seedUnicordCombinationVos, iterations, x, y); } @Transactional protected void persist(String timeStamp, List seedUnicordCombinationVos, int iterations, BigInteger x, BigInteger y) throws Exception { - Long maxPulseIndex = combinationRepository.findMaxId(); + Long maxPulseIndex = combinationRepository.findMaxPulseIndex(); + PrivateKey privateKey = CriptoUtilService.loadPrivateKeyPkcs1(env.getProperty("beacon.x509.privatekey")); if (maxPulseIndex==null){ maxPulseIndex = 1L; @@ -105,11 +100,12 @@ protected void persist(String timeStamp, List seedUnic combinationEntity.setY(y.toString()); combinationEntity.setIterations(iterations); + combinationEntity.setStatusCode(getStatusCode(combinationEntity)); + //sign ByteSerializationFields serialization = new ByteSerializationFields(combinationEntity); ByteArrayOutputStream baos = serialization.getBaos(); - PrivateKey privateKey = CriptoUtilService.loadPrivateKeyPkcs1(env.getProperty("beacon.x509.privatekey")); String signature = cipherSuite.signPkcs15(privateKey, serialization.getBaos().toByteArray()); combinationEntity.setSignatureValue(signature); @@ -123,7 +119,7 @@ protected void persist(String timeStamp, List seedUnic CombinationResultDto combinationResultDto = new CombinationResultDto(combinationEntity.getTimeStamp().toString(), combinationEntity.getOutputValue(), combinationEntity.getUri()); sendToUnicorn(combinationResultDto); - logger.warn("Stop run:"); + log.warn("Stop run:"); } protected void sendToUnicorn(CombinationResultDto combinationResultDto) throws Exception { @@ -131,9 +127,31 @@ protected void sendToUnicorn(CombinationResultDto combinationResultDto) throws E return; } - logger.warn(combinationResultDto.toString()); + log.warn(combinationResultDto.toString()); seedCombinationResult.setCombinationResultDto(combinationResultDto); vdfUnicornService.endTimeSlot(); } + private int getStatusCode(CombinationEntity currentEntity){ + int statusCode; + + Long maxId = combinationRepository.findMaxId(); + Optional previewsPulse = combinationRepository.findById(maxId); + + if (previewsPulse.isPresent()){ + ZonedDateTime previewPulseTimeStamp = previewsPulse.get().getTimeStamp(); + ZonedDateTime currentPulseTimesptamp = currentEntity.getTimeStamp(); + + long betweenInMinutes = ChronoUnit.MINUTES.between(previewPulseTimeStamp, currentPulseTimesptamp); + if (betweenInMinutes != 10L){ + statusCode = 2; + } else { + statusCode = 0; + } + } else { + statusCode = 1; + } + return statusCode; + } + } diff --git a/beacon-interface/src/main/java/com/example/beacon/vdf/infra/entity/CombinationEntity.java b/beacon-interface/src/main/java/com/example/beacon/vdf/infra/entity/CombinationEntity.java index a9b3aa9..fb843a7 100644 --- a/beacon-interface/src/main/java/com/example/beacon/vdf/infra/entity/CombinationEntity.java +++ b/beacon-interface/src/main/java/com/example/beacon/vdf/infra/entity/CombinationEntity.java @@ -53,6 +53,8 @@ public class CombinationEntity { private int iterations; + private int statusCode; + private String outputValue; private ZonedDateTime createdAt; diff --git a/beacon-interface/src/main/java/com/example/beacon/vdf/repository/CombinationRepository.java b/beacon-interface/src/main/java/com/example/beacon/vdf/repository/CombinationRepository.java index c3967b3..ea9b3f1 100644 --- a/beacon-interface/src/main/java/com/example/beacon/vdf/repository/CombinationRepository.java +++ b/beacon-interface/src/main/java/com/example/beacon/vdf/repository/CombinationRepository.java @@ -20,7 +20,11 @@ public interface CombinationRepository extends JpaRepository findSequence(ZonedDateTime timeStamp1, ZonedDateTime timeStamp2); + @Deprecated // may have performance issues - use findMaxId @Query(value = "select distinct max(p.pulseIndex) from CombinationEntity p") + Long findMaxPulseIndex(); + + @Query(value = "select distinct max(p.id) from CombinationEntity p") Long findMaxId(); @Query(value = "select p from CombinationEntity p left join fetch p.seedList where p.pulseIndex = ?1")