Skip to content

Commit

Permalink
Support code delegations when purging confirmed blocks in the layered…
Browse files Browse the repository at this point in the history
… txpool

Signed-off-by: Fabio Di Fabio <[email protected]>
  • Loading branch information
fab-10 committed Dec 11, 2024
1 parent ea04b25 commit 9442e4c
Show file tree
Hide file tree
Showing 6 changed files with 310 additions and 54 deletions.
3 changes: 1 addition & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,9 @@
- Proof of Work consensus
- Fast Sync



### Additions and Improvements
- Retrieve all transaction receipts for a block in one request [#6646](https://github.com/hyperledger/besu/pull/6646)
- Add support for EIP-7702 transaction in the txpool [#8018](https://github.com/hyperledger/besu/pull/8018) [#7984](https://github.com/hyperledger/besu/pull/7984)

### Bug fixes

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -433,7 +433,7 @@ public OptionalLong getNextNonceForSender(final Address sender) {
}

@Override
public synchronized void manageBlockAdded(
public void manageBlockAdded(
final BlockHeader blockHeader,
final List<Transaction> confirmedTransactions,
final List<Transaction> reorgTransactions,
Expand All @@ -447,19 +447,21 @@ public synchronized void manageBlockAdded(

final var reorgNonceRangeBySender = nonceRangeBySender(reorgTransactions);

try {
prioritizedTransactions.blockAdded(feeMarket, blockHeader, maxConfirmedNonceBySender);
} catch (final Throwable throwable) {
LOG.warn(
"Unexpected error {} when managing added block {}, maxNonceBySender {}, reorgNonceRangeBySender {}",
throwable,
blockHeader.toLogString(),
maxConfirmedNonceBySender,
reorgTransactions);
LOG.warn("Stack trace", throwable);
}
synchronized (this) {
try {
prioritizedTransactions.blockAdded(feeMarket, blockHeader, maxConfirmedNonceBySender);
} catch (final Throwable throwable) {
LOG.warn(
"Unexpected error {} when managing added block {}, maxNonceBySender {}, reorgNonceRangeBySender {}",
throwable,
blockHeader.toLogString(),
maxConfirmedNonceBySender,
reorgTransactions);
LOG.warn("Stack trace", throwable);
}

logBlockHeaderForReplay(blockHeader, maxConfirmedNonceBySender, reorgNonceRangeBySender);
logBlockHeaderForReplay(blockHeader, maxConfirmedNonceBySender, reorgNonceRangeBySender);
}
}

private void logBlockHeaderForReplay(
Expand Down Expand Up @@ -498,10 +500,25 @@ private void logBlockHeaderForReplay(
}

private Map<Address, Long> maxNonceBySender(final List<Transaction> confirmedTransactions) {
record SenderNonce(Address sender, long nonce) {}

return confirmedTransactions.stream()
.<SenderNonce>mapMulti(
(transaction, consumer) -> {
// always consider the sender
consumer.accept(new SenderNonce(transaction.getSender(), transaction.getNonce()));

// and if a code delegation tx also the authorities
if (transaction.getType().supportsDelegateCode()) {
transaction.getCodeDelegationList().get().stream()
.map(cd -> cd.authorizer().map(address -> new SenderNonce(address, cd.nonce())))
.filter(Optional::isPresent)
.map(Optional::get)
.forEach(consumer);
}
})
.collect(
groupingBy(
Transaction::getSender, mapping(Transaction::getNonce, reducing(0L, Math::max))));
groupingBy(SenderNonce::sender, mapping(SenderNonce::nonce, reducing(0L, Math::max))));
}

private Map<Address, LongRange> nonceRangeBySender(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,8 @@ public class PendingTransactionEstimatedMemorySizeTest extends BaseTransactionPo
@Test
public void toSize() {
TransactionTestFixture preparedTx =
prepareTransaction(TransactionType.ACCESS_LIST, 10, Wei.of(500), Wei.ZERO, 10, 0);
prepareTransaction(
TransactionType.ACCESS_LIST, 10, Wei.of(500), Wei.ZERO, 10, 0, List.of());
Transaction txTo =
preparedTx.to(Optional.of(Address.extract(Bytes32.random()))).createTransaction(KEYS1);
BytesValueRLPOutput rlpOut = new BytesValueRLPOutput();
Expand Down Expand Up @@ -187,7 +188,8 @@ public void toSize() {
public void payloadSize() {

TransactionTestFixture preparedTx =
prepareTransaction(TransactionType.ACCESS_LIST, 10, Wei.of(500), Wei.ZERO, 10, 0);
prepareTransaction(
TransactionType.ACCESS_LIST, 10, Wei.of(500), Wei.ZERO, 10, 0, List.of());
Transaction txPayload = preparedTx.createTransaction(KEYS1);
BytesValueRLPOutput rlpOut = new BytesValueRLPOutput();
txPayload.writeTo(rlpOut);
Expand Down Expand Up @@ -277,7 +279,7 @@ private void blobsWithCommitmentsFieldSize(
final long containerSize,
final long itemSize) {
TransactionTestFixture preparedTx =
prepareTransaction(TransactionType.BLOB, 10, Wei.of(500), Wei.of(50), 10, 1);
prepareTransaction(TransactionType.BLOB, 10, Wei.of(500), Wei.of(50), 10, 1, List.of());
Transaction txBlob = preparedTx.createTransaction(KEYS1);
BytesValueRLPOutput rlpOut = new BytesValueRLPOutput();
TransactionEncoder.encodeRLP(txBlob, rlpOut, EncodingContext.POOLED_TRANSACTION);
Expand Down Expand Up @@ -309,7 +311,7 @@ private void blobsWithCommitmentsFieldSize(
@Test
public void blobsWithCommitmentsSize() {
TransactionTestFixture preparedTx =
prepareTransaction(TransactionType.BLOB, 10, Wei.of(500), Wei.of(50), 10, 1);
prepareTransaction(TransactionType.BLOB, 10, Wei.of(500), Wei.of(50), 10, 1, List.of());
Transaction txBlob = preparedTx.createTransaction(KEYS1);
BytesValueRLPOutput rlpOut = new BytesValueRLPOutput();
TransactionEncoder.encodeRLP(txBlob, rlpOut, EncodingContext.POOLED_TRANSACTION);
Expand Down Expand Up @@ -337,7 +339,8 @@ public void blobsWithCommitmentsSize() {
public void pendingTransactionSize() {

TransactionTestFixture preparedTx =
prepareTransaction(TransactionType.ACCESS_LIST, 10, Wei.of(500), Wei.ZERO, 10, 0);
prepareTransaction(
TransactionType.ACCESS_LIST, 10, Wei.of(500), Wei.ZERO, 10, 0, List.of());
Transaction txPayload = preparedTx.createTransaction(KEYS1);
BytesValueRLPOutput rlpOut = new BytesValueRLPOutput();
txPayload.writeTo(rlpOut);
Expand Down Expand Up @@ -369,7 +372,7 @@ public void accessListSize() {
final List<AccessListEntry> ales = List.of(ale1);

TransactionTestFixture preparedTx =
prepareTransaction(TransactionType.ACCESS_LIST, 0, Wei.of(500), Wei.ZERO, 0, 0);
prepareTransaction(TransactionType.ACCESS_LIST, 0, Wei.of(500), Wei.ZERO, 0, 0, List.of());
Transaction txAccessList = preparedTx.accessList(ales).createTransaction(KEYS1);
BytesValueRLPOutput rlpOut = new BytesValueRLPOutput();
txAccessList.writeTo(rlpOut);
Expand Down Expand Up @@ -416,7 +419,14 @@ public void codeDelegationListSize() {
System.setProperty("jol.magicFieldOffset", "true");

TransactionTestFixture preparedTx =
prepareTransaction(TransactionType.DELEGATE_CODE, 0, Wei.of(500), Wei.ZERO, 0, 0);
prepareTransaction(
TransactionType.DELEGATE_CODE,
0,
Wei.of(500),
Wei.ZERO,
0,
0,
List.of(CODE_DELEGATION_SENDER_1));
Transaction txDelegateCode = preparedTx.createTransaction(KEYS1);
BytesValueRLPOutput rlpOut = new BytesValueRLPOutput();
txDelegateCode.writeTo(rlpOut);
Expand Down Expand Up @@ -461,7 +471,7 @@ public void baseEIP1559AndEIP4844TransactionMemorySize() {
@Test
public void baseFrontierAndAccessListTransactionMemorySize() {
final Transaction txFrontier =
createTransaction(TransactionType.FRONTIER, 1, Wei.of(500), 0, KEYS1);
createTransaction(TransactionType.FRONTIER, 1, Wei.of(500), 0, List.of(), KEYS1);
assertThat(baseTransactionMemorySize(txFrontier, FRONTIER_ACCESS_LIST_CONSTANT_FIELD_PATHS))
.isEqualTo(FRONTIER_AND_ACCESS_LIST_SHALLOW_SIZE);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ protected Transaction createTransactionReplacement(
originalTransaction.getMaxGasPrice().multiply(2).divide(10),
originalTransaction.getPayload().size(),
originalTransaction.getBlobCount(),
originalTransaction.getCodeDelegationList().orElse(List.of()),
keys);
}

Expand Down Expand Up @@ -191,7 +192,7 @@ public void txWithEffectiveGasPriceBelowCurrentMineableMinGasPriceIsNotPrioritiz
final TransactionType type) {
final PendingTransaction lowGasPriceTx =
createRemotePendingTransaction(
createTransaction(type, 0, DEFAULT_MIN_GAS_PRICE, Wei.ONE, 0, 1, KEYS1));
createTransaction(type, 0, DEFAULT_MIN_GAS_PRICE, Wei.ONE, 0, 1, List.of(), KEYS1));
assertThat(prioritizeTransaction(lowGasPriceTx)).isEqualTo(DROPPED);
assertEvicted(lowGasPriceTx);
assertTransactionNotPrioritized(lowGasPriceTx);
Expand All @@ -217,6 +218,7 @@ public void shouldPrioritizePriorityFeeThenTimeAddedToPoolSameTypeTxs(
0,
DEFAULT_MIN_GAS_PRICE.add(1).multiply(20),
0,
List.of(),
SIGNATURE_ALGORITHM.get().generateKeyPair())))
.collect(Collectors.toUnmodifiableList());

Expand All @@ -238,6 +240,7 @@ public void maxNumberOfTxsForTypeIsEnforced() {
DEFAULT_MIN_GAS_PRICE.divide(10),
0,
1,
List.of(),
SIGNATURE_ALGORITHM.get().generateKeyPair());
addedTxs.add(tx);
assertThat(prioritizeTransaction(tx)).isEqualTo(ADDED);
Expand All @@ -251,6 +254,7 @@ public void maxNumberOfTxsForTypeIsEnforced() {
DEFAULT_MIN_GAS_PRICE.divide(10),
0,
1,
List.of(),
SIGNATURE_ALGORITHM.get().generateKeyPair());
assertThat(prioritizeTransaction(overflowTx)).isEqualTo(DROPPED);

Expand All @@ -272,6 +276,7 @@ public void maxNumberOfTxsForTypeWithReplacement() {
DEFAULT_MIN_GAS_PRICE.divide(10),
0,
1,
List.of(),
KEYS1);
addedTxs.add(tx);
assertThat(prioritizeTransaction(tx)).isEqualTo(ADDED);
Expand Down
Loading

0 comments on commit 9442e4c

Please sign in to comment.