use of com.radixdlt.atom.Txn in project radixdlt by radixdlt.
the class StateComputerLedgerTest method should_accumulate_when_next_command_valid.
@Test
public void should_accumulate_when_next_command_valid() {
// Arrange
genesisIsEndOfEpoch(false);
when(stateComputer.prepare(any(), any(), anyLong())).thenReturn(new StateComputerResult(ImmutableList.of(successfulNextCommand), ImmutableMap.of()));
// Act
var unverifiedVertex = UnverifiedVertex.create(genesisQC, View.of(1), List.of(nextTxn), BFTNode.random());
var proposedVertex = new VerifiedVertex(unverifiedVertex, hasher.hash(unverifiedVertex));
Optional<PreparedVertex> nextPrepared = sut.prepare(new LinkedList<>(), proposedVertex);
// Assert
assertThat(nextPrepared).hasValueSatisfying(x -> assertThat(x.getLedgerHeader().isEndOfEpoch()).isFalse());
assertThat(nextPrepared.flatMap(x -> accumulatorVerifier.verifyAndGetExtension(ledgerHeader.getAccumulatorState(), List.of(nextTxn), txn -> txn.getId().asHashCode(), x.getLedgerHeader().getAccumulatorState()))).contains(List.of(nextTxn));
}
use of com.radixdlt.atom.Txn in project radixdlt by radixdlt.
the class MempoolSanityTest method when_submitting_items_to_null_mempool__then_test_should_fail.
/**
* TODO: This is more of a test for mempoolSubmissionSteadyState, should move somewhere else
*/
@Test
public void when_submitting_items_to_null_mempool__then_test_should_fail() {
SimulationTest simulationTest = bftTestBuilder.addOverrideModuleToAllInitialNodes(new AbstractModule() {
@Override
protected void configure() {
bind(new TypeLiteral<Mempool<Txn>>() {
}).toInstance(Mempools.empty());
}
}).build();
final var checkResults = simulationTest.run().awaitCompletion();
assertThat(checkResults).hasEntrySatisfying(Monitor.MEMPOOL_COMMITTED, error -> assertThat(error).isPresent());
}
use of com.radixdlt.atom.Txn in project radixdlt by radixdlt.
the class ConsensusToLedgerCommittedInvariant method check.
@Override
public Observable<TestInvariantError> check(RunningNetwork network) {
BehaviorSubject<Set<Txn>> committedTxns = BehaviorSubject.create();
Disposable d = network.ledgerUpdates().<Set<Txn>>scan(new HashSet<>(), (set, next) -> {
set.addAll(next.getSecond().getNewTxns());
return set;
}).subscribe(committedTxns::onNext);
return Observable.<BFTCommittedUpdate>create(emitter -> commits.addListener((node, event) -> emitter.onNext(event), BFTCommittedUpdate.class)).serialize().concatMap(committedUpdate -> Observable.fromStream(committedUpdate.committed().stream().flatMap(PreparedVertex::successfulCommands))).flatMapMaybe(txn -> committedTxns.filter(cmdSet -> cmdSet.contains(txn.txn())).timeout(10, TimeUnit.SECONDS).firstOrError().ignoreElement().onErrorReturn(e -> new TestInvariantError("Committed command in vertex has not been inserted into the ledger" + " after 10 seconds"))).doFinally(d::dispose);
}
use of com.radixdlt.atom.Txn in project radixdlt by radixdlt.
the class TransactionsHandler method construct.
private CommittedTransaction construct(Txn txn, RecoverableProcessedTxn recoveryInfo, AccumulatorState accumulatorState) {
var parser = radixEngineProvider.get().getParser();
ParsedTxn parsedTxn;
try {
parsedTxn = parser.parse(txn);
} catch (TxnParseException e) {
throw new IllegalStateException("Could not parse already committed transaction", e);
}
var committedTransaction = new CommittedTransaction();
recoveryInfo.recoverStateUpdates(parsedTxn).stream().map(stateUpdateGroup -> {
var operationGroup = new OperationGroup();
stateUpdateGroup.stream().map(stateUpdate -> {
var substateOperation = stateUpdate.recover(radixEngineProvider);
return coreModelMapper.operation(substateOperation.getSubstate(), substateOperation.getSubstateId(), substateOperation.isBootUp(), this::symbol);
}).forEach(operationGroup::addOperationsItem);
return operationGroup;
}).forEach(committedTransaction::addOperationGroupsItem);
var signedBy = parsedTxn.getPayloadHashAndSig().map(hashAndSig -> {
var hash = hashAndSig.getFirst();
var sig = hashAndSig.getSecond();
return ECPublicKey.recoverFrom(hash, sig).orElseThrow(() -> new IllegalStateException("Invalid signature on already committed transaction"));
});
var transactionIdentifier = coreModelMapper.transactionIdentifier(txn.getId());
return committedTransaction.committedStateIdentifier(coreModelMapper.stateIdentifier(accumulatorState)).metadata(new CommittedTransactionMetadata().fee(coreModelMapper.nativeTokenAmount(parsedTxn.getFeePaid())).message(parsedTxn.getMsg().map(Bytes::toHexString).orElse(null)).size(txn.getPayload().length).hex(Bytes.toHexString(txn.getPayload())).signedBy(signedBy.map(coreModelMapper::publicKey).orElse(null))).transactionIdentifier(transactionIdentifier);
}
use of com.radixdlt.atom.Txn in project radixdlt by radixdlt.
the class VoteHandler method handleRequest.
@Override
public UpdateVoteResponse handleRequest(UpdateVoteRequest request) throws CoreApiException {
coreModelMapper.verifyNetwork(request.getNetworkIdentifier());
final Txn signedTx;
try {
signedTx = radixEngine.constructWithFees(this::buildVote, false, REAddr.ofPubKeyAccount(validatorKey), NotEnoughNativeTokensForFeesException::new).signAndBuild(hashSigner::sign);
} catch (TxBuilderException e) {
throw CoreApiException.badRequest(coreModelMapper.builderErrorDetails(e));
}
try {
radixEngineStateComputer.addToMempool(signedTx);
return new UpdateVoteResponse().transactionIdentifier(coreModelMapper.transactionIdentifier(signedTx.getId())).duplicate(false);
} catch (MempoolDuplicateException e) {
return new UpdateVoteResponse().transactionIdentifier(coreModelMapper.transactionIdentifier(signedTx.getId())).duplicate(true);
} catch (MempoolFullException e) {
throw coreModelMapper.mempoolFullException(e);
} catch (MempoolRejectedException e) {
throw coreModelMapper.radixEngineException((RadixEngineException) e.getCause());
}
}
Aggregations