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"; }
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()); } }
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; }