HashrateCalculator.NodeConnection.RequestBlocks C# (CSharp) Method

RequestBlocks() public method

public RequestBlocks ( BlockHeader headers ) : void
headers BlockHeader
return void
        public void RequestBlocks(BlockHeader[] headers)
        {
            MemoryStream stream = new MemoryStream();
            BinaryWriter bw = new BinaryWriter(stream);

            int count = headers.Length;
            Program.WriteVarInt(bw, (ulong)count);
            foreach (BlockHeader b in headers)
            {
                const int blockType = 2;
                bw.Write(blockType);
                bw.Write(b.mHash);
            }
            SendPacket("getdata", stream.ToArray());

            bw.Close();
        }

Usage Example

Exemplo n.º 1
0
        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);
        }
All Usage Examples Of HashrateCalculator.NodeConnection::RequestBlocks