Beispiel #1
0
        public MerkleTree(string treeKey, IItemOperations <T> itemOperations, ICampfireNetObjectStore objectStore)
        {
            this.treeKey        = treeKey;
            this.itemOperations = itemOperations;
            this.objectStore    = objectStore;

            TreeNamespace            = $"net/trees/{treeKey}";
            TreeContainmentNamespace = $"{TreeNamespace}/contains";
        }
Beispiel #2
0
        public static async Task <MerkleNode> ReadMerkleNodeAsync(this ICampfireNetObjectStore store, string ns, string hash)
        {
            var tryReadResult = await store.TryReadAsync(ns, hash).ConfigureAwait(false);

            var tryReadSucceeded = tryReadResult.Item1;

            if (!tryReadSucceeded)
            {
                return(null);
            }

            var objectData = tryReadResult.Item2;

            using (var ms = new MemoryStream(objectData))
                using (var reader = new BinaryReader(ms)) {
                    return(reader.ReadMerkleNode());
                }
        }
Beispiel #3
0
        public static async Task <Tuple <bool, string> > TryWriteMerkleNodeAsync(this ICampfireNetObjectStore store, string ns, MerkleNode node)
        {
            using (var ms = new MemoryStream()) {
                using (var writer = new BinaryWriter(ms, Encoding.UTF8, true)) {
                    writer.WriteMerkleNode(node);
                }

                var objectData     = ms.GetBuffer();
                var length         = (int)ms.Position;
                var hash           = CampfireNetHash.ComputeSha256Base64(objectData, 0, length);
                var isNewlyWritten = await store.TryWriteUniqueAsync(ns, hash, objectData).ConfigureAwait(false);

//            var copy = await ReadMerkleNodeAsync(store, ns, hash).ConfigureAwait(false);
//            if (copy.TypeTag != node.TypeTag || copy.LeftHash != node.LeftHash || copy.RightHash != node.RightHash || copy.Descendents != node.Descendents) {
//               throw new InvalidStateException();
//            }
                return(Tuple.Create(isNewlyWritten, hash));
            }
        }
 public ClientMerkleTreeFactory(BroadcastMessageSerializer broadcastMessageSerializer, ICampfireNetObjectStore objectStore)
 {
     this.broadcastMessageSerializer = broadcastMessageSerializer;
     this.objectStore = objectStore;
 }