-
Notifications
You must be signed in to change notification settings - Fork 861
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Signed-off-by: garyschulte <[email protected]>
- Loading branch information
1 parent
b3b33da
commit 448d4ea
Showing
5 changed files
with
145 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
52 changes: 52 additions & 0 deletions
52
...m/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/feemarket/PragueFeeMarket.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
/* | ||
* Copyright contributors to Besu. | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with | ||
* the License. You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | ||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | ||
* specific language governing permissions and limitations under the License. | ||
* | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
package org.hyperledger.besu.ethereum.mainnet.feemarket; | ||
|
||
import org.hyperledger.besu.datatypes.BlobGas; | ||
import org.hyperledger.besu.datatypes.Wei; | ||
|
||
import java.math.BigInteger; | ||
import java.util.Optional; | ||
|
||
import org.slf4j.Logger; | ||
import org.slf4j.LoggerFactory; | ||
|
||
public class PragueFeeMarket extends CancunFeeMarket { | ||
private static final BigInteger BLOB_BASE_FEE_UPDATE_FRACTION_ELECTRA = | ||
BigInteger.valueOf(5007716); | ||
private static final Logger LOG = LoggerFactory.getLogger(PragueFeeMarket.class); | ||
|
||
public PragueFeeMarket( | ||
final long londonForkBlockNumber, final Optional<Wei> baseFeePerGasOverride) { | ||
super(londonForkBlockNumber, baseFeePerGasOverride); | ||
} | ||
|
||
@Override | ||
public Wei blobGasPricePerGas(final BlobGas excessBlobGas) { | ||
final var blobGasPrice = | ||
Wei.of( | ||
fakeExponential( | ||
BLOB_GAS_PRICE, | ||
excessBlobGas.toBigInteger(), | ||
BLOB_BASE_FEE_UPDATE_FRACTION_ELECTRA)); | ||
LOG.atTrace() | ||
.setMessage("parentExcessBlobGas: {} blobGasPrice: {}") | ||
.addArgument(excessBlobGas::toShortHexString) | ||
.addArgument(blobGasPrice::toHexString) | ||
.log(); | ||
|
||
return blobGasPrice; | ||
} | ||
} |
73 changes: 73 additions & 0 deletions
73
...re/src/test/java/org/hyperledger/besu/ethereum/mainnet/feemarket/PragueFeeMarketTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
/* | ||
* Copyright contributors to Hyperledger Besu. | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with | ||
* the License. You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | ||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | ||
* specific language governing permissions and limitations under the License. | ||
* | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
package org.hyperledger.besu.ethereum.mainnet.feemarket; | ||
|
||
import static org.junit.jupiter.api.Assertions.assertEquals; | ||
|
||
import org.hyperledger.besu.datatypes.BlobGas; | ||
|
||
import java.util.ArrayList; | ||
import java.util.List; | ||
import java.util.Optional; | ||
|
||
import org.junit.jupiter.api.Test; | ||
|
||
class PragueFeeMarketTest { | ||
|
||
private static final int BLOB_GAS_PER_BLOB = 131072; | ||
|
||
/** | ||
* from: https://eips.ethereum.org/EIPS/eip-7691 The BLOB_BASE_FEE_UPDATE_FRACTION_PRAGUE value in | ||
* this EIP is chosen as the mid-point between keeping the responsiveness to full blobs and no | ||
* blobs constant: | ||
* | ||
* <p>full blobs: basefee increases by ~8.2% no blobs: basefee decreases by ~14.5% | ||
*/ | ||
@Test | ||
void dataPricePerGas() { | ||
PragueFeeMarket pragueFeeMarket = new PragueFeeMarket(0, Optional.empty()); | ||
// when no excess blob gas, data price per gas is 1 | ||
assertEquals(1, pragueFeeMarket.blobGasPricePerGas(BlobGas.ZERO).getAsBigInteger().intValue()); | ||
|
||
record BlobGasPricing(long excess, long price) {} | ||
List<BlobGasPricing> testVector = new ArrayList<>(); | ||
|
||
int numBlobs = 1; | ||
long price = 1; | ||
while (price <= 1000) { | ||
price = blobGasPrice(BlobGas.of(numBlobs * BLOB_GAS_PER_BLOB)); | ||
var testCase = new BlobGasPricing(numBlobs * BLOB_GAS_PER_BLOB, price); | ||
testVector.add(testCase); | ||
numBlobs++; | ||
} | ||
|
||
testVector.stream() | ||
.forEach( | ||
blobGasPricing -> { | ||
assertEquals( | ||
blobGasPricing.price, | ||
pragueFeeMarket | ||
.blobGasPricePerGas(BlobGas.of(blobGasPricing.excess)) | ||
.getAsBigInteger() | ||
.intValue()); | ||
}); | ||
} | ||
|
||
private long blobGasPrice(final BlobGas excess) { | ||
double dgufDenominator = 5007716; | ||
double fakeExpo = excess.getValue().longValue() / dgufDenominator; | ||
return (long) (1 * Math.exp(fakeExpo)); | ||
} | ||
} |