Skip to content

Commit

Permalink
Feat/get local params from n2c (#236)
Browse files Browse the repository at this point in the history
* chore: upgraded to node 9.0

* chore:updated yaci store

* feat: implemented get local params from n2c connection

* feat: added backup solution to get params Epoch Table if local params not availalbe + adjusted tests

* feat: spotless

* feat: updated db

* feat: added n2c socat host and port to yaci indexer
  • Loading branch information
Kammerlo authored Jul 30, 2024
1 parent 188c152 commit f2a98c0
Show file tree
Hide file tree
Showing 32 changed files with 439 additions and 120 deletions.
5 changes: 3 additions & 2 deletions .env.IntegrationTest
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ CARDANO_NODE_PORT=3001
CARDANO_NODE_SUBMIT_HOST=yaci-cli
NODE_SUBMIT_API_PORT=8090
CARDANO_NODE_VERSION=0.0.0
CARDANO_NODE_DIR=/node
CARDANO_NODE_DIR=/Users/thkammer/Documents/dev/cardano/cardano-rosetta-java/node
CARDANO_NODE_SOCKET_PATH=${CARDANO_NODE_DIR}/node.socket
CARDANO_NODE_DB=${CARDANO_NODE_DIR}/db
CARDANO_CONFIG=./config/${NETWORK}
Expand Down Expand Up @@ -59,14 +59,15 @@ GENESIS_CONWAY_PATH=/config/conway-genesis.json
INDEXER_DOCKER_IMAGE_TAG=main
PRUNING_ENABLED=false

YACI_SPRING_PROFILES=postgres
YACI_SPRING_PROFILES=postgres,n2c-socat
# database profiles: h2, h2-testData, postgres
MEMPOOL_ENABLED=false

## Ports
HOST_N2N_PORT=${CARDANO_NODE_PORT}
HOST_SUBMIT_API_PORT=${NODE_SUBMIT_API_PORT}
HOST_N2C_SOCAT_PORT=3333
HOST_N2C_SOCAT_HOST=${CARDANO_NODE_HOST}
HOST_STORE_API_PORT=8080
HOST_CLUSTER_API_PORT=10000
HOST_OGMIOS_PORT=1337
Expand Down
2 changes: 1 addition & 1 deletion .env.docker-compose
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ GENESIS_CONWAY_PATH=/config/conway-genesis.json
INDEXER_DOCKER_IMAGE_TAG=main
PRUNING_ENABLED=false

YACI_SPRING_PROFILES=postgres
YACI_SPRING_PROFILES=postgres,n2c-socket
# database profiles: h2, h2-testData, postgres
MEMPOOL_ENABLED=false

Expand Down
2 changes: 1 addition & 1 deletion .env.h2
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ GENESIS_CONWAY_PATH=./config/${NETWORK}/conway-genesis.json
INDEXER_DOCKER_IMAGE_TAG=main
PRUNING_ENABLED=false

YACI_SPRING_PROFILES=h2
YACI_SPRING_PROFILES=h2,n2c-socket
# database profiles: h2, h2-testData, postgres
MEMPOOL_ENABLED=false

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ The default config is focused on mainnet. If you want to test this on other Card
git clone https://github.com/cardano-foundation/cardano-rosetta-java
cd cardano-rosetta-java
docker build -t rosetta-java -f ./docker/Dockerfile .
docker run --name rosetta --env-file ./docker/.env.dockerfile -p 8082:8082 -d rosetta-java:latest
docker run --name rosetta -v {CUSTOM_MOUNT_PATH}:/node --env-file ./docker/.env.dockerfile -p 8082:8082 -d rosetta-java:latest
```
Detailed explanation can be found in the [Wiki](https://github.com/cardano-foundation/cardano-rosetta-java/wiki/3.-Getting-Started-with-Docker).

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,16 @@

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public class ProtocolParams {

private Integer minFeeA; //0
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package org.cardanofoundation.rosetta.api.block.model.entity;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import io.hypersistence.utils.hibernate.type.json.JsonType;
import org.hibernate.annotations.Type;

import org.cardanofoundation.rosetta.api.block.model.domain.ProtocolParams;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity
@Table(name = "local_epoch_param")
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public class LocalProtocolParamsEntity {
@Id
private Long epoch;

@Type(JsonType.class)
@Column(name = "params")
private ProtocolParams protocolParams;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package org.cardanofoundation.rosetta.api.block.model.repository;

import java.util.Optional;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

import org.cardanofoundation.rosetta.api.block.model.entity.LocalProtocolParamsEntity;

public interface LocalProtocolParamsRepository extends JpaRepository<LocalProtocolParamsEntity, Long> {

@Query(value = """
SELECT p FROM LocalProtocolParamsEntity p ORDER BY p.epoch DESC LIMIT 1
"""
)
Optional<LocalProtocolParamsEntity> getLocalProtocolParams();
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package org.cardanofoundation.rosetta.common.services;

import java.util.Optional;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

Expand All @@ -11,28 +13,35 @@
import org.springframework.transaction.annotation.Transactional;

import org.cardanofoundation.rosetta.api.block.model.domain.ProtocolParams;
import org.cardanofoundation.rosetta.api.block.model.entity.LocalProtocolParamsEntity;
import org.cardanofoundation.rosetta.api.block.model.entity.ProtocolParamsEntity;
import org.cardanofoundation.rosetta.api.block.model.repository.EpochParamRepository;
import org.cardanofoundation.rosetta.api.block.model.repository.LocalProtocolParamsRepository;
import org.cardanofoundation.rosetta.common.mapper.ProtocolParamsMapper;

@Service
@Slf4j
@RequiredArgsConstructor
public class ProtocolParamServiceImpl implements ProtocolParamService {

private final EpochParamRepository epochParamRepository;
private final LocalProtocolParamsRepository localProtocolParamsRepository;
private final ProtocolParamsMapper mapperProtocolParams;
private final EpochParamRepository epochParamRepository;

@Override
@Cacheable(value = "protocolParamsCache")
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
public ProtocolParams findProtocolParametersFromIndexer() {
log.info("Fetching protocol parameters from the indexer");
ProtocolParamsEntity paramsEntity = epochParamRepository.findLatestProtocolParams();
ProtocolParams protocolParams = mapperProtocolParams.mapProtocolParamsToEntity(paramsEntity);
Optional<LocalProtocolParamsEntity> protocolParams = localProtocolParamsRepository.getLocalProtocolParams();
log.debug("Protocol parameters fetched from the indexer: {} \nand saved in cachedProtocolParams",
paramsEntity);
return protocolParams;
protocolParams);
if(protocolParams.isEmpty()) {
ProtocolParamsEntity paramsEntity = epochParamRepository.findLatestProtocolParams();
return mapperProtocolParams.mapProtocolParamsToEntity(paramsEntity);
} else {
return protocolParams.get().getProtocolParams();
}
}

@Scheduled(fixedRate = 3600000) // 1 hour
Expand Down
2 changes: 1 addition & 1 deletion api/src/main/resources/config/application.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ server:

spring:
profiles:
active: ${API_SPRING_PROFILES_ACTIVE:staging, standalone}
active: ${API_SPRING_PROFILES_ACTIVE:dev}
jackson:
default-property-inclusion: NON_NULL
serialization:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.cardanofoundation.rosetta.api.data.account;
package org.cardanofoundation.rosetta.api.account.controller;

import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
Expand Down Expand Up @@ -35,7 +35,6 @@ class AccountBalanceApiTest extends BaseSpringMvcSetup {

private final String currentAdaBalance = "3636394";
private final String previousAdaBalance = "1636394";
private final String currentLovelaceBalance = "1939500";

@Test
void accountBalance2Ada_Test() {
Expand Down Expand Up @@ -71,7 +70,7 @@ void accountBalanceMintedTokenAndEmptyName_Test() {
accountBalanceResponse.getBalances().get(1).getValue());
assertNotEquals(accountBalanceResponse.getBalances().getFirst().getCurrency().getSymbol(),
accountBalanceResponse.getBalances().get(1).getCurrency().getSymbol());
assertEquals("", accountBalanceResponse.getBalances().get(2).getCurrency().getSymbol());
assertEquals("", accountBalanceResponse.getBalances().get(1).getCurrency().getSymbol());
}

@Test
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.cardanofoundation.rosetta.api.data.account;
package org.cardanofoundation.rosetta.api.account.controller;

import java.util.Arrays;
import java.util.List;
Expand Down Expand Up @@ -36,7 +36,7 @@

class AccountCoinsApiTest extends BaseSpringMvcSetup {

private final String myAssetPolicyId = "7fb3df13910c057bd9254e847c076fb02de78503b9fa0ecdd70b566c";
private final String myAssetPolicyId = "d97e36383ae494e72b736ace04080f2953934626376ee06cf84adeb4";
private final String latestTxHashOnZeroSlot = generatedDataMap.get(
TestTransactionNames.SIMPLE_NEW_EMPTY_NAME_COINS_TRANSACTION.getName()).txHash() + ":0";
private final String expectedTestAccountCoinAmount = "1636394";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ void combineWithMetadataTest() throws IOException {
assertEquals(ADA, constructionMetadataResponse.getSuggestedFee().getFirst().getCurrency().getSymbol());
assertEquals(ADA_DECIMALS, constructionMetadataResponse.getSuggestedFee().getFirst().getCurrency().getDecimals());

assertEquals(BigDecimal.valueOf(68), constructionMetadataResponse.getMetadata().getTtl());
assertEquals(BigDecimal.valueOf(79), constructionMetadataResponse.getMetadata().getTtl());
assertEquals("4310", constructionMetadataResponse.getMetadata().getProtocolParameters().getCoinsPerUtxoSize());
assertEquals("2000000", constructionMetadataResponse.getMetadata().getProtocolParameters().getKeyDeposit());
assertEquals("500000000", constructionMetadataResponse.getMetadata().getProtocolParameters().getPoolDeposit());
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package org.cardanofoundation.rosetta.common.cache;

import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
Expand All @@ -12,8 +14,10 @@
import org.junit.jupiter.api.Test;

import org.cardanofoundation.rosetta.api.block.model.domain.ProtocolParams;
import org.cardanofoundation.rosetta.api.block.model.entity.LocalProtocolParamsEntity;
import org.cardanofoundation.rosetta.api.block.model.entity.ProtocolParamsEntity;
import org.cardanofoundation.rosetta.api.block.model.repository.EpochParamRepository;
import org.cardanofoundation.rosetta.api.block.model.repository.LocalProtocolParamsRepository;
import org.cardanofoundation.rosetta.common.mapper.ProtocolParamsMapper;
import org.cardanofoundation.rosetta.common.services.ProtocolParamServiceImpl;

Expand All @@ -32,6 +36,8 @@ class ProtocolParamsCacheTest {

@MockBean
private EpochParamRepository epochParamRepository;
@MockBean
private LocalProtocolParamsRepository localProtocolParamsRepository;

@MockBean
private ProtocolParamsMapper protocolParamsToEntity;
Expand All @@ -56,16 +62,14 @@ void protocolParamsCacheTest() {
paramsEntity.setMinFeeA(1);
ProtocolParams protocolParams = new ProtocolParams();
protocolParams.setMinFeeA(1);

when(epochParamRepository.findLatestProtocolParams()).thenReturn(paramsEntity);
when(protocolParamsToEntity.mapProtocolParamsToEntity(paramsEntity)).thenReturn(protocolParams);
LocalProtocolParamsEntity localProtocolParamsEntity = LocalProtocolParamsEntity.builder().protocolParams(protocolParams).build();
when(localProtocolParamsRepository.getLocalProtocolParams()).thenReturn(Optional.of(localProtocolParamsEntity));

ProtocolParams result1 = genesisService.findProtocolParametersFromIndexer();
ProtocolParams result2 = genesisService.findProtocolParametersFromIndexer();

// Assert that the repository & mapper method is only called once
verify(epochParamRepository, times(1)).findLatestProtocolParams();
verify(protocolParamsToEntity, times(1)).mapProtocolParamsToEntity(paramsEntity);
verify(localProtocolParamsRepository, times(1)).getLocalProtocolParams();
assertEquals(result1, result2);

Cache cache = cacheManager.getCache(PROTOCOL_PARAMS_CACHE);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package org.cardanofoundation.rosetta.common.services;

import java.util.Optional;

import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
Expand All @@ -8,9 +10,8 @@
import org.junit.jupiter.api.extension.ExtendWith;

import org.cardanofoundation.rosetta.api.block.model.domain.ProtocolParams;
import org.cardanofoundation.rosetta.api.block.model.entity.ProtocolParamsEntity;
import org.cardanofoundation.rosetta.api.block.model.repository.EpochParamRepository;
import org.cardanofoundation.rosetta.common.mapper.ProtocolParamsMapper;
import org.cardanofoundation.rosetta.api.block.model.entity.LocalProtocolParamsEntity;
import org.cardanofoundation.rosetta.api.block.model.repository.LocalProtocolParamsRepository;

import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.mockito.Mockito.when;
Expand All @@ -19,24 +20,19 @@
class ProtocolParamServiceImplTest {

@Mock
EpochParamRepository epochParamRepository;
@Mock
ProtocolParamsMapper protocolParamsMapper;
LocalProtocolParamsRepository protocolParamsRepository;
@InjectMocks
ProtocolParamServiceImpl genesisService;

@Test
void getProtocolParameters() {
when(genesisService.findProtocolParametersFromIndexer()).thenReturn(new ProtocolParams());
assertNotNull(genesisService.findProtocolParametersFromIndexer());
}

@Test
void findProtocolParametersFromIndexerTest() {
//given
ProtocolParamsEntity protocolParams = new ProtocolParamsEntity();
when(epochParamRepository.findLatestProtocolParams()).thenReturn(protocolParams);
when(protocolParamsMapper.mapProtocolParamsToEntity(protocolParams)).thenReturn(new ProtocolParams());
when(protocolParamsRepository.getLocalProtocolParams()).thenReturn(Optional.of(
LocalProtocolParamsEntity.builder()
.epoch(5L)
.protocolParams(
ProtocolParams.builder().build())
.build()));
//when
ProtocolParams protocolParameters = genesisService.findProtocolParametersFromIndexer();
//then
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ spring:
max-request-size: 16MB
datasource:
driver-class-name: org.h2.Driver
username: ${DB_USER:rosetta_db_admin}
password: ${DB_SECRET:weakpwd#123_d}
username: rosetta_db_admin
password: weakpwd#123_d
url: jdbc:h2:file:../testData/devkit.db
# url: jdbc:h2:mem:${DB_NAME:rosetta-java};INIT=RUNSCRIPT FROM 'classpath:init.sql;DB_CLOSE_DELAY=-1;MODE=PostgreSQL;DATABASE_TO_LOWER=TRUE;DEFAULT_NULL_ORDERING=HIGH
sql:
Expand Down
6 changes: 2 additions & 4 deletions config/mainnet/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,20 @@
"AlonzoGenesisHash": "7e94a15f55d1e82d10f09203fa1d40f8eede58fd8066542cf6566008068ed874",
"ByronGenesisFile": "byron-genesis.json",
"ByronGenesisHash": "5f20df933584822601f9e3f8c024eb5eb252fe8cefb24d1317dc3d432e940ebb",
"ConwayGenesisFile": "conway-genesis.json",
"ConwayGenesisHash": "de609b281cb3d8ae91a9d63a00c87092975612d603aa54c0f1c6a781e33d6e1e",
"EnableP2P": true,
"LastKnownBlockVersion-Alt": 0,
"LastKnownBlockVersion-Major": 3,
"LastKnownBlockVersion-Minor": 0,
"MaxKnownMajorProtocolVersion": 2,
"MinNodeVersion": "8.9.2",
"MinNodeVersion": "8.12.0",
"PeerSharing": true,
"Protocol": "Cardano",
"RequiresNetworkMagic": "RequiresNoMagic",
"ShelleyGenesisFile": "shelley-genesis.json",
"ShelleyGenesisHash": "1a3be38bcbb7911969283716ad7aa550250226b76a61fc51cc9a9a35d9276d81",
"TargetNumberOfActivePeers": 20,
"TargetNumberOfEstablishedPeers": 50,
"TargetNumberOfKnownPeers": 100,
"TargetNumberOfKnownPeers": 150,
"TargetNumberOfRootPeers": 60,
"TraceAcceptPolicy": true,
"TraceBlockFetchClient": false,
Expand Down
2 changes: 1 addition & 1 deletion config/mainnet/topology.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,4 @@
}
],
"useLedgerAfterSlot": 116812831
}
}
Loading

0 comments on commit f2a98c0

Please sign in to comment.