public BaselineTree CreateHistoricalTree(Address address, long blockNumber) { if (_logger.IsWarn) { _logger.Warn($"Building historical tree at {address} for block {blockNumber}"); } var readOnlyMain = new ReadOnlyDb(_mainDb, true); var readOnlyMetadata = new ReadOnlyDb(_metadataBaselineDb, true); var historicalTree = new ShaBaselineTree(readOnlyMain, readOnlyMetadata, address.Bytes, BaselineModule.TruncationLength, _logger); var endIndex = historicalTree.Count; var historicalCount = historicalTree.GetBlockCount(blockNumber); if (_logger.IsWarn) { _logger.Warn($"Historical count of {historicalTree} for block {blockNumber} is {historicalCount}"); } if (endIndex - historicalCount > 0) { if (_logger.IsWarn) { _logger.Warn($"Deleting {endIndex - historicalCount} from {historicalTree}"); } historicalTree.Delete(endIndex - historicalCount, false); historicalTree.CalculateHashes(historicalCount, endIndex); if (_logger.IsWarn) { _logger.Warn($"After deleting from {historicalTree} root is {historicalTree.Root}"); } } return(historicalTree); }
public BaselineTree RebuildEntireTree(Address treeAddress, Keccak blockHash) { if (_logger.IsWarn) { _logger.Warn($"Rebuilding entire tree from {treeAddress} at {blockHash}"); } BaselineTree baselineTree = new ShaBaselineTree(_mainDb, _metadataBaselineDb, treeAddress.Bytes, BaselineModule.TruncationLength, _logger); var trie = BuildTree(baselineTree, treeAddress, new BlockParameter(0L), new BlockParameter(blockHash)); return(trie); }