Ejemplo n.º 1
0
        public void HandleBlockPacket(NodeConnection node, byte[] payload)
        {
            MemoryStream stream = new MemoryStream(payload);
            BinaryReader br     = new BinaryReader(stream);

            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);

            BlockHeader h = new BlockHeader(version, prevBlock, merkle, time, bits, nonce);

            h.ComputeHash(mScryptBlockHash);
            string hash = Program.HashToString(h.mHash);

            Block block = FindBlock(hash);

            if (block == null)
            {
                // Create a new block
                block         = new Block();
                block.mHeader = h;
                mBlockLock.WaitOne();
                mBlocks.Add(block);
                mBlockLock.ReleaseMutex();
            }

            block.mTransactions.Clear();
            if (mWantsTransactionData)
            {
                for (ulong j = 0; j < txn; j++)
                {
                    Transaction tx = new Transaction();
                    tx.mVersion   = br.ReadUInt32();
                    tx.mTimestamp = br.ReadUInt32();

                    ulong inCount = Program.ReadVarInt(br);
                    for (ulong k = 0; k < inCount; k++)
                    {
                        TransactionInput ti = new TransactionInput();
                        ti.mPrevOuptutHash  = br.ReadBytes(32);
                        ti.mPrevOutputIndex = br.ReadUInt32();

                        ulong scriptLen = Program.ReadVarInt(br);
                        ti.mScript = br.ReadBytes((int)scriptLen);

                        ti.mSequence = br.ReadUInt32();

                        tx.mInputs.Add(ti);
                    }

                    ulong outCount = Program.ReadVarInt(br);
                    for (ulong k = 0; k < outCount; k++)
                    {
                        TransactionOutput to = new TransactionOutput();
                        to.mValue     = br.ReadUInt64();
                        to.mRealValue = (double)to.mValue / 1000000.0;

                        ulong scriptLen = Program.ReadVarInt(br);
                        to.mScript = br.ReadBytes((int)scriptLen);

                        tx.mOutputs.Add(to);
                    }
                    tx.mLockTime = br.ReadUInt32();
                    if (tx.mVersion > 1)
                    {
                        ulong commentLen = Program.ReadVarInt(br);
                        tx.mComment = br.ReadBytes((int)commentLen);
                    }

                    block.mTransactions.Add(tx);
                }
            }
            br.Close();
        }
Ejemplo n.º 2
0
        public void HandleBlockPacket(NodeConnection node, byte[] payload)
        {
            MemoryStream stream = new MemoryStream(payload);
            BinaryReader br = new BinaryReader(stream);

            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);

            BlockHeader h = new BlockHeader(version, prevBlock, merkle, time, bits, nonce);
            h.ComputeHash(mScryptBlockHash);
            string hash = Program.HashToString(h.mHash);

            Block block = FindBlock(hash);
            if( block == null )
            {
                // Create a new block
                block = new Block();
                block.mHeader = h;
                mBlockLock.WaitOne();
                mBlocks.Add(block);
                mBlockLock.ReleaseMutex();
            }

            block.mTransactions.Clear();
            if (mWantsTransactionData)
            {
                for (ulong j = 0; j < txn; j++)
                {
                    Transaction tx = new Transaction();
                    tx.mVersion = br.ReadUInt32();
                    tx.mTimestamp = br.ReadUInt32();

                    ulong inCount = Program.ReadVarInt(br);
                    for (ulong k = 0; k < inCount; k++)
                    {
                        TransactionInput ti = new TransactionInput();
                        ti.mPrevOuptutHash = br.ReadBytes(32);
                        ti.mPrevOutputIndex = br.ReadUInt32();

                        ulong scriptLen = Program.ReadVarInt(br);
                        ti.mScript = br.ReadBytes((int)scriptLen);

                        ti.mSequence = br.ReadUInt32();

                        tx.mInputs.Add(ti);
                    }

                    ulong outCount = Program.ReadVarInt(br);
                    for (ulong k = 0; k < outCount; k++)
                    {
                        TransactionOutput to = new TransactionOutput();
                        to.mValue = br.ReadUInt64();
                        to.mRealValue = (double)to.mValue / 1000000.0;

                        ulong scriptLen = Program.ReadVarInt(br);
                        to.mScript = br.ReadBytes((int)scriptLen);

                        tx.mOutputs.Add(to);
                    }
                    tx.mLockTime = br.ReadUInt32();
                    if (tx.mVersion > 1)
                    {
                        ulong commentLen = Program.ReadVarInt(br);
                        tx.mComment = br.ReadBytes((int)commentLen);
                    }

                    block.mTransactions.Add(tx);
                }
            }
            br.Close();
        }