예제 #1
0
        public void ProcessBlock(BlockBase blockBase)
        {
            SynchronizationBlockBase synchronizationBlock = blockBase as SynchronizationBlockBase;

            if (synchronizationBlock != null && !_synchronizationBlocks.IsAddingCompleted)
            {
                _synchronizationBlocks.TryAdd(synchronizationBlock);
            }
        }
예제 #2
0
        protected override Memory <byte> ParseSynchronization(ushort version, Memory <byte> spanBody, out SynchronizationBlockBase synchronizationBlockBase)
        {
            if (version == 1)
            {
                ushort   round           = BinaryPrimitives.ReadUInt16LittleEndian(spanBody.Span);
                byte     numberOfSigners = spanBody.Span[2];
                byte[][] signers         = new byte[numberOfSigners][];
                byte[][] signatures      = new byte[numberOfSigners][];

                for (int i = 0; i < numberOfSigners; i++)
                {
                    signers[i]    = spanBody.Slice(3 + (Globals.NODE_PUBLIC_KEY_SIZE + Globals.SIGNATURE_SIZE) * i, Globals.NODE_PUBLIC_KEY_SIZE).ToArray();
                    signatures[i] = spanBody.Slice(3 + (Globals.NODE_PUBLIC_KEY_SIZE + Globals.SIGNATURE_SIZE) * i + Globals.NODE_PUBLIC_KEY_SIZE, Globals.SIGNATURE_SIZE).ToArray();
                }

                SynchronizationBlockBase synchronizationConfirmedBlock = new SynchronizationConfirmedBlock()
                {
                    Round      = round,
                    PublicKeys = signers,
                    Signatures = signatures
                };

                synchronizationBlockBase = synchronizationConfirmedBlock;

                return(spanBody.Slice(3 + (Globals.NODE_PUBLIC_KEY_SIZE + Globals.SIGNATURE_SIZE) * numberOfSigners));
            }

            throw new BlockVersionNotSupportedException(version, BlockType);
        }
예제 #3
0
        protected override Memory <byte> ParseSynchronization(ushort version, Memory <byte> spanBody, out SynchronizationBlockBase synchronizationBlockBase)
        {
            SynchronizationRegistryCombinedBlock block = new SynchronizationRegistryCombinedBlock();

            if (version == 1)
            {
                ushort blockHashesCount = BinaryPrimitives.ReadUInt16LittleEndian(spanBody.Span);
                block.BlockHashes = new byte[blockHashesCount][];
                for (int i = 0; i < blockHashesCount; i++)
                {
                    block.BlockHashes[i] = spanBody.Slice(2 + i * Globals.DEFAULT_HASH_SIZE, Globals.DEFAULT_HASH_SIZE).ToArray();
                }

                synchronizationBlockBase = block;

                return(spanBody.Slice(2 + blockHashesCount * Globals.DEFAULT_HASH_SIZE));
            }

            throw new BlockVersionNotSupportedException(version, BlockType);
        }
예제 #4
0
 protected abstract Memory <byte> ParseSynchronization(ushort version, Memory <byte> spanBody, out SynchronizationBlockBase synchronizationBlockBase);
예제 #5
0
        protected override Memory <byte> ParseSynchronization(ushort version, Memory <byte> spanBody, out SynchronizationBlockBase synchronizationBlockBase)
        {
            if (version == 1)
            {
                ushort round = BinaryPrimitives.ReadUInt16LittleEndian(spanBody.Span);

                SynchronizationProducingBlock synchronizationBlock = new SynchronizationProducingBlock
                {
                    Round = round
                };

                synchronizationBlockBase = synchronizationBlock;
                return(spanBody.Slice(2));
            }

            throw new BlockVersionNotSupportedException(version, BlockType);
        }