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