diff --git a/config/application.properties b/config/application.properties index 397870eb0..4d3b26f31 100644 --- a/config/application.properties +++ b/config/application.properties @@ -78,9 +78,11 @@ spring.h2.console.enabled=true #spring.datasource.username=user #spring.datasource.password=password -#################### Connection Pool Setting ########## +#################### Other DB Settings ########## #spring.datasource.hikari.maximum-pool-size=30 #spring.datasource.hikari.minimum-idle=5 +#spring.jpa.properties.hibernate.jdbc.batch_size=100 +#spring.jpa.show-sql=true ######################################################### # Log Configuration @@ -139,6 +141,11 @@ store.account.history-cleanup-enabled=false store.account.batch-balance-aggregation-enabled=true store.account.batch-balance-aggregation-scheduler-enabled=true +############### Additional configurations for balance batch aggregation ########## +#store.account.batch-balance-aggregation-schedule-delay=5 +#store.account.batch-balance-aggregation-batch-size=4320 +#store.account.batch-balance-aggregation-safe-block-diff=500 + ################################################### # Parallel processing configuration ################################################### diff --git a/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/domain/Redeemer.java b/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/domain/Redeemer.java index 112864c02..c6ef081e1 100644 --- a/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/domain/Redeemer.java +++ b/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/domain/Redeemer.java @@ -10,8 +10,6 @@ import lombok.Getter; import lombok.NoArgsConstructor; -import java.math.BigInteger; - @Getter @AllArgsConstructor @NoArgsConstructor @@ -20,7 +18,7 @@ @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) public class Redeemer { private RedeemerTag tag; - private BigInteger index; + private Integer index; private String data; private ExUnits exUnits; } diff --git a/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/domain/TxScript.java b/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/domain/TxScript.java index 753c90a22..9b03324bb 100644 --- a/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/domain/TxScript.java +++ b/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/domain/TxScript.java @@ -1,11 +1,14 @@ package com.bloxbean.cardano.yaci.store.script.domain; +import com.bloxbean.cardano.client.plutus.spec.RedeemerTag; import com.bloxbean.cardano.yaci.store.common.domain.BlockAwareDomain; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; +import java.math.BigInteger; + @Data @NoArgsConstructor @AllArgsConstructor @@ -16,7 +19,13 @@ public class TxScript extends BlockAwareDomain { private Long slot; private String blockHash; private ScriptType type; - private String redeemer; + private String redeemerCbor; private String datum; private String datumHash; + private BigInteger unitMem; + private BigInteger unitSteps; + private RedeemerTag purpose; + private Integer redeemerIndex; + private String redeemerData; + private String redeemerDatahash; } diff --git a/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/dto/TxRedeemerDto.java b/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/dto/TxRedeemerDto.java index 17e5b9bbd..4b90e89d2 100644 --- a/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/dto/TxRedeemerDto.java +++ b/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/dto/TxRedeemerDto.java @@ -18,6 +18,7 @@ public class TxRedeemerDto { private Integer txIndex; private String purpose; private String scriptHash; + private String datumHash; private String redeemerDataHash; private String unitMem; private String unitSteps; diff --git a/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/helper/RedeemerDatumMatcher.java b/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/helper/RedeemerDatumMatcher.java index c29a87aa2..7ff3f9a5a 100644 --- a/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/helper/RedeemerDatumMatcher.java +++ b/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/helper/RedeemerDatumMatcher.java @@ -1,23 +1,24 @@ package com.bloxbean.cardano.yaci.store.script.helper; import com.bloxbean.cardano.client.address.Address; -import com.bloxbean.cardano.client.plutus.spec.Redeemer; import com.bloxbean.cardano.client.plutus.spec.RedeemerTag; import com.bloxbean.cardano.client.util.HexUtil; -import com.bloxbean.cardano.yaci.store.common.domain.UtxoKey; -import com.bloxbean.cardano.yaci.store.common.util.Util; -import com.bloxbean.cardano.client.util.Tuple; import com.bloxbean.cardano.yaci.core.model.PlutusScript; +import com.bloxbean.cardano.yaci.core.model.Redeemer; import com.bloxbean.cardano.yaci.core.model.TransactionInput; import com.bloxbean.cardano.yaci.core.model.certs.*; import com.bloxbean.cardano.yaci.helper.model.Transaction; import com.bloxbean.cardano.yaci.store.client.utxo.UtxoClient; +import com.bloxbean.cardano.yaci.store.common.domain.UtxoKey; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import java.math.BigInteger; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; import java.util.stream.Collectors; /** @@ -47,48 +48,33 @@ public List findScriptsForRedeemers(Transaction transaction, Map< List inputs = new ArrayList<>(transaction.getBody().getInputs()); List redeemers = transaction.getWitnesses().getRedeemers(); List scriptContexts = redeemers.stream() - .map(redeemer -> Util.deserialize(redeemer.getCbor()) - .map(deRedeemer -> new Tuple<>(redeemer, deRedeemer))) - .filter(Optional::isPresent) - .map(redeemerTuple -> { - com.bloxbean.cardano.yaci.core.model.Redeemer orgRedeemer = redeemerTuple.get()._1; - com.bloxbean.cardano.client.plutus.spec.Redeemer deRedeemer = redeemerTuple.get()._2; - + .map(redeemer -> { ScriptContext scriptContext; - if (deRedeemer.getTag() == RedeemerTag.Spend) { - scriptContext = findSpendScriptFromRedeemer(deRedeemer, inputs, scriptsMap) + if (redeemer.getTag() == RedeemerTag.Spend) { + scriptContext = findSpendScriptFromRedeemer(redeemer, inputs, scriptsMap) .orElse(new ScriptContext()); - scriptContext.setRedeemer(orgRedeemer.getCbor()); //set redeemer here to save serialization cost - } else if (deRedeemer.getTag() == RedeemerTag.Mint) { + scriptContext.setRedeemer(redeemer); //set redeemer here to save serialization cost + } else if (redeemer.getTag() == RedeemerTag.Mint) { if (log.isDebugEnabled()) log.debug("Mint tag : " + transaction.getTxHash()); //check mint policy - scriptContext = findMintScriptForRedeemer(deRedeemer, distinctPolicies, scriptsMap) + scriptContext = findMintScriptForRedeemer(redeemer, distinctPolicies, scriptsMap) .orElse(new ScriptContext()); - scriptContext.setRedeemer(orgRedeemer.getCbor()); - } else if (deRedeemer.getTag() == RedeemerTag.Cert) { + scriptContext.setRedeemer(redeemer); + } else if (redeemer.getTag() == RedeemerTag.Cert) { if (log.isDebugEnabled()) log.debug("Redeemer Cert : " + transaction.getTxHash()); - scriptContext = findCertScriptForRedeemer(deRedeemer, transaction.getBody().getCertificates(), scriptsMap) + scriptContext = findCertScriptForRedeemer(redeemer, transaction.getBody().getCertificates(), scriptsMap) .orElse(new ScriptContext()); - scriptContext.setRedeemer(orgRedeemer.getCbor()); - } else if (deRedeemer.getTag() == RedeemerTag.Reward) { + scriptContext.setRedeemer(redeemer); + } else if (redeemer.getTag() == RedeemerTag.Reward) { if (log.isDebugEnabled()) log.info("Redeemer Reward : " + transaction.getTxHash()); - scriptContext = findRewardScriptForRedeemer(deRedeemer, transaction, scriptsMap).orElse(new ScriptContext()); - scriptContext.setRedeemer(orgRedeemer.getCbor()); + scriptContext = findRewardScriptForRedeemer(redeemer, transaction, scriptsMap).orElse(new ScriptContext()); + scriptContext.setRedeemer(redeemer); } else { scriptContext = new ScriptContext(); - scriptContext.setRedeemer(orgRedeemer.getCbor()); - } - - //Set redeemer data and redeemer data hash - if (deRedeemer.getData() != null) { - String redeemerData = deRedeemer.getData().serializeToHex(); - String redeemerDataHash = deRedeemer.getData().getDatumHash(); - - scriptContext.setRedeemerData(redeemerData); - scriptContext.setRedeemerDataHash(redeemerDataHash); + scriptContext.setRedeemer(redeemer); } return scriptContext; @@ -98,7 +84,7 @@ public List findScriptsForRedeemers(Transaction transaction, Map< } public Optional findSpendScriptFromRedeemer(Redeemer redeemer, - List inputs, Map scriptsMap) { + List inputs, Map scriptsMap) { //Sort inputs and find the right input for redeemer TransactionInput input = getScriptInputFromRedeemer(redeemer, inputs); @@ -136,7 +122,7 @@ public Optional findRewardScriptForRedeemer(Redeemer redeemer, Tr .map(entry -> entry.getKey()) .collect(Collectors.toList()); - int index = redeemer.getIndex().intValue(); + int index = redeemer.getIndex(); String rewardAddress = rewardAddresses.get(index); Address address = new Address(HexUtil.decodeHexString(rewardAddress)); @@ -156,7 +142,7 @@ public Optional findCertScriptForRedeemer(Redeemer redeemer, List if (certificates == null ||certificates.size() == 0) return Optional.empty(); - int index = redeemer.getIndex().intValue(); + int index = redeemer.getIndex(); if (index >= certificates.size()) return Optional.empty(); @@ -187,7 +173,7 @@ public Optional findMintScriptForRedeemer(Redeemer redeemer, List if (policies == null) return Optional.empty(); - int index = redeemer.getIndex().intValue(); + int index = redeemer.getIndex(); if (index >= policies.size()) { return Optional.empty(); } @@ -209,7 +195,7 @@ public static TransactionInput getScriptInputFromRedeemer(Redeemer redeemer, Lis .collect(Collectors.toList()); copyInputs.sort((o1, o2) -> (o1.getTransactionId() + "#" + o1.getIndex()).compareTo(o2.getTransactionId() + "#" + o2.getIndex())); - int index = redeemer.getIndex().intValue(); + int index = redeemer.getIndex(); return copyInputs.get(index); } } diff --git a/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/helper/ScriptContext.java b/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/helper/ScriptContext.java index fa102bd15..b8a15dd0c 100644 --- a/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/helper/ScriptContext.java +++ b/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/helper/ScriptContext.java @@ -1,6 +1,7 @@ package com.bloxbean.cardano.yaci.store.script.helper; import com.bloxbean.cardano.yaci.core.model.PlutusScript; +import com.bloxbean.cardano.yaci.core.model.Redeemer; import com.bloxbean.cardano.yaci.store.script.domain.ScriptType; import lombok.AllArgsConstructor; import lombok.Data; @@ -11,11 +12,9 @@ @NoArgsConstructor public class ScriptContext { private PlutusScript plutusScript; - private String redeemer; + private Redeemer redeemer; private String datum; private String datumHash; - private String redeemerData; - private String redeemerDataHash; public String getScriptHash() { if (plutusScript == null) diff --git a/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/processor/ScriptRedeemerDatumProcessor.java b/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/processor/ScriptRedeemerDatumProcessor.java index 3d652e102..895286528 100644 --- a/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/processor/ScriptRedeemerDatumProcessor.java +++ b/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/processor/ScriptRedeemerDatumProcessor.java @@ -1,6 +1,7 @@ package com.bloxbean.cardano.yaci.store.script.processor; import com.bloxbean.cardano.yaci.core.model.PlutusScript; +import com.bloxbean.cardano.yaci.core.model.Redeemer; import com.bloxbean.cardano.yaci.helper.model.Transaction; import com.bloxbean.cardano.yaci.store.common.util.JsonUtil; import com.bloxbean.cardano.yaci.store.common.util.StringUtil; @@ -135,6 +136,12 @@ private void handleScriptTransaction(EventMetadata metadata, Transaction transac if (StringUtil.isEmpty(scriptContext.getDatumHash()) && !StringUtil.isEmpty(scriptContext.getDatum())) scriptContext.setDatumHash(ScriptUtil.getDatumHash(scriptContext.getDatum())); + Redeemer redeemer; + if (scriptContext.getRedeemer() != null) + redeemer = scriptContext.getRedeemer(); + else + redeemer = new Redeemer(); + return TxScript.builder() .txHash(transaction.getTxHash()) .slot(metadata.getSlot()) @@ -143,17 +150,24 @@ private void handleScriptTransaction(EventMetadata metadata, Transaction transac .blockTime(metadata.getBlockTime()) .scriptHash(scriptContext.getScriptHash()) .type(scriptContext.getPlutusScriptType()) - .redeemer(scriptContext.getRedeemer()) .datum(scriptContext.getDatum()) .datumHash(scriptContext.getDatumHash()) + .redeemerCbor(redeemer.getCbor()) + .unitMem(redeemer.getExUnits() != null? redeemer.getExUnits().getMem(): null) + .unitSteps(redeemer.getExUnits() != null? redeemer.getExUnits().getSteps(): null) + .purpose(redeemer.getTag()) + .redeemerIndex(redeemer.getIndex()) + .redeemerData(redeemer.getData() != null? redeemer.getData().getCbor(): null) + .redeemerDatahash(redeemer.getData() != null? redeemer.getData().getHash(): null) .build(); }).collect(Collectors.toList()); //Save redeemer data by data hash in Datum storage if (scriptContexts != null && scriptContexts.size() > 0) { List redeemerDataList = scriptContexts.stream() - .filter(scriptContext -> !StringUtil.isEmpty(scriptContext.getRedeemerDataHash())) - .map(scriptContext -> new Datum(scriptContext.getRedeemerDataHash(), scriptContext.getRedeemerData(), transaction.getTxHash())) + .map(scriptContext -> scriptContext.getRedeemer()) + .filter(redeemer -> redeemer != null) + .map(redeemer -> new Datum(redeemer.getData().getHash(), redeemer.getData().getCbor(), transaction.getTxHash())) .toList(); if (redeemerDataList.size() > 0) { diff --git a/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/service/ScriptService.java b/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/service/ScriptService.java index 5e59f9ac7..eda35b129 100644 --- a/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/service/ScriptService.java +++ b/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/service/ScriptService.java @@ -1,11 +1,11 @@ package com.bloxbean.cardano.yaci.store.script.service; +import com.bloxbean.cardano.client.plutus.spec.ExUnits; import com.bloxbean.cardano.client.plutus.spec.PlutusData; import com.bloxbean.cardano.client.plutus.spec.serializers.PlutusDataJsonConverter; import com.bloxbean.cardano.client.util.HexUtil; import com.bloxbean.cardano.yaci.store.script.domain.*; import com.bloxbean.cardano.yaci.store.script.dto.TxRedeemerDto; -import com.bloxbean.cardano.yaci.store.script.helper.ScriptUtil; import com.bloxbean.cardano.yaci.store.script.storage.DatumStorage; import com.bloxbean.cardano.yaci.store.script.storage.ScriptStorage; import com.bloxbean.cardano.yaci.store.script.storage.TxScriptStorage; @@ -46,14 +46,12 @@ public List getTransactionScripts(String txHash) { .orElse(null); } - Redeemer redeemerDto = ScriptUtil.deserializeRedeemer(txScript.getRedeemer()) - .map(redeemer -> Redeemer.builder() - .tag(redeemer.getTag()) - .index(redeemer.getIndex()) - .exUnits(redeemer.getExUnits()) - .data(redeemer.getData() != null ? redeemer.getData().serializeToHex() : null) - .build()) - .orElse(null); + Redeemer redeemerDto = Redeemer.builder() + .tag(txScript.getPurpose()) + .index(txScript.getRedeemerIndex()) + .exUnits(new ExUnits(txScript.getUnitMem(), txScript.getUnitSteps())) + .data(txScript.getRedeemerData()) + .build(); return TxContractDetails.builder() .txHash(txHash) @@ -91,21 +89,15 @@ public List getTransactionRedeemers(String txHash) { return Collections.EMPTY_LIST; return txScripts.stream() - .filter(txScript -> txScript.getRedeemer() != null && !txScript.getRedeemer().isEmpty()) - .map(txScript -> { - com.bloxbean.cardano.client.plutus.spec.Redeemer redeemer = ScriptUtil.deserializeRedeemer(txScript.getRedeemer()) - .orElseThrow(() -> new IllegalStateException("Unable to deserialize redeemer : " + txScript.getRedeemer())); - String dataHash = redeemer.getData().getDatumHash(); - - return TxRedeemerDto.builder() - .txIndex(redeemer.getIndex().intValue()) - .purpose(redeemer.getTag().toString().toLowerCase()) - .scriptHash(txScript.getScriptHash()) - .redeemerDataHash(dataHash) - .unitMem(String.valueOf(redeemer.getExUnits().getMem())) - .unitSteps(String.valueOf(redeemer.getExUnits().getSteps())) - //.fee(String.valueOf()) //TODO -- calcuate script cost from mem and steps - .build(); - }).collect(Collectors.toList()); + .map(txScript -> TxRedeemerDto.builder() + .txIndex(txScript.getRedeemerIndex()) + .purpose(txScript.getPurpose().toString().toLowerCase()) + .scriptHash(txScript.getScriptHash()) + .datumHash(txScript.getDatumHash()) + .redeemerDataHash(txScript.getRedeemerDatahash()) + .unitMem(String.valueOf(txScript.getUnitMem())) + .unitSteps(String.valueOf(txScript.getUnitSteps())) + //.fee(String.valueOf()) //TODO -- calcuate script cost from mem and steps + .build()).collect(Collectors.toList()); } } diff --git a/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/storage/TxScriptStorage.java b/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/storage/TxScriptStorage.java index eefd9c4d7..4099f31be 100644 --- a/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/storage/TxScriptStorage.java +++ b/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/storage/TxScriptStorage.java @@ -5,7 +5,7 @@ import java.util.List; public interface TxScriptStorage { - List saveAll(List txScripts); + void saveAll(List txScripts); int deleteBySlotGreaterThan(long slot); diff --git a/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/storage/impl/jpa/TxScriptStorageImpl.java b/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/storage/impl/jpa/TxScriptStorageImpl.java index 5441d2cda..414c7e292 100644 --- a/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/storage/impl/jpa/TxScriptStorageImpl.java +++ b/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/storage/impl/jpa/TxScriptStorageImpl.java @@ -16,11 +16,9 @@ public class TxScriptStorageImpl implements TxScriptStorage { private final ScriptMapper scriptMapper; @Override - public List saveAll(List txScripts) { + public void saveAll(List txScripts) { List txScriptEntities = txScripts.stream().map(scriptMapper::toTxScriptEntity).collect(Collectors.toList()); - List savedEntities = txScriptRepository.saveAll(txScriptEntities); - - return savedEntities.stream().map(scriptMapper::toTxScript).collect(Collectors.toList()); + txScriptRepository.saveAll(txScriptEntities); } @Override @@ -30,7 +28,25 @@ public int deleteBySlotGreaterThan(long slot) { @Override public List findByTxHash(String txHash) { - return txScriptRepository.findByTxHash(txHash) - .stream().map(scriptMapper::toTxScript).collect(Collectors.toList()); + List results = txScriptRepository.findByTxHash(txHash); + return results.stream() + .map(result -> { + TxScriptEntity txScriptEntity = (TxScriptEntity) result[0]; + var datum = (String)result[1]; + var redeemerData = (String)result[2]; + + var txScript = scriptMapper.toTxScript(txScriptEntity); + + if (datum != null) { + txScript.setDatum(datum); + } + + if (redeemerData != null) { + txScript.setRedeemerData(redeemerData); + } + + return txScript; + }).toList(); } + } diff --git a/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/storage/impl/jpa/model/TxScriptEntity.java b/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/storage/impl/jpa/model/TxScriptEntity.java index e5e21a406..99807969f 100644 --- a/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/storage/impl/jpa/model/TxScriptEntity.java +++ b/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/storage/impl/jpa/model/TxScriptEntity.java @@ -1,5 +1,6 @@ package com.bloxbean.cardano.yaci.store.script.storage.impl.jpa.model; +import com.bloxbean.cardano.client.plutus.spec.RedeemerTag; import com.bloxbean.cardano.yaci.store.common.model.BlockAwareEntity; import com.bloxbean.cardano.yaci.store.script.domain.ScriptType; import jakarta.persistence.*; @@ -8,6 +9,7 @@ import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; +import java.math.BigInteger; import java.util.UUID; @Data @@ -37,13 +39,26 @@ public class TxScriptEntity extends BlockAwareEntity { @Column(name = "script_type") private ScriptType type; - @Column(name = "redeemer") - private String redeemer; - - @Column(name = "datum") - private String datum; + @Column(name = "redeemer_cbor") + private String redeemerCbor; @Column(name = "datum_hash") private String datumHash; + @Column(name = "unit_mem") + private BigInteger unitMem; + + @Column(name = "unit_steps") + private BigInteger unitSteps; + + @Enumerated(EnumType.STRING) + @Column(name = "purpose") + private RedeemerTag purpose; + + @Column(name = "redeemer_index") + private Integer redeemerIndex; + + @Column(name = "redeemer_datahash") + private String redeemerDatahash; + } diff --git a/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/storage/impl/jpa/repository/TxScriptRepository.java b/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/storage/impl/jpa/repository/TxScriptRepository.java index 1a84c9837..2aa8b3406 100644 --- a/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/storage/impl/jpa/repository/TxScriptRepository.java +++ b/stores/script/src/main/java/com/bloxbean/cardano/yaci/store/script/storage/impl/jpa/repository/TxScriptRepository.java @@ -2,13 +2,20 @@ import com.bloxbean.cardano.yaci.store.script.storage.impl.jpa.model.TxScriptEntity; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; import java.util.List; @Repository public interface TxScriptRepository extends JpaRepository { - List findByTxHash(String txHash); + + @Query("SELECT t, " + + "(SELECT d.datum FROM DatumEntity d WHERE d.hash = t.datumHash), " + + "(SELECT d.datum FROM DatumEntity d WHERE d.hash = t.redeemerDatahash) " + + "FROM TxScriptEntity t " + + "WHERE t.txHash = :txHash") + List findByTxHash(String txHash); int deleteBySlotGreaterThan(Long slot); } diff --git a/stores/script/src/main/resources/db/store/h2/V0_400_1__init.sql b/stores/script/src/main/resources/db/store/h2/V0_400_1__init.sql index e79ed22ef..408d653eb 100644 --- a/stores/script/src/main/resources/db/store/h2/V0_400_1__init.sql +++ b/stores/script/src/main/resources/db/store/h2/V0_400_1__init.sql @@ -19,9 +19,13 @@ create table transaction_scripts tx_hash varchar(64) not null, script_hash varchar(56), script_type smallint, - redeemer clob, - datum clob, datum_hash varchar(64), + redeemer_cbor clob, + unit_mem bigint, + unit_steps bigint, + purpose varchar(20), + redeemer_index int, + redeemer_datahash varchar(64), block bigint, block_time bigint, update_datetime timestamp diff --git a/stores/script/src/main/resources/db/store/mysql/V0_400_1__init.sql b/stores/script/src/main/resources/db/store/mysql/V0_400_1__init.sql index f47211e2d..3863fc380 100644 --- a/stores/script/src/main/resources/db/store/mysql/V0_400_1__init.sql +++ b/stores/script/src/main/resources/db/store/mysql/V0_400_1__init.sql @@ -18,9 +18,13 @@ create table transaction_scripts tx_hash varchar(64) not null, script_hash varchar(56), script_type smallint, - redeemer longtext, - datum longtext, datum_hash varchar(64), + redeemer_cbor longtext, + unit_mem bigint, + unit_steps bigint, + purpose varchar(20), + redeemer_index smallint, + redeemer_datahash varchar(64), block bigint, block_time bigint, update_datetime timestamp diff --git a/stores/script/src/main/resources/db/store/postgresql/V0_400_1__init.sql b/stores/script/src/main/resources/db/store/postgresql/V0_400_1__init.sql index f885d30fd..ffc040cab 100644 --- a/stores/script/src/main/resources/db/store/postgresql/V0_400_1__init.sql +++ b/stores/script/src/main/resources/db/store/postgresql/V0_400_1__init.sql @@ -18,9 +18,13 @@ create table transaction_scripts tx_hash varchar(64) not null, script_hash varchar(56), script_type smallint, - redeemer text, - datum text, datum_hash varchar(64), + redeemer_cbor text, + unit_mem bigint, + unit_steps bigint, + purpose varchar(20), + redeemer_index smallint, + redeemer_datahash varchar(64), block bigint, block_time bigint, update_datetime timestamp