RequestHeaders() public method

public RequestHeaders ( byte origin ) : void
origin byte
return void
 void PullHeaders()
 {
     if (mLastNode != null && !mPullingHeaders)
     {
         // Get headers
         mPullingHeaders = true;
         byte[] hash = null;
         if (mBlocks.Count > 0)
         {
             hash = mBlocks[mBlocks.Count - 1].mHeader.mHash;
         }
         mLastNode.RequestHeaders(hash);
     }
 }
        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);
        }
Beispiel #3
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);
        }