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); } }
int DisptachPacket(byte[] packet, long size) { MemoryStream stream = new MemoryStream(packet); BinaryReader br = new BinaryReader(stream); int bytesConsumed = 0; while (stream.Position + 24 < size) { uint networkID = br.ReadUInt32(); string packetID = Utils.ReadString(br, 12); uint length = br.ReadUInt32(); uint checksum = br.ReadUInt32(); if (stream.Position + length > size) { break; } //Console.WriteLine(packetID); if (networkID == mNetworkID) { byte[] payload = br.ReadBytes((int)length); byte[] hash = Utils.GenerateHash(payload); if (CompareChecksum(checksum, hash)) { // valid packet, get the handler if (mPacketProcessors.ContainsKey(packetID)) { PacketProcessor p = mPacketProcessors[packetID]; p(payload); } else { Console.WriteLine("Unhandled packet: " + packetID); } } else { Console.WriteLine("Failed checksum!"); } } else { Console.WriteLine("Failed ID Check, Network ID: " + networkID); } bytesConsumed += 24 + (int)length; } br.Close(); return(bytesConsumed); }
public void SendPacket(string packetID, byte[] payload) { byte[] hash = Utils.GenerateHash(payload); MemoryStream stream = new MemoryStream(); BinaryWriter w = new BinaryWriter(stream); w.Write(mNetworkID); for (int i = 0; i < 12; i++) { if (i < packetID.Length) { w.Write((byte)packetID[i]); } else { w.Write((byte)0); } } // Payload len w.Write(payload.Length); // Checksum w.Write(hash[0]); w.Write(hash[1]); w.Write(hash[2]); w.Write(hash[3]); w.Write(payload); byte[] packetData = stream.ToArray(); mSocket.Send(packetData); w.Close(); }