static Mining.Merkle AsMerkle(string hex) { var res = new Mining.Merkle(); HexHelp.DecodeInto(res.blob, hex); return(res); }
/// <summary> /// Used by most algorithms. It's a simple sha256 of the coinbase. Can't get any simpler than that. /// </summary> static public Mining.Merkle SingleSha(byte[] coinbase) { var res = new Mining.Merkle(); System.Security.Cryptography.SHA256.TryHashData(coinbase, res.blob, out var written); return(res); }
static Mining.Merkle AsMerkle(ReadOnlySpan <byte> blob) { var res = new Mining.Merkle(); for (var cp = 0; cp < blob.Length; cp++) { res.blob[cp] = blob[cp]; } return(res); }
/// <summary> /// For the time being, this is in fact always the same thing. /// </summary> /// <param name="root"></param> /// <param name="jobby"></param> /// <returns></returns> public static byte[] BlendMerkles(Mining.Merkle root, IReadOnlyList <Mining.Merkle> jobby) { Span <byte> merkleSha = stackalloc byte[64]; for (var cp = 0; cp < 32; cp++) { merkleSha[cp] = root.blob[cp]; } foreach (var el in jobby) { for (var cp = 0; cp < 32; cp++) { merkleSha[cp + 32] = el.blob[cp]; } BlendMerklePackedInto(merkleSha); } return(merkleSha[0..32].ToArray());
public void BlendingMatchesGolden(byte[] root, byte[] merkle, byte[] expected) { var mroot = new Mining.Merkle(); var mmerk = new Mining.Merkle[1] { new Mining.Merkle() }; for (var loop = 0; loop < mroot.blob.Length; loop++) { mroot.blob[loop] = root[loop]; } for (var loop = 0; loop < mmerk[0].blob.Length; loop++) { mmerk[0].blob[loop] = merkle[loop]; } var calc = Merkles.BlendMerkles(mroot, mmerk); Assert.Equal(calc, expected); }