public bool Same(BitReader b) { while(Position != Count && b.Position != b.Count) { var valuea = Read(); var valueb = b.Read(); if(valuea != valueb) return false; } return true; }
internal void Write(BitReader reader, int bitCount) { for(int i = 0 ; i < bitCount ; i++) { Write(reader.Read()); } }
public void Write(BitReader reader) { Write(reader, reader.Count - reader.Position); }
private static void MarkNodes(MerkleNode root, bool[] vMatch) { BitReader matches = new BitReader(new BitArray(vMatch)); foreach(var leaf in root.GetLeafs()) { if(matches.Read()) { MarkToTop(leaf, true); } } }
private IEnumerable<uint256> GetMatchedTransactionsCore(MerkleNode node, BitReader flags, IEnumerator<uint256> hashes, bool calculateHash) { if(node == null) return new uint256[0]; node.IsMarked = flags.Read(); if(node.IsLeaf || !node.IsMarked) { hashes.MoveNext(); node.Hash = hashes.Current; } if(!node.IsMarked) return new uint256[0]; if(node.IsLeaf) return new uint256[] { node.Hash }; var left = GetMatchedTransactionsCore(node.Left, flags, hashes, calculateHash); var right = GetMatchedTransactionsCore(node.Right, flags, hashes, calculateHash); if(calculateHash) node.UpdateHash(); return left.Concat(right); }
public IEnumerable<uint256> GetMatchedTransactions() { BitReader flags = new BitReader(Flags); MerkleNode root = MerkleNode.GetRoot((int)TransactionCount); var hashes = Hashes.GetEnumerator(); return GetMatchedTransactionsCore(root, flags, hashes, false); }
public MerkleNode GetMerkleRoot() { MerkleNode node = MerkleNode.GetRoot((int)TransactionCount); BitReader flags = new BitReader(Flags); var hashes = Hashes.GetEnumerator(); GetMatchedTransactionsCore(node, flags, hashes, true).AsEnumerable(); return node; }