예제 #1
0
		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;
		}
예제 #2
0
		internal void Write(BitReader reader, int bitCount)
		{
			for(int i = 0 ; i < bitCount ; i++)
			{
				Write(reader.Read());
			}
		}
예제 #3
0
		public void Write(BitReader reader)
		{
			Write(reader, reader.Count - reader.Position);
		}
예제 #4
0
		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);
				}
			}
		}
예제 #5
0
		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);
		}
예제 #6
0
		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);
		}
예제 #7
0
		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;
		}
예제 #8
0
 public void Write(BitReader reader)
 {
     Write(reader, reader.Count - reader.Position);
 }