public void HandleHeadersPacket(NodeConnection node, byte[] payload)
{
MemoryStream stream = new MemoryStream(payload);
BinaryReader br = new BinaryReader(stream);
List <BlockHeader> headers = new List <BlockHeader>();
ulong count = Program.ReadVarInt(br);
if (count == 0)
{
mPullingHeaders = false;
return;
}
for (ulong i = 0; i < count; i++)
{
uint version = br.ReadUInt32();
byte[] prevBlock = br.ReadBytes(32);
byte[] merkle = br.ReadBytes(32);
uint time = br.ReadUInt32();
uint bits = br.ReadUInt32();
uint nonce = br.ReadUInt32();
ulong txn = Program.ReadVarInt(br);
if (!mIgnoreSigLen)
{
ulong siglen = Program.ReadVarInt(br);
}
BlockHeader header = new BlockHeader(version, prevBlock, merkle, time, bits, nonce);
if (headers.Count > 0)
{
headers[headers.Count - 1].mHash = prevBlock;
}
headers.Add(header);
}
br.Close();
if (headers[0].mHash != null)
{
headers[0].ValidateHash();
}
mBlockLock.WaitOne();
foreach (BlockHeader h in headers)
{
Block b = new Block();
b.mHeader = h;
if (b.mHeader.mHash == null)
{
b.mHeader.ComputeHash(mScryptBlockHash);
}
b.mHash = Program.HashToString(b.mHeader.mHash);
mBlocks.Add(b);
}
mCurrentHeight += (uint)headers.Count;
if (count < 2000)
{
// End of the list
// Remove all blocks that are older than we care about
RemoveOldBlocks();
// If we want transaction data, request the full blocks
if (mWantsTransactionData)
{
headers.Clear();
mBlockLock.WaitOne();
foreach (Block b in mBlocks)
{
if (b.mTransactions.Count < 1)
{
headers.Add(b.mHeader);
}
}
mBlockLock.ReleaseMutex();
node.RequestBlocks(headers.ToArray());
}
mPullingHeaders = false;
}
else
{
// Request again til we get all of them
node.RequestHeaders(mBlocks[mBlocks.Count - 1].mHeader.mHash);
}
mBlockLock.ReleaseMutex();
Console.WriteLine("Blocks: " + mCurrentHeight);
}