static async Task ReadBlockPipeAsync(PipeReader reader) { var block = new KzBlock(); // Read Bitcoin block headers from a PipeReader while (_zmqRunning) { var rr = await reader.ReadAsync(); var consumed = 0L; var buf = rr.Buffer; var ros = buf; if (block.TryReadBlock(ref buf)) { reader.AdvanceTo(buf.GetPosition(consumed)); //KzH.WriteMessageLine($"Block parsed {block.Hash}"); Blocks.AddNewBlock(block, ros); } else { reader.AdvanceTo(buf.Start, buf.End); KzH.WriteMessageLine($"Block parse failed"); } } }
static KzBlock GetBlock(int height) { var bytes = GetBlockBytes(height); var kzb = new KzBlock() { Height = height }; var ros = new ReadOnlySequence <byte>(bytes); var ok = kzb.TryReadBlock(ref ros); Assert.True(ros.Length == 0); Assert.True(ok); return(kzb); }
static (bool ok, ReadOnlySequence <byte> ros) FetchBlockByHeightAndHash(int height, KzUInt256?hash, KzBlock b) { var kzrpc = KzH.GetKzRpc(); if (hash == null) { hash = new KzUInt256(kzrpc.GetBlockHash(height)); } var raw = kzrpc.GetBlockRaw(hash.Value).GetBytes(); var ros = new ReadOnlySequence <byte>(raw); var bh = new KzBlockHeader { Height = height }; b.Height = height; var tros = ros; if (!b.TryReadBlock(ref tros)) { goto fail; } return(true, ros); fail: return(false, ros); }