Skip to content

Commit 371b6c9

Browse files
fab-10jflo
authored andcommitted
[Interop-4844] Data gas accounting (#4998)
merge of #4992 into interop feature branch Signed-off-by: Fabio Di Fabio <[email protected]> (cherry picked from commit 949e3fe) (cherry picked from commit 9734c983ce00bda161434506688f12ee07bbd820)
1 parent 6e2fe82 commit 371b6c9

File tree

8 files changed

+248
-156
lines changed

8 files changed

+248
-156
lines changed

ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreator.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import org.hyperledger.besu.datatypes.DataGas;
1919
import org.hyperledger.besu.datatypes.Hash;
2020
import org.hyperledger.besu.datatypes.Wei;
21+
import org.hyperledger.besu.ethereum.GasLimitCalculator;
2122
import org.hyperledger.besu.ethereum.ProtocolContext;
2223
import org.hyperledger.besu.ethereum.blockcreation.BlockTransactionSelector.TransactionSelectionResults;
2324
import org.hyperledger.besu.ethereum.core.Block;
@@ -232,6 +233,10 @@ protected BlockCreationResult createBlock(
232233

233234
throwIfStopped();
234235

236+
final DataGas newExcessDataGas = computeExcessDataGas(transactionResults, newProtocolSpec);
237+
238+
throwIfStopped();
239+
235240
final SealableBlockHeader sealableBlockHeader =
236241
BlockHeaderBuilder.create()
237242
.populateFrom(processableBlockHeader)
@@ -362,13 +367,13 @@ private ProcessableBlockHeader createPendingBlockHeader(
362367
final Optional<Bytes32> maybePrevRandao,
363368
final ProtocolSpec protocolSpec) {
364369
final long newBlockNumber = parentHeader.getNumber() + 1;
365-
long gasLimit =
366-
protocolSpec
367-
.getGasLimitCalculator()
368-
.nextGasLimit(
369-
parentHeader.getGasLimit(),
370-
targetGasLimitSupplier.get().orElse(parentHeader.getGasLimit()),
371-
newBlockNumber);
370+
final GasLimitCalculator gasLimitCalculator = protocolSpec.getGasLimitCalculator();
371+
372+
final long gasLimit =
373+
gasLimitCalculator.nextGasLimit(
374+
parentHeader.getGasLimit(),
375+
targetGasLimitSupplier.get().orElse(parentHeader.getGasLimit()),
376+
newBlockNumber);
372377

373378
final DifficultyCalculator difficultyCalculator = protocolSpec.getDifficultyCalculator();
374379
final BigInteger difficulty =

ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/BlockTransactionSelector.java

Lines changed: 148 additions & 132 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,17 @@
3434
import org.hyperledger.besu.ethereum.vm.BlockHashLookup;
3535
import org.hyperledger.besu.ethereum.vm.CachingBlockHashLookup;
3636
import org.hyperledger.besu.evm.gascalculator.GasCalculator;
37+
import org.hyperledger.besu.evm.account.EvmAccount;
38+
import org.hyperledger.besu.evm.gascalculator.GasCalculator;
3739
import org.hyperledger.besu.evm.worldstate.WorldUpdater;
3840
import org.hyperledger.besu.plugin.data.TransactionSelectionResult;
3941
import org.hyperledger.besu.plugin.data.TransactionType;
4042
import org.hyperledger.besu.plugin.services.txselection.TransactionSelector;
4143
import org.hyperledger.besu.plugin.services.txselection.TransactionSelectorFactory;
4244

4345
import java.util.ArrayList;
46+
import java.util.Collections;
47+
import java.util.HashMap;
4448
import java.util.EnumMap;
4549
import java.util.List;
4650
import java.util.Map;
@@ -50,6 +54,7 @@
5054
import java.util.function.Function;
5155
import java.util.function.Supplier;
5256
import java.util.stream.Collectors;
57+
import java.util.stream.Stream;
5358

5459
import com.google.common.collect.Lists;
5560
import org.slf4j.Logger;
@@ -76,136 +81,6 @@
7681
* not cleared between executions of buildTransactionListForBlock().
7782
*/
7883
public class BlockTransactionSelector {
79-
public static class TransactionValidationResult {
80-
private final Transaction transaction;
81-
private final ValidationResult<TransactionInvalidReason> validationResult;
82-
83-
public TransactionValidationResult(
84-
final Transaction transaction,
85-
final ValidationResult<TransactionInvalidReason> validationResult) {
86-
this.transaction = transaction;
87-
this.validationResult = validationResult;
88-
}
89-
90-
public Transaction getTransaction() {
91-
return transaction;
92-
}
93-
94-
public ValidationResult<TransactionInvalidReason> getValidationResult() {
95-
return validationResult;
96-
}
97-
98-
@Override
99-
public boolean equals(final Object o) {
100-
if (this == o) {
101-
return true;
102-
}
103-
if (o == null || getClass() != o.getClass()) {
104-
return false;
105-
}
106-
TransactionValidationResult that = (TransactionValidationResult) o;
107-
return Objects.equals(transaction, that.transaction)
108-
&& Objects.equals(validationResult, that.validationResult);
109-
}
110-
111-
@Override
112-
public int hashCode() {
113-
return Objects.hash(transaction, validationResult);
114-
}
115-
}
116-
117-
public static class TransactionSelectionResults {
118-
private final List<Transaction> transactions = Lists.newArrayList();
119-
private final Map<TransactionType, List<Transaction>> transactionsByType =
120-
new EnumMap<>(TransactionType.class);
121-
private final List<TransactionReceipt> receipts = Lists.newArrayList();
122-
private final List<TransactionValidationResult> invalidTransactions = Lists.newArrayList();
123-
private long cumulativeGasUsed = 0;
124-
private long cumulativeDataGasUsed = 0;
125-
126-
private void update(
127-
final Transaction transaction,
128-
final TransactionReceipt receipt,
129-
final long gasUsed,
130-
final long dataGasUsed) {
131-
transactions.add(transaction);
132-
transactionsByType
133-
.computeIfAbsent(transaction.getType(), type -> new ArrayList<>())
134-
.add(transaction);
135-
receipts.add(receipt);
136-
cumulativeGasUsed += gasUsed;
137-
cumulativeDataGasUsed += dataGasUsed;
138-
LOG.atTrace()
139-
.setMessage(
140-
"New selected transaction {}, total transactions {}, cumulative gas used {}, cumulative data gas used {}")
141-
.addArgument(transaction::toTraceLog)
142-
.addArgument(transactions::size)
143-
.addArgument(cumulativeGasUsed)
144-
.addArgument(cumulativeDataGasUsed)
145-
.log();
146-
}
147-
148-
private void updateWithInvalidTransaction(
149-
final Transaction transaction,
150-
final ValidationResult<TransactionInvalidReason> validationResult) {
151-
invalidTransactions.add(new TransactionValidationResult(transaction, validationResult));
152-
}
153-
154-
public List<Transaction> getTransactions() {
155-
return transactions;
156-
}
157-
158-
public List<Transaction> getTransactionsByType(final TransactionType type) {
159-
return transactionsByType.getOrDefault(type, List.of());
160-
}
161-
162-
public List<TransactionReceipt> getReceipts() {
163-
return receipts;
164-
}
165-
166-
public long getCumulativeGasUsed() {
167-
return cumulativeGasUsed;
168-
}
169-
170-
public long getCumulativeDataGasUsed() {
171-
return cumulativeDataGasUsed;
172-
}
173-
174-
public List<TransactionValidationResult> getInvalidTransactions() {
175-
return invalidTransactions;
176-
}
177-
178-
@Override
179-
public boolean equals(final Object o) {
180-
if (this == o) {
181-
return true;
182-
}
183-
if (o == null || getClass() != o.getClass()) {
184-
return false;
185-
}
186-
TransactionSelectionResults that = (TransactionSelectionResults) o;
187-
return cumulativeGasUsed == that.cumulativeGasUsed
188-
&& cumulativeDataGasUsed == that.cumulativeDataGasUsed
189-
&& transactions.equals(that.transactions)
190-
&& receipts.equals(that.receipts)
191-
&& invalidTransactions.equals(that.invalidTransactions);
192-
}
193-
194-
@Override
195-
public int hashCode() {
196-
return Objects.hash(
197-
transactions, receipts, invalidTransactions, cumulativeGasUsed, cumulativeDataGasUsed);
198-
}
199-
200-
public String toTraceLog() {
201-
return "cumulativeGasUsed="
202-
+ cumulativeGasUsed
203-
+ ", cumulativeDataGasUsed="
204-
+ cumulativeDataGasUsed
205-
+ ", transactions="
206-
+ transactions.stream().map(Transaction::toTraceLog).collect(Collectors.joining("; "));
207-
}
208-
}
20984

21085
private static final Logger LOG = LoggerFactory.getLogger(BlockTransactionSelector.class);
21186

@@ -407,7 +282,13 @@ private List<org.hyperledger.besu.plugin.data.Log> getLogs(final List<Log> logs)
407282

408283
private boolean transactionDataPriceBelowMin(final Transaction transaction) {
409284
if (transaction.getType().supportsBlob()) {
410-
if (transaction.getMaxFeePerDataGas().orElseThrow().lessThan(dataGasPrice)) {
285+
if (transaction
286+
.getMaxFeePerDataGas()
287+
.orElseThrow()
288+
.lessThan(
289+
feeMarket
290+
.getTransactionPriceCalculator()
291+
.dataPrice(transaction, processableBlockHeader))) {
411292
return true;
412293
}
413294
}
@@ -477,7 +358,6 @@ private void updateTransactionResultTracking(
477358
final Transaction transaction, final TransactionProcessingResult result) {
478359

479360
final long gasUsedByTransaction = transaction.getGasLimit() - result.getGasRemaining();
480-
481361
final long cumulativeGasUsed =
482362
transactionSelectionResult.getCumulativeGasUsed() + gasUsedByTransaction;
483363

@@ -525,4 +405,140 @@ private boolean blockOccupancyAboveThreshold() {
525405

526406
return occupancyRatio >= minBlockOccupancyRatio;
527407
}
408+
409+
public static class TransactionValidationResult {
410+
private final Transaction transaction;
411+
private final ValidationResult<TransactionInvalidReason> validationResult;
412+
413+
public TransactionValidationResult(
414+
final Transaction transaction,
415+
final ValidationResult<TransactionInvalidReason> validationResult) {
416+
this.transaction = transaction;
417+
this.validationResult = validationResult;
418+
}
419+
420+
public Transaction getTransaction() {
421+
return transaction;
422+
}
423+
424+
public ValidationResult<TransactionInvalidReason> getValidationResult() {
425+
return validationResult;
426+
}
427+
428+
@Override
429+
public boolean equals(final Object o) {
430+
if (this == o) {
431+
return true;
432+
}
433+
if (o == null || getClass() != o.getClass()) {
434+
return false;
435+
}
436+
TransactionValidationResult that = (TransactionValidationResult) o;
437+
return Objects.equals(transaction, that.transaction)
438+
&& Objects.equals(validationResult, that.validationResult);
439+
}
440+
441+
@Override
442+
public int hashCode() {
443+
return Objects.hash(transaction, validationResult);
444+
}
445+
}
446+
447+
public static class TransactionSelectionResults {
448+
449+
private final Map<TransactionType, List<Transaction>> transactionsByType = new HashMap<>();
450+
private final List<TransactionReceipt> receipts = Lists.newArrayList();
451+
private final List<TransactionValidationResult> invalidTransactions = Lists.newArrayList();
452+
private long cumulativeGasUsed = 0;
453+
private long cumulativeDataGasUsed = 0;
454+
455+
private void update(
456+
final Transaction transaction,
457+
final TransactionReceipt receipt,
458+
final long gasUsed,
459+
final long dataGasUsed) {
460+
transactionsByType
461+
.computeIfAbsent(transaction.getType(), type -> new ArrayList<>())
462+
.add(transaction);
463+
receipts.add(receipt);
464+
cumulativeGasUsed += gasUsed;
465+
cumulativeDataGasUsed += dataGasUsed;
466+
traceLambda(
467+
LOG,
468+
"New selected transaction {}, total transactions {}, cumulative gas used {}, cumulative data gas used {}",
469+
transaction::toTraceLog,
470+
() -> transactionsByType.values().stream().mapToInt(List::size).sum(),
471+
() -> cumulativeGasUsed,
472+
() -> cumulativeDataGasUsed);
473+
}
474+
475+
private void updateWithInvalidTransaction(
476+
final Transaction transaction,
477+
final ValidationResult<TransactionInvalidReason> validationResult) {
478+
invalidTransactions.add(new TransactionValidationResult(transaction, validationResult));
479+
}
480+
481+
public List<Transaction> getTransactions() {
482+
return streamAllTransactions().collect(Collectors.toList());
483+
}
484+
485+
public List<Transaction> getTransactionsByType(final TransactionType type) {
486+
return transactionsByType.getOrDefault(type, List.of());
487+
}
488+
489+
public List<TransactionReceipt> getReceipts() {
490+
return receipts;
491+
}
492+
493+
public long getCumulativeGasUsed() {
494+
return cumulativeGasUsed;
495+
}
496+
497+
public long getCumulativeDataGasUsed() {
498+
return cumulativeDataGasUsed;
499+
}
500+
501+
public List<TransactionValidationResult> getInvalidTransactions() {
502+
return invalidTransactions;
503+
}
504+
505+
private Stream<Transaction> streamAllTransactions() {
506+
return transactionsByType.values().stream().flatMap(List::stream);
507+
}
508+
509+
@Override
510+
public boolean equals(final Object o) {
511+
if (this == o) {
512+
return true;
513+
}
514+
if (o == null || getClass() != o.getClass()) {
515+
return false;
516+
}
517+
TransactionSelectionResults that = (TransactionSelectionResults) o;
518+
return cumulativeGasUsed == that.cumulativeGasUsed
519+
&& cumulativeDataGasUsed == that.cumulativeDataGasUsed
520+
&& transactionsByType.equals(that.transactionsByType)
521+
&& receipts.equals(that.receipts)
522+
&& invalidTransactions.equals(that.invalidTransactions);
523+
}
524+
525+
@Override
526+
public int hashCode() {
527+
return Objects.hash(
528+
transactionsByType,
529+
receipts,
530+
invalidTransactions,
531+
cumulativeGasUsed,
532+
cumulativeDataGasUsed);
533+
}
534+
535+
public String toTraceLog() {
536+
return "cumulativeGasUsed="
537+
+ cumulativeGasUsed
538+
+ ", cumulativeDataGasUsed="
539+
+ cumulativeDataGasUsed
540+
+ ", transactions="
541+
+ streamAllTransactions().map(Transaction::toTraceLog).collect(Collectors.joining("; "));
542+
}
543+
}
528544
}

0 commit comments

Comments
 (0)