Пример #1
0
        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);
        }
Пример #5
0
        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));
        }