Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Verkle/unittests #26

Open
wants to merge 59 commits into
base: verkle/bandersnatch
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
bad01fa
remove parallization
tanishqjasoria Jan 11, 2023
6cbec48
update EVM tests to use verkle state
tanishqjasoria Jan 11, 2023
fc33682
update state interfaces
tanishqjasoria Jan 11, 2023
53cd3de
update init steps
tanishqjasoria Jan 11, 2023
84a5b1e
fix setting state
tanishqjasoria Jan 12, 2023
9f0ec08
update init steps for verkle tree
tanishqjasoria Jan 12, 2023
cd386d6
update
tanishqjasoria Jan 12, 2023
865c5ee
refactor
tanishqjasoria Jan 12, 2023
6c30304
refactor interfaces
tanishqjasoria Jan 12, 2023
eeb77b0
add condrieu config files - to test
tanishqjasoria Jan 12, 2023
2df1f33
make client to sync using verkle tree
tanishqjasoria Jan 13, 2023
c9134f1
new trie interfaces
tanishqjasoria Jan 15, 2023
c95953c
test state store
tanishqjasoria Jan 16, 2023
4200025
update ethHash to nethDev
tanishqjasoria Jan 16, 2023
23b8054
updates
tanishqjasoria Jan 16, 2023
8ded96a
Merge pull request #27 from tanishqjasoria/verkle/structure-refactor
tanishqjasoria Jan 16, 2023
bf685bd
update tests
tanishqjasoria Jan 16, 2023
93d4fa4
refactor database and history store
tanishqjasoria Jan 17, 2023
5f0ab9e
add another layer of cache in tree
tanishqjasoria Jan 17, 2023
40c552b
fix running evm tests for verkle trees
tanishqjasoria Jan 20, 2023
5a89b6f
upgrade packages
tanishqjasoria Jan 20, 2023
e8b394d
fix errors
tanishqjasoria Jan 20, 2023
6d807cf
Revert "upgrade packages"
tanishqjasoria Jan 21, 2023
619b319
upgrade verkle package
tanishqjasoria Jan 21, 2023
8a836ca
modify VerkleWitness - fix gas cost calculation
tanishqjasoria Jan 26, 2023
13a2faa
update gas costs for verkle trees
tanishqjasoria Jan 26, 2023
098781f
modifications for testnet
tanishqjasoria Jan 29, 2023
3f930fe
update packages
tanishqjasoria Jan 29, 2023
fdbc9e0
update for testnet
tanishqjasoria Jan 30, 2023
2c47deb
dont use destroy lists for verkle trees
tanishqjasoria Jan 30, 2023
e5fc2fa
add proof collector
tanishqjasoria Jan 30, 2023
7548ae5
Add verkle tree dumper
tanishqjasoria Jan 30, 2023
905d19f
add verkle proofs
tanishqjasoria Feb 3, 2023
e4866ac
add verkle verifier
tanishqjasoria Feb 4, 2023
1f2834c
rename
tanishqjasoria Feb 4, 2023
bd95d32
update proofs
tanishqjasoria Feb 6, 2023
e845014
sort the openings in correct order
tanishqjasoria Feb 6, 2023
15114d8
update proof encoding
tanishqjasoria Feb 6, 2023
259df94
update - fix proof
tanishqjasoria Feb 7, 2023
422499d
fix
tanishqjasoria Feb 8, 2023
540b38e
add beverly hills testnet
tanishqjasoria Feb 8, 2023
3a7425d
update genesis
tanishqjasoria Feb 8, 2023
ace0bdc
refactor
tanishqjasoria Feb 9, 2023
fed823d
refactor
tanishqjasoria Feb 9, 2023
07025ab
fix tests
tanishqjasoria Feb 9, 2023
b6bb90e
update beverkly hills
tanishqjasoria Feb 16, 2023
08e4b97
Remove verkle proofs and state in block hash
tanishqjasoria Feb 16, 2023
d7234a1
dont add proof and pre/post state to header hash
tanishqjasoria Feb 16, 2023
8f7c4e0
fix stem node calculation
tanishqjasoria Feb 16, 2023
a9e413d
Add logs
tanishqjasoria Feb 16, 2023
50434f2
remove extra data
tanishqjasoria Feb 17, 2023
721a5f0
print values in debug
tanishqjasoria Feb 17, 2023
7bffba0
fix verkle witness
tanishqjasoria Feb 17, 2023
8daac81
update temp
tanishqjasoria Feb 17, 2023
6a6c25b
modify to update gas changes
tanishqjasoria Feb 19, 2023
2b0b23d
optimize verkle witness
tanishqjasoria Feb 19, 2023
b0727d9
fix code chunk calculation
tanishqjasoria Feb 19, 2023
2ea99bb
update gas access for PUSH1 and SSTORE
tanishqjasoria Feb 20, 2023
bf1db99
temp change
tanishqjasoria Feb 20, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
886 changes: 886 additions & 0 deletions src/Nethermind/Chains/beverlyhills.json

Large diffs are not rendered by default.

114 changes: 114 additions & 0 deletions src/Nethermind/Chains/condrieu.json

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@

namespace Nethermind.AccountAbstraction.Test
{
[TestFixture]
[TestFixture(VirtualMachineTestsStateProvider.MerkleTrie)]
[TestFixture(VirtualMachineTestsStateProvider.VerkleTrie)]
public class UserOperationTracerTests : VirtualMachineTestsBase
{
[TestCase(Instruction.GASPRICE, false)]
Expand Down Expand Up @@ -246,5 +247,8 @@ public void Should_allow_gas_only_if_followed_by_call(Instruction instruction, b
}

protected override long BlockNumber { get; } = MainnetSpecProvider.LondonBlockNumber;
public UserOperationTracerTests(VirtualMachineTestsStateProvider stateProvider) : base(stateProvider)
{
}
}
}
4 changes: 4 additions & 0 deletions src/Nethermind/Nethermind.Api/IApiWithBlockchain.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
using Nethermind.State;
using Nethermind.Trie.Pruning;
using Nethermind.TxPool;
using Nethermind.Verkle;
using Nethermind.Verkle.Tree;

namespace Nethermind.Api
{
Expand All @@ -42,6 +44,8 @@ public interface IApiWithBlockchain : IApiWithStores, IBlockchainBridgeFactory
IUnclesValidator? UnclesValidator { get; set; }
IHeaderValidator? HeaderValidator { get; set; }
IManualBlockProductionTrigger ManualBlockProductionTrigger { get; }
VerkleStateStore VerkleTrieStore { get; set; }
ReadOnlyVerkleStateStore ReadOnlyVerkleTrieStore { get; set; }
IReadOnlyTrieStore? ReadOnlyTrieStore { get; set; }
IRewardCalculatorSource? RewardCalculatorSource { get; set; }
ISealer? Sealer { get; set; }
Expand Down
18 changes: 16 additions & 2 deletions src/Nethermind/Nethermind.Api/NethermindApi.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@
using Nethermind.State.Snap;
using Nethermind.Synchronization.SnapSync;
using Nethermind.Synchronization.Blocks;
using Nethermind.Verkle;
using Nethermind.Verkle.Tree;

namespace Nethermind.Api
{
Expand All @@ -74,9 +76,19 @@ public IBlockchainBridge CreateBlockchainBridge()
{
ReadOnlyBlockTree readOnlyTree = BlockTree.AsReadOnly();
LazyInitializer.EnsureInitialized(ref _readOnlyDbProvider, () => new ReadOnlyDbProvider(DbProvider, false));
IReadOnlyTxProcessorSourceExt readOnlyTxProcessingEnv;
switch (SpecProvider.GenesisSpec.VerkleTreeEnabled)
{
case true:
// TODO: reuse the same trie cache here
readOnlyTxProcessingEnv = new ReadOnlyTxProcessingEnv(_readOnlyDbProvider, ReadOnlyVerkleTrieStore, readOnlyTree, SpecProvider, LogManager);
break;
case false:
// TODO: reuse the same trie cache here
readOnlyTxProcessingEnv = new ReadOnlyTxProcessingEnv(_readOnlyDbProvider, ReadOnlyTrieStore, readOnlyTree, SpecProvider, LogManager);
break;
}

// TODO: reuse the same trie cache here
IReadOnlyTxProcessorSourceExt readOnlyTxProcessingEnv = new ReadOnlyTxProcessingEnv(_readOnlyDbProvider, ReadOnlyTrieStore, readOnlyTree, SpecProvider, LogManager);

IMiningConfig miningConfig = ConfigProvider.GetConfig<IMiningConfig>();
IBlocksConfig blocksConfig = ConfigProvider.GetConfig<IBlocksConfig>();
Expand Down Expand Up @@ -126,6 +138,8 @@ public IBlockchainBridge CreateBlockchainBridge()

public IManualBlockProductionTrigger ManualBlockProductionTrigger { get; set; } =
new BuildBlocksWhenRequested();
public VerkleStateStore VerkleTrieStore { get; set; }
public ReadOnlyVerkleStateStore ReadOnlyVerkleTrieStore { get; set; }

public IIPResolver? IpResolver { get; set; }
public IJsonSerializer EthereumJsonSerializer { get; set; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,5 +108,88 @@ public void Test()
autoResetEvent.WaitOne(1000).Should().BeTrue("1");
blockTree.Head.Number.Should().Be(1);
}

[Test]
public void TestVerkle()
{
ISpecProvider specProvider = MainnetSpecProvider.Instance;
DbProvider dbProvider = new(DbModeHint.Mem);
dbProvider.RegisterDb(DbNames.BlockInfos, new MemDb());
dbProvider.RegisterDb(DbNames.Blocks, new MemDb());
dbProvider.RegisterDb(DbNames.Headers, new MemDb());
dbProvider.RegisterDb(DbNames.State, new MemDb());
dbProvider.RegisterDb(DbNames.Code, new MemDb());
dbProvider.RegisterDb(DbNames.Metadata, new MemDb());
dbProvider.RegisterDb(DbNames.Leaf, new MemDb());
dbProvider.RegisterDb(DbNames.Branch, new MemDb());
dbProvider.RegisterDb(DbNames.Stem, new MemDb());
dbProvider.RegisterDb(DbNames.ForwardDiff, new MemDb());
dbProvider.RegisterDb(DbNames.ReverseDiff, new MemDb());
dbProvider.RegisterDb(DbNames.StateRootToBlock, new MemDb());

BlockTree blockTree = new(
dbProvider,
new ChainLevelInfoRepository(dbProvider),
specProvider,
NullBloomStorage.Instance,
LimboLogs.Instance);
VerkleStateTree stateTree = new VerkleStateTree(dbProvider);
VerkleStateReader stateReader = new(stateTree, dbProvider.GetDb<IDb>(DbNames.Code), LimboLogs.Instance);
VerkleWorldState worldState = new VerkleWorldState(stateTree, dbProvider.RegisteredDbs[DbNames.Code], LimboLogs.Instance);
BlockhashProvider blockhashProvider = new(blockTree, LimboLogs.Instance);
VirtualMachine virtualMachine = new(
blockhashProvider,
specProvider,
LimboLogs.Instance);
TransactionProcessor txProcessor = new(
specProvider,
worldState,
virtualMachine,
LimboLogs.Instance);
BlockProcessor blockProcessor = new(
specProvider,
Always.Valid,
NoBlockRewards.Instance,
new BlockProcessor.BlockValidationTransactionsExecutor(txProcessor, new VerkleWorldState(stateTree, dbProvider.RegisteredDbs[DbNames.Code], LimboLogs.Instance)),
worldState,
NullReceiptStorage.Instance,
NullWitnessCollector.Instance,
LimboLogs.Instance);
BlockchainProcessor blockchainProcessor = new(
blockTree,
blockProcessor,
NullRecoveryStep.Instance,
stateReader,
LimboLogs.Instance,
BlockchainProcessor.Options.Default);
BuildBlocksWhenRequested trigger = new();
ManualTimestamper timestamper = new ManualTimestamper();
DevBlockProducer devBlockProducer = new(
EmptyTxSource.Instance,
blockchainProcessor,
worldState,
blockTree,
trigger,
timestamper,
specProvider,
new BlocksConfig(),
LimboLogs.Instance);

blockchainProcessor.Start();
devBlockProducer.Start();
ProducedBlockSuggester suggester = new ProducedBlockSuggester(blockTree, devBlockProducer);

AutoResetEvent autoResetEvent = new(false);

blockTree.NewHeadBlock += (s, e) => autoResetEvent.Set();
blockTree.SuggestBlock(Build.A.Block.Genesis.TestObject);

autoResetEvent.WaitOne(1000).Should().BeTrue("genesis");

trigger.BuildBlock();
autoResetEvent.WaitOne(1000).Should().BeTrue("1");
blockTree.Head.Number.Should().Be(1);
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -155,9 +155,7 @@ public void Proper_transactions_selected(ProperTransactionsSelectedTestCase test
MemDb stateDb = new();
MemDb codeDb = new();
TrieStore trieStore = new(stateDb, LimboLogs.Instance);
StateProvider stateProvider = new(trieStore, codeDb, LimboLogs.Instance);
StateReader stateReader =
new(new TrieStore(stateDb, LimboLogs.Instance), codeDb, LimboLogs.Instance);
IWorldState stateProvider = new WorldState(trieStore, codeDb, LimboLogs.Instance);
ISpecProvider specProvider = Substitute.For<ISpecProvider>();

void SetAccountStates(IEnumerable<Address> missingAddresses)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,11 @@ namespace Nethermind.Blockchain
/// </summary>
public class TrieStoreBoundaryWatcher : IDisposable
{
private readonly ITrieStore _trieStore;
private readonly IStoreWithReorgBoundary _trieStore;
private readonly IBlockTree _blockTree;
private readonly ILogger _logger;

public TrieStoreBoundaryWatcher(ITrieStore trieStore, IBlockTree blockTree, ILogManager logManager)
public TrieStoreBoundaryWatcher(IStoreWithReorgBoundary trieStore, IBlockTree blockTree, ILogManager logManager)
{
_trieStore = trieStore;
_blockTree = blockTree;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public EthashDifficultyCalculator(ISpecProvider specProvider)
_specProvider = specProvider;
}

private const long OfGenesisBlock = 131_072;
private const long OfGenesisBlock = 5000;

public UInt256 Calculate(BlockHeader header, BlockHeader parent) =>
Calculate(parent.Difficulty,
Expand Down
8 changes: 3 additions & 5 deletions src/Nethermind/Nethermind.Consensus.Ethash/NethDevPlugin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ public Task<IBlockProducer> InitBlockProducer(IBlockProductionTrigger? blockProd
if (logger.IsWarn) logger.Warn("Starting Neth Dev block producer & sealer");


IReadOnlyTxProcessorSource producerEnv = new ReadOnlyTxProcessingEnv(readOnlyDbProvider, getFromApi.ReadOnlyTrieStore, readOnlyBlockTree, getFromApi.SpecProvider, getFromApi.LogManager);
IReadOnlyTxProcessorSource producerEnv = new ReadOnlyTxProcessingEnv(readOnlyDbProvider, getFromApi.ReadOnlyVerkleTrieStore, readOnlyBlockTree, getFromApi.SpecProvider, getFromApi.LogManager);

BlockProcessor producerProcessor = new(
getFromApi!.SpecProvider,
Expand All @@ -85,16 +85,14 @@ public Task<IBlockProducer> InitBlockProducer(IBlockProductionTrigger? blockProd
getFromApi.LogManager,
BlockchainProcessor.Options.NoReceipts);

DefaultBlockProductionTrigger = new BuildBlocksRegularly(TimeSpan.FromMilliseconds(200))
.IfPoolIsNotEmpty(getFromApi.TxPool)
.Or(getFromApi.ManualBlockProductionTrigger);
DefaultBlockProductionTrigger = getFromApi.ManualBlockProductionTrigger;

IBlockProducer blockProducer = new DevBlockProducer(
additionalTxSource.Then(txPoolTxSource).ServeTxsOneByOne(),
producerChainProcessor,
producerEnv.WorldState,
getFromApi.BlockTree,
blockProductionTrigger ?? DefaultBlockProductionTrigger,
DefaultBlockProductionTrigger,
getFromApi.Timestamper,
getFromApi.SpecProvider,
getFromApi.Config<IBlocksConfig>(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
using Nethermind.Logging;
using Nethermind.State;
using Nethermind.Trie.Pruning;
using Nethermind.Verkle;
using Nethermind.Verkle.Tree;

// ReSharper disable MemberCanBePrivate.Global
// ReSharper disable UnusedAutoPropertyAccessor.Global
Expand All @@ -36,6 +38,16 @@ public ReadOnlyTxProcessingEnv(
{
}

public ReadOnlyTxProcessingEnv(
IDbProvider? dbProvider,
ReadOnlyVerkleStateStore? trieStore,
IBlockTree? blockTree,
ISpecProvider? specProvider,
ILogManager? logManager)
: this(dbProvider?.AsReadOnly(false), trieStore, blockTree?.AsReadOnly(), specProvider, logManager)
{
}

public ReadOnlyTxProcessingEnv(
IReadOnlyDbProvider? readOnlyDbProvider,
IReadOnlyTrieStore? readOnlyTrieStore,
Expand All @@ -57,6 +69,27 @@ public ReadOnlyTxProcessingEnv(
TransactionProcessor = new TransactionProcessor(specProvider, WorldState, Machine, logManager);
}

public ReadOnlyTxProcessingEnv(
IReadOnlyDbProvider? readOnlyDbProvider,
ReadOnlyVerkleStateStore? readOnlyTrieStore,
IReadOnlyBlockTree? readOnlyBlockTree,
ISpecProvider? specProvider,
ILogManager? logManager)
{
if (specProvider is null) throw new ArgumentNullException(nameof(specProvider));

ReadOnlyDb codeDb = readOnlyDbProvider.CodeDb.AsReadOnly(true);

StateReader = new VerkleStateReader(new VerkleStateTree(readOnlyTrieStore), codeDb, logManager);
WorldState = new VerkleWorldState(new VerkleStateTree(readOnlyTrieStore), codeDb, logManager);

BlockTree = readOnlyBlockTree ?? throw new ArgumentNullException(nameof(readOnlyBlockTree));
BlockhashProvider = new BlockhashProvider(BlockTree, logManager);

Machine = new VirtualMachine(BlockhashProvider, specProvider, logManager);
TransactionProcessor = new TransactionProcessor(specProvider, WorldState, Machine, logManager);
}

public IReadOnlyTransactionProcessor Build(Keccak stateRoot) => new ReadOnlyTransactionProcessor(TransactionProcessor, WorldState, stateRoot);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -233,7 +233,7 @@ protected bool TrySetState(Keccak? parentStateRoot)
{
bool HasState(Keccak stateRoot)
{
RootCheckVisitor visitor = new();
RootCheckVisitor visitor = new RootCheckVisitor();
StateProvider.Accept(visitor, stateRoot);
return visitor.HasRoot;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited
// SPDX-License-Identifier: LGPL-3.0-only

using System;
using Nethermind.Blockchain;
using Nethermind.Blockchain.Receipts;
using Nethermind.Config;
Expand All @@ -16,6 +17,8 @@
using Nethermind.State;
using Nethermind.Trie.Pruning;
using Nethermind.TxPool;
using Nethermind.Verkle;
using Nethermind.Verkle.Tree;

namespace Nethermind.Consensus.Producers
{
Expand All @@ -24,6 +27,7 @@ public class BlockProducerEnvFactory : IBlockProducerEnvFactory
protected readonly IDbProvider _dbProvider;
protected readonly IBlockTree _blockTree;
protected readonly IReadOnlyTrieStore _readOnlyTrieStore;
protected readonly ReadOnlyVerkleStateStore _readOnlyVerkleTrieStore;
protected readonly ISpecProvider _specProvider;
protected readonly IBlockValidator _blockValidator;
protected readonly IRewardCalculatorSource _rewardCalculatorSource;
Expand All @@ -33,6 +37,7 @@ public class BlockProducerEnvFactory : IBlockProducerEnvFactory
protected readonly ITransactionComparerProvider _transactionComparerProvider;
protected readonly IBlocksConfig _blocksConfig;
protected readonly ILogManager _logManager;
protected readonly TreeType _treeType;

public IBlockTransactionsExecutorFactory TransactionsExecutorFactory { get; set; }

Expand Down Expand Up @@ -62,6 +67,38 @@ public BlockProducerEnvFactory(
_transactionComparerProvider = transactionComparerProvider;
_blocksConfig = blocksConfig;
_logManager = logManager;
_treeType = TreeType.MerkleTree;

TransactionsExecutorFactory = new BlockProducerTransactionsExecutorFactory(specProvider, logManager);
}

public BlockProducerEnvFactory(
IDbProvider dbProvider,
IBlockTree blockTree,
ReadOnlyVerkleStateStore readOnlyTrieStore,
ISpecProvider specProvider,
IBlockValidator blockValidator,
IRewardCalculatorSource rewardCalculatorSource,
IReceiptStorage receiptStorage,
IBlockPreprocessorStep blockPreprocessorStep,
ITxPool txPool,
ITransactionComparerProvider transactionComparerProvider,
IBlocksConfig blocksConfig,
ILogManager logManager)
{
_dbProvider = dbProvider;
_blockTree = blockTree;
_readOnlyVerkleTrieStore = readOnlyTrieStore;
_specProvider = specProvider;
_blockValidator = blockValidator;
_rewardCalculatorSource = rewardCalculatorSource;
_receiptStorage = receiptStorage;
_blockPreprocessorStep = blockPreprocessorStep;
_txPool = txPool;
_transactionComparerProvider = transactionComparerProvider;
_blocksConfig = blocksConfig;
_logManager = logManager;
_treeType = TreeType.VerkleTree;

TransactionsExecutorFactory = new BlockProducerTransactionsExecutorFactory(specProvider, logManager);
}
Expand Down Expand Up @@ -106,8 +143,16 @@ public virtual BlockProducerEnv Create(ITxSource? additionalTxSource = null)
};
}

protected virtual IReadOnlyTxProcessorSource CreateReadonlyTxProcessingEnv(ReadOnlyDbProvider readOnlyDbProvider, ReadOnlyBlockTree readOnlyBlockTree) =>
new ReadOnlyTxProcessingEnv(readOnlyDbProvider, _readOnlyTrieStore, readOnlyBlockTree, _specProvider, _logManager);
protected virtual IReadOnlyTxProcessorSource CreateReadonlyTxProcessingEnv(ReadOnlyDbProvider readOnlyDbProvider, ReadOnlyBlockTree readOnlyBlockTree)
{
return _treeType switch
{
TreeType.MerkleTree => new ReadOnlyTxProcessingEnv(readOnlyDbProvider, _readOnlyTrieStore, readOnlyBlockTree, _specProvider, _logManager),
TreeType.VerkleTree => new ReadOnlyTxProcessingEnv(readOnlyDbProvider, _readOnlyVerkleTrieStore, readOnlyBlockTree, _specProvider, _logManager),
_ => throw new ArgumentOutOfRangeException()
};
}


protected virtual ITxSource CreateTxSourceForProducer(
ITxSource? additionalTxSource,
Expand Down
Loading