Beispiel #1
0
        private static Block parseBlockDataIntoClass(Byte[] blockByteArray)
        {
            UInt32 cursor = 0;
            var    block  = new Block {
                VersionNumber      = ParseFourBytesToElement(ref cursor, ref blockByteArray),
                PreviousBlockHash  = parseThirtyTwoBytesToElement(ref cursor, ref blockByteArray),
                MerkleRootHash     = parseThirtyTwoBytesToElement(ref cursor, ref blockByteArray),
                TimeStamp          = ParseFourBytesToElement(ref cursor, ref blockByteArray),
                TargetDifficulty   = ParseFourBytesToElement(ref cursor, ref blockByteArray),
                Nonce              = ParseFourBytesToElement(ref cursor, ref blockByteArray),
                VlTransactionCount = parseVaribleLengthInteger(ref cursor, ref blockByteArray)
            };

            //Block class is done, moving to transaction

            for (UInt64 i = 0; i < block.VlTransactionCount; i++)
            {
                var transaction       = new BlockchainTransaction();
                var transactionCursor = cursor;
                transaction.TransactionVersionNumber = ParseFourBytesToElement(ref cursor, ref blockByteArray);
                transaction.VL_inputCount            = parseVaribleLengthInteger(ref cursor, ref blockByteArray);

                //fill transaction inputs
                for (UInt64 j = 0; j < transaction.VL_inputCount; j++)
                {
                    var input = new Input {
                        PreviousTransactionHash  = parseThirtyTwoBytesToElement(ref cursor, ref blockByteArray),
                        PreviousTransactionIndex = ParseFourBytesToElement(ref cursor, ref blockByteArray),
                        VL_scriptLength          = parseVaribleLengthInteger(ref cursor, ref blockByteArray)
                    };
                    input.VL_inputScript = ParseCustomLengthToElement(ref cursor, ref blockByteArray, input.VL_scriptLength);
                    input.SequenceNumber = ParseFourBytesToElement(ref cursor, ref blockByteArray);

                    transaction.inputs.Add(input);
                }

                transaction.VL_outputCount = parseVaribleLengthInteger(ref cursor, ref blockByteArray);

                //fill transaction outputs
                for (UInt64 k = 0; k < transaction.VL_outputCount; k++)
                {
                    var output = new Output {
                        value = parseEightBytesToElement(ref cursor, ref blockByteArray),
                        VL_outputScriptLength = parseVaribleLengthInteger(ref cursor, ref blockByteArray)
                    };

                    output.publicKeyAddress = ScryptParser.getPublicKey(ParseCustomLengthToElement(ref cursor, ref blockByteArray, output.VL_outputScriptLength));

                    transaction.outputs.Add(output);
                }

                transaction.TransactionLockTime = ParseFourBytesToElement(ref cursor, ref blockByteArray);

                var wholeTransactionData = new Byte[cursor - transactionCursor];
                Array.Copy(blockByteArray, transactionCursor, wholeTransactionData, 0, cursor - transactionCursor);
                transaction.thisTransactionHash = wholeTransactionData;
                block.Transactions.Add(transaction);
            }
            return(block);
        }
Beispiel #2
0
        private static Block parseBlockDataIntoClass(byte[] blockByteArray)
        {
            uint  cursor = 0;
            Block block  = new Block();

            block.versionNumber       = parseFourBytesToElement(ref cursor, ref blockByteArray);
            block.previousBlockHash   = parseThirtyTwoBytesToElement(ref cursor, ref blockByteArray);
            block.merkleRootHash      = parseThirtyTwoBytesToElement(ref cursor, ref blockByteArray);
            block.timeStamp           = parseFourBytesToElement(ref cursor, ref blockByteArray);
            block.targetDifficulty    = parseFourBytesToElement(ref cursor, ref blockByteArray);
            block.nonce               = parseFourBytesToElement(ref cursor, ref blockByteArray);
            block.VL_transactionCount = parseVaribleLengthInteger(ref cursor, ref blockByteArray);
            //Block class is done, moving to transaction

            for (ulong i = 0; i < block.VL_transactionCount; i++)
            {
                BlockchainTransaction transaction = new BlockchainTransaction();
                uint transactionCursor            = cursor;
                transaction.transactionVersionNumber = parseFourBytesToElement(ref cursor, ref blockByteArray);
                transaction.VL_inputCount            = parseVaribleLengthInteger(ref cursor, ref blockByteArray);

                //fill transaction inputs
                for (ulong j = 0; j < transaction.VL_inputCount; j++)
                {
                    Input input = new Input();
                    input.previousTransactionHash  = parseThirtyTwoBytesToElement(ref cursor, ref blockByteArray);
                    input.previousTransactionIndex = parseFourBytesToElement(ref cursor, ref blockByteArray);
                    input.VL_scriptLength          = parseVaribleLengthInteger(ref cursor, ref blockByteArray);
                    input.VL_inputScript           = parseCustomLengthToElement(ref cursor, ref blockByteArray, input.VL_scriptLength);
                    input.sequenceNumber           = parseFourBytesToElement(ref cursor, ref blockByteArray);

                    transaction.inputs.Add(input);
                }

                transaction.VL_outputCount = parseVaribleLengthInteger(ref cursor, ref blockByteArray);

                //fill transaction outputs
                for (ulong k = 0; k < transaction.VL_outputCount; k++)
                {
                    Output output = new Output();
                    output.value = parseEightBytesToElement(ref cursor, ref blockByteArray);

                    output.VL_outputScriptLength = parseVaribleLengthInteger(ref cursor, ref blockByteArray);
                    output.publicKeyAddress      = ScryptParser.getPublicKey(parseCustomLengthToElement(ref cursor, ref blockByteArray, output.VL_outputScriptLength));

                    transaction.outputs.Add(output);
                }

                transaction.transactionLockTime = parseFourBytesToElement(ref cursor, ref blockByteArray);

                byte[] wholeTransactionData = new byte[cursor - transactionCursor];
                Array.Copy(blockByteArray, transactionCursor, wholeTransactionData, 0, cursor - transactionCursor);
                transaction.thisTransactionHash = wholeTransactionData;
                block.transactions.Add(transaction);
            }
            return(block);
        }