Search in sources :

Example 1 with TxnId

use of com.hedera.services.state.submerkle.TxnId in project hedera-services by hashgraph.

the class TxnAwareRecordsHistorianTest method incorporatesChildRecordsIfPresent.

@Test
void incorporatesChildRecordsIfPresent() {
    final var mockFollowingRecord = mock(ExpirableTxnRecord.class);
    final var followingChildNows = nows + 1;
    given(mockFollowingRecord.getConsensusSecond()).willReturn(followingChildNows);
    final var mockPrecedingRecord = mock(ExpirableTxnRecord.class);
    final var precedingChildNows = nows - 1;
    given(mockPrecedingRecord.getConsensusSecond()).willReturn(precedingChildNows);
    given(mockPrecedingRecord.getEnumStatus()).willReturn(INVALID_ACCOUNT_ID);
    given(mockFollowingRecord.getEnumStatus()).willReturn(INVALID_CHUNK_NUMBER);
    final var expPrecedeId = txnIdA.toBuilder().setNonce(1).build();
    final var expFollowId = txnIdA.toBuilder().setNonce(2).build();
    final var expectedPrecedingChildId = new TxnId(aEntity, new RichInstant(nows, nanos), false, 1);
    final var expectedFollowingChildId = new TxnId(aEntity, new RichInstant(nows, nanos), false, 2);
    final var mockTopLevelRecord = mock(ExpirableTxnRecord.class);
    given(mockTopLevelRecord.getEnumStatus()).willReturn(SUCCESS);
    final var topLevelRecord = mock(ExpirableTxnRecord.Builder.class);
    given(topLevelRecord.getTxnId()).willReturn(TxnId.fromGrpc(txnIdA));
    final var followingBuilder = mock(ExpirableTxnRecord.Builder.class);
    given(followingBuilder.getTxnId()).willReturn(expectedFollowingChildId);
    given(mockFollowingRecord.getTxnId()).willReturn(expectedFollowingChildId);
    final var precedingBuilder = mock(ExpirableTxnRecord.Builder.class);
    given(precedingBuilder.getTxnId()).willReturn(expectedPrecedingChildId);
    given(mockPrecedingRecord.getTxnId()).willReturn(expectedPrecedingChildId);
    final var expectedFollowTime = topLevelNow.plusNanos(1);
    final var expectedPrecedingTime = topLevelNow.minusNanos(1);
    givenTopLevelContext();
    given(topLevelRecord.setNumChildRecords(anyShort())).willReturn(topLevelRecord);
    given(topLevelRecord.build()).willReturn(mockTopLevelRecord);
    given(followingBuilder.build()).willReturn(mockFollowingRecord);
    given(precedingBuilder.build()).willReturn(mockPrecedingRecord);
    given(txnCtx.recordSoFar()).willReturn(topLevelRecord);
    given(creator.saveExpiringRecord(effPayer, mockTopLevelRecord, nows, submittingMember)).willReturn(mockTopLevelRecord);
    given(creator.saveExpiringRecord(effPayer, mockFollowingRecord, followingChildNows, submittingMember)).willReturn(mockFollowingRecord);
    given(creator.saveExpiringRecord(effPayer, mockPrecedingRecord, precedingChildNows, submittingMember)).willReturn(mockPrecedingRecord);
    final var followSynthBody = aBuilderWith("FOLLOW");
    final var precedeSynthBody = aBuilderWith("PRECEDE");
    assertEquals(topLevelNow.plusNanos(1), subject.nextFollowingChildConsensusTime());
    subject.trackFollowingChildRecord(1, followSynthBody, followingBuilder);
    assertEquals(topLevelNow.plusNanos(2), subject.nextFollowingChildConsensusTime());
    subject.trackPrecedingChildRecord(1, precedeSynthBody, precedingBuilder);
    subject.saveExpirableTransactionRecords();
    final var followingRsos = subject.getFollowingChildRecords();
    final var precedingRsos = subject.getPrecedingChildRecords();
    verify(topLevelRecord).excludeHbarChangesFrom(followingBuilder);
    verify(topLevelRecord).excludeHbarChangesFrom(precedingBuilder);
    verify(topLevelRecord).setNumChildRecords((short) 2);
    verify(followingBuilder).setConsensusTime(RichInstant.fromJava(expectedFollowTime));
    verify(followingBuilder).setParentConsensusTime(topLevelNow);
    verify(precedingBuilder).setConsensusTime(RichInstant.fromJava(expectedPrecedingTime));
    verify(precedingBuilder).setTxnId(expectedPrecedingChildId);
    verify(followingBuilder).setTxnId(expectedFollowingChildId);
    assertEquals(1, followingRsos.size());
    assertEquals(1, precedingRsos.size());
    final var precedeRso = precedingRsos.get(0);
    assertEquals(expectedPrecedingTime, precedeRso.getTimestamp());
    final var precedeSynth = precedeRso.getTransaction();
    final var expectedPrecedeSynth = synthFromBody(precedeSynthBody.setTransactionID(expPrecedeId).build());
    assertEquals(expectedPrecedeSynth, precedeSynth);
    final var followRso = followingRsos.get(0);
    assertEquals(expectedFollowTime, followRso.getTimestamp());
    final var followSynth = followRso.getTransaction();
    final var expectedFollowSynth = synthFromBody(followSynthBody.setTransactionID(expFollowId).build());
    assertEquals(expectedFollowSynth, followSynth);
    verify(creator).saveExpiringRecord(effPayer, mockPrecedingRecord, precedingChildNows, submittingMember);
    verify(creator).saveExpiringRecord(effPayer, mockTopLevelRecord, nows, submittingMember);
    verify(creator).saveExpiringRecord(effPayer, mockFollowingRecord, followingChildNows, submittingMember);
    verifyBuilderUse(precedingBuilder, expectedPrecedingChildId, noThrowSha384HashOf(expectedPrecedeSynth.getSignedTransactionBytes().toByteArray()));
    verifyBuilderUse(followingBuilder, expectedFollowingChildId, noThrowSha384HashOf(expectedFollowSynth.getSignedTransactionBytes().toByteArray()));
    verify(recordCache).setPostConsensus(expPrecedeId, INVALID_ACCOUNT_ID, mockPrecedingRecord);
    verify(recordCache).setPostConsensus(expFollowId, INVALID_CHUNK_NUMBER, mockFollowingRecord);
}
Also used : ExpirableTxnRecord(com.hedera.services.state.submerkle.ExpirableTxnRecord) TxnId(com.hedera.services.state.submerkle.TxnId) RichInstant(com.hedera.services.state.submerkle.RichInstant) Test(org.junit.jupiter.api.Test)

Example 2 with TxnId

use of com.hedera.services.state.submerkle.TxnId in project hedera-services by hashgraph.

the class TxnReceiptBuilderTest method revertsSideEffectsForSuccessAsExpected.

@Test
void revertsSideEffectsForSuccessAsExpected() {
    subject.setStatus("SUCCESS");
    subject.setAccountId(MISSING_ENTITY_ID);
    subject.setContractId(MISSING_ENTITY_ID);
    subject.setFileId(MISSING_ENTITY_ID);
    subject.setTokenId(MISSING_ENTITY_ID);
    subject.setTopicId(MISSING_ENTITY_ID);
    subject.setScheduleId(MISSING_ENTITY_ID);
    subject.setScheduledTxnId(new TxnId());
    subject.setNewTotalSupply(123);
    subject.setSerialNumbers(new long[] { 1, 2, 3 });
    subject.setRunningHashVersion(1);
    subject.setTopicRunningHash("ABC".getBytes());
    subject.setTopicSequenceNumber(321);
    subject.revert();
    assertEquals(REVERTED_SUCCESS_LITERAL, subject.getStatus());
    assertNull(subject.getAccountId());
    assertNull(subject.getContractId());
    assertNull(subject.getFileId());
    assertNull(subject.getTokenId());
    assertNull(subject.getTopicId());
    assertNull(subject.getScheduleId());
    assertNull(subject.getScheduledTxnId());
    assertNull(subject.getSerialNumbers());
    assertNull(subject.getTopicRunningHash());
    assertEquals(MISSING_TOPIC_SEQ_NO, subject.getTopicSequenceNumber());
    assertEquals(MISSING_NEW_TOTAL_SUPPLY, subject.getNewTotalSupply());
    assertEquals(MISSING_RUNNING_HASH_VERSION, subject.getRunningHashVersion());
}
Also used : TxnId(com.hedera.services.state.submerkle.TxnId) Test(org.junit.jupiter.api.Test)

Example 3 with TxnId

use of com.hedera.services.state.submerkle.TxnId in project hedera-services by hashgraph.

the class AccountsReader method from.

public static MerkleMap<EntityNum, MerkleAccount> from(String loc) throws Exception {
    ConstructableRegistry.registerConstructable(new ClassConstructorPair(MerkleLong.class, MerkleLong::new));
    ConstructableRegistry.registerConstructable(new ClassConstructorPair(FCQueue.class, FCQueue::new));
    ConstructableRegistry.registerConstructable(new ClassConstructorPair(MerkleMap.class, MerkleMap::new));
    ConstructableRegistry.registerConstructable(new ClassConstructorPair(MerkleEntityId.class, MerkleEntityId::new));
    ConstructableRegistry.registerConstructable(new ClassConstructorPair(EntityId.class, EntityId::new));
    ConstructableRegistry.registerConstructable(new ClassConstructorPair(MerkleAccount.class, MerkleAccount::new));
    ConstructableRegistry.registerConstructable(new ClassConstructorPair(MerkleAccountState.class, MerkleAccountState::new));
    ConstructableRegistry.registerConstructable(new ClassConstructorPair(ExpirableTxnRecord.class, ExpirableTxnRecord::new));
    ConstructableRegistry.registerConstructable(new ClassConstructorPair(TxnReceipt.class, TxnReceipt::new));
    ConstructableRegistry.registerConstructable(new ClassConstructorPair(TxnId.class, TxnId::new));
    ConstructableRegistry.registerConstructable(new ClassConstructorPair(CurrencyAdjustments.class, CurrencyAdjustments::new));
    ConstructableRegistry.registerConstructable(new ClassConstructorPair(EvmFnResult.class, EvmFnResult::new));
    try (MerkleDataInputStream in = new MerkleDataInputStream(Files.newInputStream(Path.of(loc)))) {
        MerkleMap<EntityNum, MerkleAccount> fcm = in.readMerkleTree(Integer.MAX_VALUE);
        return fcm;
    }
}
Also used : ExpirableTxnRecord(com.hedera.services.state.submerkle.ExpirableTxnRecord) FCQueue(com.swirlds.fcqueue.FCQueue) MerkleDataInputStream(com.swirlds.common.merkle.io.MerkleDataInputStream) TxnReceipt(com.hedera.services.legacy.core.jproto.TxnReceipt) MerkleAccount(com.hedera.services.state.merkle.MerkleAccount) MerkleEntityId(com.hedera.services.state.merkle.MerkleEntityId) MerkleAccountState(com.hedera.services.state.merkle.MerkleAccountState) EntityNum(com.hedera.services.utils.EntityNum) MerkleLong(com.swirlds.common.merkle.utility.MerkleLong) EntityId(com.hedera.services.state.submerkle.EntityId) MerkleEntityId(com.hedera.services.state.merkle.MerkleEntityId) TxnId(com.hedera.services.state.submerkle.TxnId) EvmFnResult(com.hedera.services.state.submerkle.EvmFnResult) MerkleMap(com.swirlds.merkle.map.MerkleMap) CurrencyAdjustments(com.hedera.services.state.submerkle.CurrencyAdjustments) ClassConstructorPair(com.swirlds.common.constructable.ClassConstructorPair)

Example 4 with TxnId

use of com.hedera.services.state.submerkle.TxnId in project hedera-services by hashgraph.

the class FcmToJsonUtil method convertAccountsToJson.

@Test
void convertAccountsToJson() throws Exception {
    ConstructableRegistry.registerConstructable(new ClassConstructorPair(MerkleLong.class, MerkleLong::new));
    ConstructableRegistry.registerConstructable(new ClassConstructorPair(FCQueue.class, FCQueue::new));
    ConstructableRegistry.registerConstructable(new ClassConstructorPair(MerkleEntityId.class, MerkleEntityId::new));
    ConstructableRegistry.registerConstructable(new ClassConstructorPair(EntityId.class, EntityId::new));
    ConstructableRegistry.registerConstructable(new ClassConstructorPair(MerkleAccount.class, MerkleAccount::new));
    ConstructableRegistry.registerConstructable(new ClassConstructorPair(MerkleAccountState.class, MerkleAccountState::new));
    ConstructableRegistry.registerConstructable(new ClassConstructorPair(ExpirableTxnRecord.class, ExpirableTxnRecord::new));
    ConstructableRegistry.registerConstructable(new ClassConstructorPair(TxnReceipt.class, TxnReceipt::new));
    ConstructableRegistry.registerConstructable(new ClassConstructorPair(TxnId.class, TxnId::new));
    ConstructableRegistry.registerConstructable(new ClassConstructorPair(CurrencyAdjustments.class, CurrencyAdjustments::new));
    ConstructableRegistry.registerConstructable(new ClassConstructorPair(EvmFnResult.class, EvmFnResult::new));
    for (String dumpLoc : accountsLocs) {
        PojoLedger.fromDisk(dumpLoc).asJsonTo(jsonSuffixed(dumpLoc));
    }
}
Also used : ExpirableTxnRecord(com.hedera.services.state.submerkle.ExpirableTxnRecord) FCQueue(com.swirlds.fcqueue.FCQueue) TxnReceipt(com.hedera.services.legacy.core.jproto.TxnReceipt) MerkleAccount(com.hedera.services.state.merkle.MerkleAccount) MerkleEntityId(com.hedera.services.state.merkle.MerkleEntityId) MerkleAccountState(com.hedera.services.state.merkle.MerkleAccountState) MerkleLong(com.swirlds.common.merkle.utility.MerkleLong) EntityId(com.hedera.services.state.submerkle.EntityId) MerkleEntityId(com.hedera.services.state.merkle.MerkleEntityId) TxnId(com.hedera.services.state.submerkle.TxnId) EvmFnResult(com.hedera.services.state.submerkle.EvmFnResult) CurrencyAdjustments(com.hedera.services.state.submerkle.CurrencyAdjustments) ClassConstructorPair(com.swirlds.common.constructable.ClassConstructorPair) Test(org.junit.jupiter.api.Test)

Example 5 with TxnId

use of com.hedera.services.state.submerkle.TxnId in project hedera-services by hashgraph.

the class TxnReceipt method fromGrpc.

/* ---  Helpers --- */
public static TxnReceipt fromGrpc(TransactionReceipt grpc) {
    final var effRates = grpc.hasExchangeRate() ? ExchangeRates.fromGrpc(grpc.getExchangeRate()) : null;
    String status = grpc.getStatus() != null ? grpc.getStatus().name() : null;
    EntityId accountId = grpc.hasAccountID() ? EntityId.fromGrpcAccountId(grpc.getAccountID()) : null;
    EntityId jFileID = grpc.hasFileID() ? EntityId.fromGrpcFileId(grpc.getFileID()) : null;
    EntityId jContractID = grpc.hasContractID() ? EntityId.fromGrpcContractId(grpc.getContractID()) : null;
    EntityId topicId = grpc.hasTopicID() ? EntityId.fromGrpcTopicId(grpc.getTopicID()) : null;
    EntityId tokenId = grpc.hasTokenID() ? EntityId.fromGrpcTokenId(grpc.getTokenID()) : null;
    EntityId scheduleId = grpc.hasScheduleID() ? EntityId.fromGrpcScheduleId(grpc.getScheduleID()) : null;
    long runningHashVersion = Math.max(MISSING_RUNNING_HASH_VERSION, grpc.getTopicRunningHashVersion());
    long newTotalSupply = grpc.getNewTotalSupply();
    long[] serialNumbers = grpc.getSerialNumbersList().stream().mapToLong(l -> l).toArray();
    TxnId scheduledTxnId = grpc.hasScheduledTransactionID() ? TxnId.fromGrpc(grpc.getScheduledTransactionID()) : MISSING_SCHEDULED_TXN_ID;
    return TxnReceipt.newBuilder().setStatus(status).setAccountId(accountId).setFileId(jFileID).setContractId(jContractID).setTokenId(tokenId).setScheduleId(scheduleId).setExchangeRates(effRates).setTopicId(topicId).setTopicSequenceNumber(grpc.getTopicSequenceNumber()).setTopicRunningHash(grpc.getTopicRunningHash().toByteArray()).setRunningHashVersion(runningHashVersion).setNewTotalSupply(newTotalSupply).setScheduledTxnId(scheduledTxnId).setSerialNumbers(serialNumbers).build();
}
Also used : EntityId(com.hedera.services.state.submerkle.EntityId) TopicID(com.hederahashgraph.api.proto.java.TopicID) Arrays(java.util.Arrays) ResponseCodeEnum(com.hederahashgraph.api.proto.java.ResponseCodeEnum) SerializableDataInputStream(com.swirlds.common.io.SerializableDataInputStream) EntityId(com.hedera.services.state.submerkle.EntityId) DomainSerdes(com.hedera.services.state.serdes.DomainSerdes) MoreObjects(com.google.common.base.MoreObjects) IOException(java.io.IOException) SelfSerializable(com.swirlds.common.io.SelfSerializable) SUCCESS(com.hederahashgraph.api.proto.java.ResponseCodeEnum.SUCCESS) SerializableDataOutputStream(com.swirlds.common.io.SerializableDataOutputStream) TransactionReceipt(com.hederahashgraph.api.proto.java.TransactionReceipt) ByteString(com.google.protobuf.ByteString) Objects(java.util.Objects) RequestBuilder(com.hederahashgraph.builder.RequestBuilder) REVERTED_SUCCESS(com.hederahashgraph.api.proto.java.ResponseCodeEnum.REVERTED_SUCCESS) CommonUtils(com.swirlds.common.CommonUtils) TxnId(com.hedera.services.state.submerkle.TxnId) ExchangeRates(com.hedera.services.state.submerkle.ExchangeRates) CommonUtils.getNormalisedStringFromBytes(com.swirlds.common.CommonUtils.getNormalisedStringFromBytes) TxnId(com.hedera.services.state.submerkle.TxnId) ByteString(com.google.protobuf.ByteString)

Aggregations

TxnId (com.hedera.services.state.submerkle.TxnId)5 EntityId (com.hedera.services.state.submerkle.EntityId)3 ExpirableTxnRecord (com.hedera.services.state.submerkle.ExpirableTxnRecord)3 Test (org.junit.jupiter.api.Test)3 TxnReceipt (com.hedera.services.legacy.core.jproto.TxnReceipt)2 MerkleAccount (com.hedera.services.state.merkle.MerkleAccount)2 MerkleAccountState (com.hedera.services.state.merkle.MerkleAccountState)2 MerkleEntityId (com.hedera.services.state.merkle.MerkleEntityId)2 CurrencyAdjustments (com.hedera.services.state.submerkle.CurrencyAdjustments)2 EvmFnResult (com.hedera.services.state.submerkle.EvmFnResult)2 ClassConstructorPair (com.swirlds.common.constructable.ClassConstructorPair)2 MerkleLong (com.swirlds.common.merkle.utility.MerkleLong)2 FCQueue (com.swirlds.fcqueue.FCQueue)2 MoreObjects (com.google.common.base.MoreObjects)1 ByteString (com.google.protobuf.ByteString)1 DomainSerdes (com.hedera.services.state.serdes.DomainSerdes)1 ExchangeRates (com.hedera.services.state.submerkle.ExchangeRates)1 RichInstant (com.hedera.services.state.submerkle.RichInstant)1 EntityNum (com.hedera.services.utils.EntityNum)1 ResponseCodeEnum (com.hederahashgraph.api.proto.java.ResponseCodeEnum)1