/// <summary> /// Block headers are sent in a headers packet in response to a getheaders message. /// </summary> /// <remarks> /// https://en.bitcoin.it/wiki/Protocol_specification#Block_Headers /// </remarks> /// <example> /// nodejs: https://github.com/zone117x/node-stratum-pool/blob/master/lib/blockTemplate.js#L85 /// </example> /// <param name="job"></param> /// <param name="merkleRoot"></param> /// <param name="nTime"></param> /// <param name="nonce"></param> /// <returns></returns> public static byte[] SerializeHeader(IJob job, byte[] merkleRoot, UInt64 nTime, UInt64 nonce) { byte[] result; using (var stream = new MemoryStream()) { stream.WriteValueU64(nonce.BigEndian()); stream.WriteValueU64(job.Height.BigEndian()); stream.WriteValueU64(nTime.BigEndian()); stream.WriteBytes(job.AccountRootHash.HexToByteArray()); stream.WriteBytes(merkleRoot); stream.WriteBytes(job.PreviousBlockHash.HexToByteArray()); stream.WriteValueU16(job.BlockTemplate.Version.BigEndian()); result = stream.ToArray(); result = result.ReverseBytes(); } return(result); }