/// <inheritdoc/> public override void PutBlock <T>(Block <T> block) { if (_blockCache.ContainsKey(block.Hash)) { return; } byte[] key = BlockKey(block.Hash); if (!(_blockDb.Get(key) is null)) { return; } foreach (Transaction <T> tx in block.Transactions) { PutTransaction(tx); } BlockDigest digest = BlockDigest.FromBlock(block); byte[] value = digest.Serialize(); _blockDb.Put(key, value); _blockCache.AddOrUpdate(block.Hash, digest); }
/// <inheritdoc/> public override void PutBlock <T>(Block <T> block) { if (_blockCache.ContainsKey(block.Hash)) { return; } byte[] key = BlockKey(block.Hash); if (!(_blockIndexDb.Get(key) is null)) { return; } long timestamp = block.Timestamp.ToUnixTimeSeconds(); foreach (Transaction <T> tx in block.Transactions) { PutTransaction(tx); } _rwBlockLock.EnterWriteLock(); try { string blockDbName = $"epoch{timestamp / _blockEpochUnitSeconds}"; RocksDb blockDb; lock (_blockDbCache) { if (!_blockDbCache.TryGetValue(blockDbName, out blockDb)) { blockDb = RocksDBUtils.OpenRocksDb(_options, BlockDbPath(blockDbName)); _blockDbCache.AddOrUpdate(blockDbName, blockDb); } } BlockDigest digest = BlockDigest.FromBlock(block); byte[] value = digest.Serialize(); blockDb.Put(key, value); _blockIndexDb.Put(key, RocksDBStoreBitConverter.GetBytes(blockDbName)); _blockCache.AddOrUpdate(block.Hash, digest); } catch (Exception e) { LogUnexpectedException(nameof(PutBlock), e); } finally { _rwBlockLock.ExitWriteLock(); } }
public void PutBlock <T>(Block <T> block) where T : IAction, new() { if (_blockCache.ContainsKey(block.Hash)) { return; } _store.PutBlock(block); foreach (var tx in block.Transactions) { PutTransaction(tx); StoreTxReferences(tx.Id, block.Hash, block.Index); } _blockCache.AddOrUpdate(block.Hash, BlockDigest.FromBlock(block)); }