/// <summary> /// Fetches a request from the contract storage and processes it. /// </summary> private void ProcessRequest(Storage storage, BigInteger ID) { var base_key = ID.ToByteArray(); var req_owner_key = request_owner_prefix.Concat(base_key).ToArray(); var req_key_key = request_key_prefix.Concat(base_key).ToArray(); var req_uuid_key = request_key_prefix.Concat(base_key).ToArray(); var req_val_key = request_value_prefix.Concat(base_key).ToArray(); var uuid = Encoding.UTF8.GetString(storage.Get(req_uuid_key)); var value = Encoding.ASCII.GetString(storage.Get(req_val_key)); var temp = storage.Get(req_key_key); var operation = (char)temp[0]; var key = Encoding.UTF8.GetString(temp.Skip(1).ToArray()); switch (operation) { case 'C': { this.swarm.Create(uuid, key, value); break; } case 'R': { var read = this.swarm.Read(uuid, key); var push_tx = neo_api.CallContract(owner_keys, bluzelle_contract_hash, "api_push", new object[] { uuid, key, read }); neo_api.WaitForTransaction(owner_keys, push_tx); break; } case 'U': { this.swarm.Update(uuid, key, value); break; } case 'D': { this.swarm.Delete(uuid, key); break; } } }
/// <summary> /// Catches and processes all notifications triggered in a Neo transaction /// </summary> /// <param name="tx"></param> private void ProcessNotifications(Transaction tx) { // add the transaction to the cache transactions[tx.Hash] = tx; var notifications = listenerVM.GetNotifications(tx); if (notifications == null) { return; } foreach (var entry in notifications) { switch (entry.Name) { case "blz_create": { if (entry.Args.Length != 3) { throw new Exception($"Swarm.Create expects 3 arguments"); } var uuid = (byte[])entry.Args[0]; var key = (byte[])entry.Args[1]; var value = (byte[])entry.Args[2]; this.swarm.Create(uuid, key, value); break; } case "blz_read": { if (entry.Args.Length != 2) { throw new Exception($"Swarm.Read expects 2 arguments"); } var uuid = (byte[])entry.Args[0]; var key = (byte[])entry.Args[1]; var value = this.swarm.Read(uuid, key); var push_tx = neo_api.CallContract(owner_keys, bluzelle_contract_hash, "api_push", new object[] { uuid, key, value }); neo_api.WaitForTransaction(owner_keys, push_tx); break; } case "blz_update": { if (entry.Args.Length != 3) { throw new Exception($"Swarm.Update expects 3 arguments"); } var uuid = (byte[])entry.Args[0]; var key = (byte[])entry.Args[1]; var value = (byte[])entry.Args[2]; this.swarm.Update(uuid, key, value); // public static event Action<byte[], byte[], byte[]> OnUpdate; break; } case "blz_delete": { if (entry.Args.Length != 2) { throw new Exception($"Swarm.Delete expects 2 arguments"); } var uuid = (byte[])entry.Args[0]; var key = (byte[])entry.Args[1]; this.swarm.Remove(uuid, key); break; } } } }