public override ITargettedMessageSet <IBlockchainEventsRehydrationFactory> RehydrateMessage(IByteArray data, TargettedHeader header, IBlockchainEventsRehydrationFactory rehydrationFactory) { IDataRehydrator dr = DataSerializationFactory.CreateRehydrator(data); IByteArray messageBytes = NetworkMessageSet.ExtractMessageBytes(dr); NetworkMessageSet.ResetAfterHeader(dr); IDataRehydrator messageRehydrator = DataSerializationFactory.CreateRehydrator(messageBytes); short workflowType = messageRehydrator.ReadShort(); if (workflowType == 0) { throw new ApplicationException("Invalid workflow type"); } switch (workflowType) { case NeuraliumWorkflowIDs.TEST: return(new TestFactory((BlockchainServiceSet)this.serviceSet).RehydrateMessage(data, header, rehydrationFactory)); // default: // throw new ApplicationException("Workflow message factory not found"); } return(base.RehydrateMessage(data, header, rehydrationFactory)); }
public override ITransaction CreateTransaction(IDehydratedTransaction dehydratedTransaction) { IDataRehydrator rehydrator = DataSerializationFactory.CreateRehydrator(dehydratedTransaction.Header); var version = new ComponentVersion <TransactionType>(); version.Rehydrate(rehydrator); rehydrator.Rewind2Start(); return(this.CreateTransation(version)); }
public override IBlockchainMessage CreateMessage(IDehydratedBlockchainMessage dehydratedMessage) { IDataRehydrator bodyRehydrator = DataSerializationFactory.CreateRehydrator(dehydratedMessage.Contents); //start by peeking and reading both the transactiontype and version var version = bodyRehydrator.RehydrateRewind <ComponentVersion <BlockchainMessageType> >(); bodyRehydrator.Rewind2Start(); if (version.Type == BlockchainMessageTypes.Instance.DEBUG) { if (version == (1, 0)) { return(new NeuraliumDebugMessage()); } } else if (version.Type == BlockchainMessageTypes.Instance.ELECTIONS_REGISTRATION) { if (version == (1, 0)) { return(new NeuraliumElectionsRegistrationMessage()); } } else if (version.Type == BlockchainMessageTypes.Instance.ACTIVE_ELECTION_CANDIDACY) { if (version == (1, 0)) { // a very rare case where it is not scopped for the chain return(new ActiveElectionCandidacyMessage()); } } else if (version.Type == BlockchainMessageTypes.Instance.PASSIVE_ELECTION_CANDIDACY) { if (version == (1, 0)) { // a very rare case where it is not scopped for the chain return(new PassiveElectionCandidacyMessage()); } } else { throw new ApplicationException("Invalid blockchain message type"); } return(null); }
public override IElectionContext CreateElectionContext(IByteArray compressedContext) { GzipCompression compressor = new GzipCompression(); IByteArray decompressedContext = compressor.Decompress(compressedContext); IDataRehydrator electionContextRehydrator = DataSerializationFactory.CreateRehydrator(decompressedContext); var version = electionContextRehydrator.RehydrateRewind <ComponentVersion <ElectionContextType> >(); IElectionContext context = null; if (version.Type == ElectionContextTypes.Instance.Active) { if (version == (1, 0)) { context = new NeuraliumActiveElectionContext(); } } if (version.Type == ElectionContextTypes.Instance.Passive) { if (version == (1, 0)) { context = new NeuraliumPassiveElectionContext(); } } if (context == null) { throw new ApplicationException("Unrecognized election context version."); } context.Rehydrate(electionContextRehydrator, this); decompressedContext.Return(); return(context); }
public override ITargettedMessageSet <IBlockchainEventsRehydrationFactory> RehydrateMessage(IByteArray data, TargettedHeader header, IBlockchainEventsRehydrationFactory rehydrationFactory) { IDataRehydrator dr = DataSerializationFactory.CreateRehydrator(data); IByteArray messageBytes = NetworkMessageSet.ExtractMessageBytes(dr); NetworkMessageSet.ResetAfterHeader(dr); IDataRehydrator messageRehydrator = DataSerializationFactory.CreateRehydrator(messageBytes); IBlockchainTargettedMessageSet messageSet = null; try { if (data?.Length == 0) { throw new ApplicationException("null message"); } short workflowType = 0; ComponentVersion <SimpleUShort> version = null; messageRehydrator.Peek(rehydrator => { workflowType = rehydrator.ReadShort(); if (workflowType != NeuraliumWorkflowIDs.TEST) { throw new ApplicationException("Invalid workflow type"); } version = rehydrator.Rehydrate <ComponentVersion <SimpleUShort> >(); }); switch (version.Type.Value) { case MESS1: if (version == (1, 0)) { messageSet = this.CreateTestWorkflowTriggerSet(header); } break; case MESS2: if (version == (1, 0)) { messageSet = this.CreateServerAnswerSet(header); } break; default: throw new ApplicationException("invalid message type"); } if (messageSet?.BaseMessage == null) { throw new ApplicationException("Invalid message type or version"); } messageSet.BaseHeader = header; // set the header explicitely messageSet.RehydrateRest(dr, rehydrationFactory); } catch (Exception ex) { Log.Error(ex, "Invalid data sent"); } return(messageSet); }
protected override IDataRehydrator CreateRehydrator() { return(DataSerializationFactory.CreateRehydrator(this.Data, this.position, this.length)); }
public override IBlock CreateBlock(IDehydratedBlock dehydratedBlock) { IDataRehydrator bodyRehydrator = DataSerializationFactory.CreateRehydrator(dehydratedBlock.HighHeader); return(this.CreateBlock(bodyRehydrator)); }
public override IBlockchainDigest CreateDigest(IDehydratedBlockchainDigest dehydratedDigest) { IDataRehydrator rehydrator = DataSerializationFactory.CreateRehydrator(dehydratedDigest.Contents); return(this.CreateDigest(rehydrator)); }