public static QuantumModel FromQuantumContainer(MessageEnvelope quantum, List <Effect> effects, int[] accounts, byte[] buffer) { if (quantum == null) { throw new ArgumentNullException(nameof(quantum)); } if (accounts == null) { throw new ArgumentNullException(nameof(accounts)); } if (effects == null) { throw new ArgumentNullException(nameof(effects)); } var quantumMessage = (Quantum)quantum.Message; using var writer = new XdrBufferWriter(buffer); XdrConverter.Serialize(new QuantumContainer { Quantum = quantum, Effects = effects }, writer); return(new QuantumModel { Apex = quantumMessage.Apex, Accounts = accounts, Bin = writer.ToArray() }); }
public void XdrReaderPerformanceTest(int rounds, int iterations) { var testArray = new byte[32]; Array.Fill(testArray, (byte)100); var stream = new XdrBufferWriter(); for (var i = 0; i < iterations; i++) { stream.WriteInt32(435); stream.WriteString("oiewurouqwe"); stream.WriteVariable(testArray); } var serialized = stream.ToArray(); PerfCounter.MeasureTime(() => { for (var r = 0; r < rounds; r++) { var reader = new XdrBufferReader(serialized); for (var i = 0; i < iterations; i++) { reader.ReadInt32(); reader.ReadString(); reader.ReadVariableAsSpan(); } } }, () => $"({rounds} rounds, {iterations} iterations)"); }
public static IncomingMessage ToIncomingMessage(this MessageEnvelope envelope, XdrBufferWriter writer) { if (envelope == null) { throw new ArgumentNullException(nameof(envelope)); } XdrConverter.Serialize(envelope.Message, writer); var messageHash = writer.ToArray().ComputeHash(); return(new IncomingMessage(envelope, messageHash)); }
public static byte[] ToByteArray(this object objToSerialize, XdrBufferWriter writer) { var bytes = objToSerialize as byte[]; if (bytes != null) { return(bytes); } XdrConverter.Serialize(objToSerialize, writer); return(writer.ToArray()); }
/// <summary> /// Signs an envelope with a given <see cref="KeyPair"/> and appends the signature to the <see cref="MessageEnvelope.Signatures"/>. /// </summary> /// <param name="messageEnvelope">Envelope to sign</param> /// <param name="keyPair">Key pair to use for signing</param> /// <param name="buffer">Buffer to use for computing hash code.</param> public static MessageEnvelope Sign(this MessageEnvelope messageEnvelope, KeyPair keyPair, byte[] buffer) { if (messageEnvelope == null) { throw new ArgumentNullException(nameof(messageEnvelope)); } if (keyPair == null) { throw new ArgumentNullException(nameof(keyPair)); } if (buffer == null) { throw new ArgumentNullException(nameof(buffer)); } using var writer = new XdrBufferWriter(buffer); XdrConverter.Serialize(messageEnvelope.Message, writer); var signature = writer.ToArray().ComputeHash().Sign(keyPair); messageEnvelope.Signatures.Add(signature); return(messageEnvelope); }
public void XdrCompatibilityTest() { var testArray = new byte[32]; Array.Fill(testArray, (byte)100); //forward compatibility var legacyXdrSerializationStream = new XdrDataOutputStream(); legacyXdrSerializationStream.WriteInt(435); legacyXdrSerializationStream.WriteUInt(435); legacyXdrSerializationStream.WriteLong(43546345634657565L); legacyXdrSerializationStream.WriteDoubleArray(new double[] { 435.15, 64656.11 }); legacyXdrSerializationStream.WriteString("oiewurouqwe"); legacyXdrSerializationStream.WriteVarOpaque(32, testArray); var bufferReader = new XdrBufferReader(legacyXdrSerializationStream.ToArray()); Assert.AreEqual(435, bufferReader.ReadInt32()); Assert.AreEqual((uint)435, bufferReader.ReadUInt32()); Assert.AreEqual(43546345634657565L, bufferReader.ReadInt64()); { var length = bufferReader.ReadInt32(); var value = new double[length]; for (var i = 0; i < length; i++) { value[i] = bufferReader.ReadDouble(); } Assert.AreEqual(new double[] { 435.15, 64656.11 }, value); } Assert.AreEqual("oiewurouqwe", bufferReader.ReadString()); Assert.AreEqual(testArray, bufferReader.ReadVariable()); using var streamReader = new XdrStreamReader(new MemoryStream(legacyXdrSerializationStream.ToArray())); Assert.AreEqual(435, streamReader.ReadInt32()); Assert.AreEqual((uint)435, streamReader.ReadUInt32()); Assert.AreEqual(43546345634657565L, streamReader.ReadInt64()); { var length = streamReader.ReadInt32(); var value = new double[length]; for (var i = 0; i < length; i++) { value[i] = streamReader.ReadDouble(); } Assert.AreEqual(new double[] { 435.15, 64656.11 }, value); } Assert.AreEqual("oiewurouqwe", streamReader.ReadString()); Assert.AreEqual(testArray, streamReader.ReadVariable()); //backward compatibility var bufferWriter = new XdrBufferWriter(); bufferWriter.WriteInt32(435); bufferWriter.WriteUInt32((uint)435); { var arr = new double[] { 435.15, 64656.11 }; bufferWriter.WriteInt32(arr.Length); foreach (var d in arr) { bufferWriter.WriteDouble(d); } } bufferWriter.WriteString("oiewurouqwe"); bufferWriter.WriteVariable(testArray); var legacyXdrReader = new XdrDataInputStream(bufferWriter.ToArray()); Assert.AreEqual(435, legacyXdrReader.ReadInt()); Assert.AreEqual((uint)435, legacyXdrReader.ReadUInt()); Assert.AreEqual(new double[] { 435.15, 64656.11 }, legacyXdrReader.ReadDoubleArray()); Assert.AreEqual("oiewurouqwe", legacyXdrReader.ReadString()); Assert.AreEqual(testArray, legacyXdrReader.ReadVarOpaque(32)); using var memoryStream = new MemoryStream(); var streamWriter = new XdrStreamWriter(memoryStream); streamWriter.WriteInt32(435); streamWriter.WriteUInt32((uint)435); { var arr = new double[] { 435.15, 64656.11 }; streamWriter.WriteInt32(arr.Length); foreach (var d in arr) { streamWriter.WriteDouble(d); } } streamWriter.WriteString("oiewurouqwe"); streamWriter.WriteVariable(testArray); var res = memoryStream.ToArray(); var reference = bufferWriter.ToArray(); CollectionAssert.AreEqual(reference, res); }