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); }
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); }