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);
}
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());
}
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;
}
}
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));
}
}
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();
}
Aggregations