BCNet.BlockHeader.ComputeHash C# (CSharp) Method

ComputeHash() public method

public ComputeHash ( bool useScrypt ) : void
useScrypt bool
return void
        public void ComputeHash(bool useScrypt)
        {
            MemoryStream ms = new MemoryStream();
            BinaryWriter bw = new BinaryWriter(ms);
            bw.Write(mVersion);
            bw.Write(mPrevBlock);
            bw.Write(mMerkleRoot);
            bw.Write(mTimestamp);
            bw.Write(mDifficultyBits);
            bw.Write(mNOnce);
            byte[] data = ms.ToArray();
            bw.Close();

            if (useScrypt)
            {
                MinerLib_cs.Work work = new MinerLib_cs.Work();
                Buffer.BlockCopy(data, 0, work.data, 0, 80);
                for (int i = 0; i < 20; i++)
                    work.data[i] = Utils.Byteswap(work.data[i]);

                MinerLib_cs.Scrypt scrypt = new MinerLib_cs.Scrypt(work);
                mHash = scrypt.GetHash();
            }
            else
            {
                // SHA 256
                mHash = Utils.GenerateHash(data);
            }
        }

Usage Example

        public void HandleBlockPacket(NodeConnection from, 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       = Utils.ReadVarInt(br);

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

            h.ComputeHash(mUseScryptHash);

            Block block = FindBlock(h.mHash);

            if (block == null)
            {
                // Create a new block
                string hash = Utils.ByteArrayToHexString(h.mHash);
                Console.WriteLine("does a new block ever get introduced this way!?? " + hash);
                return;
            }

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

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

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

                    ti.mSequence = br.ReadUInt32();

                    tx.mInputs.Add(ti);
                }

                ulong outCount = Utils.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 = Utils.ReadVarInt(br);
                    to.mScript = br.ReadBytes((int)scriptLen);

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

                block.mTransactions.Add(tx);
            }
            br.Close();
        }
All Usage Examples Of BCNet.BlockHeader::ComputeHash