From b327bbd4695008bfc2bd93609cf90d98a9f368b5 Mon Sep 17 00:00:00 2001 From: CodingEnthusiast Date: Thu, 8 Aug 2024 13:55:22 +0330 Subject: [PATCH] Add new properties to IChain --- Src/Autarkysoft.Bitcoin/Blockchain/Chain.cs | 15 +++++++++++++++ Src/Autarkysoft.Bitcoin/Blockchain/IChain.cs | 12 ++++++++++++ Src/Tests/Bitcoin/Blockchain/MockChain.cs | 14 ++++++++++++++ 3 files changed, 41 insertions(+) diff --git a/Src/Autarkysoft.Bitcoin/Blockchain/Chain.cs b/Src/Autarkysoft.Bitcoin/Blockchain/Chain.cs index 2694e91..1741200 100644 --- a/Src/Autarkysoft.Bitcoin/Blockchain/Chain.cs +++ b/Src/Autarkysoft.Bitcoin/Blockchain/Chain.cs @@ -115,6 +115,8 @@ public Chain(IFileManager fileMan, IBlockVerifier blockVerifier, IConsensus c, I public IClientTime Time { get; } /// public int Height { get; private set; } + /// + public int HeaderCount => headerList.Count; private BlockchainState _state = BlockchainState.None; /// @@ -141,6 +143,11 @@ public BlockchainState State /// public Digest256 Tip { get; private set; } + /// + public BlockHeader LastHeader => headerList[^1]; + + /// + public event EventHandler NewHeaderEvent; /// public event EventHandler HeaderSyncEndEvent; /// @@ -597,11 +604,19 @@ public bool ProcessHeaders(BlockHeader[] headers, INodeStatus nodeStatus) { AppendHeadrs(headers.AsSpan().Slice(arrIndex, count).ToArray(), count); nodeStatus.AddBigViolation(); + if (count != 0) + { + NewHeaderEvent?.Invoke(this, EventArgs.Empty); + } return false; } } AppendHeadrs(headers.AsSpan()[arrIndex..].ToArray(), count); + if (count != 0) + { + NewHeaderEvent?.Invoke(this, EventArgs.Empty); + } return true; } diff --git a/Src/Autarkysoft.Bitcoin/Blockchain/IChain.cs b/Src/Autarkysoft.Bitcoin/Blockchain/IChain.cs index cab065e..8c4a251 100644 --- a/Src/Autarkysoft.Bitcoin/Blockchain/IChain.cs +++ b/Src/Autarkysoft.Bitcoin/Blockchain/IChain.cs @@ -22,14 +22,26 @@ public interface IChain /// int Height { get; } /// + /// Returns number of headers (should be higher than or equal to ) + /// + int HeaderCount { get; } + /// /// Hash of the last block in the chain /// Digest256 Tip { get; } /// + /// Returns last header + /// + BlockHeader LastHeader { get; } + /// /// Gets or sets the current blockchain state /// public BlockchainState State { get; set; } /// + /// An event to be raised when a new block header is received (useful for UI updates, miner, etc). + /// + event EventHandler NewHeaderEvent; + /// /// An event to be raised when the initial header sync is over (signals start of adding new nodes, /// downloading missing blocks, etc). /// diff --git a/Src/Tests/Bitcoin/Blockchain/MockChain.cs b/Src/Tests/Bitcoin/Blockchain/MockChain.cs index 655ff2f..e94e405 100644 --- a/Src/Tests/Bitcoin/Blockchain/MockChain.cs +++ b/Src/Tests/Bitcoin/Blockchain/MockChain.cs @@ -37,6 +37,7 @@ public BlockchainState State } } + public event EventHandler NewHeaderEvent; public event EventHandler HeaderSyncEndEvent; public event EventHandler BlockSyncEndEvent; @@ -50,9 +51,22 @@ public int Height } } + internal int _hdrCount = -1; + public int HeaderCount + { + get + { + Assert.True(_hdrCount != -1, UnexpectedCall); + return _hdrCount; + } + } + internal Digest256 _tip; public Digest256 Tip => _tip; + internal BlockHeader _lastHdr; + public BlockHeader LastHeader => _lastHdr; + internal Target? targetToReturn; public Target GetNextTarget(in BlockHeader hdr) {