private static JoinSplit ParseJoinSplit(BlockMemoryStreamReader blockMemoryStreamReader) { JoinSplit joinSplit = new JoinSplit(); joinSplit.AmountIn = blockMemoryStreamReader.ReadUInt64(); joinSplit.AmountOut = blockMemoryStreamReader.ReadUInt64(); joinSplit.Anchor = new ByteArray(blockMemoryStreamReader.ReadBytes(32)); for (int i = 0; i < joinSplit.Nullifiers.Length; ++i) { joinSplit.Nullifiers[i] = new ByteArray(blockMemoryStreamReader.ReadBytes(32)); } for (int i = 0; i < joinSplit.Commitments.Length; ++i) { joinSplit.Commitments[i] = new ByteArray(blockMemoryStreamReader.ReadBytes(32)); } joinSplit.EphemeralKey = new ByteArray(blockMemoryStreamReader.ReadBytes(32)); joinSplit.RandomSeed = new ByteArray(blockMemoryStreamReader.ReadBytes(32)); for (int i = 0; i < joinSplit.MACs.Length; ++i) { joinSplit.MACs[i] = new ByteArray(blockMemoryStreamReader.ReadBytes(32)); } joinSplit.Proof = BlockchainParser.ParseZCProof(blockMemoryStreamReader); for (int i = 0; i < joinSplit.Ciphertexts.Length; ++i) { joinSplit.Ciphertexts[i] = new ByteArray(blockMemoryStreamReader.ReadBytes(ZcashConstants.ZC_NOTECIPHERTEXT_SIZE)); } return(joinSplit); }
/// <summary> /// Parses a Bitcoin transaction output. /// </summary> /// <param name="blockMemoryStreamReader"> /// Provides access to a section of the Bitcoin blockchain file. /// </param> /// <returns> /// The Bitcoin transaction output that was parsed. /// </returns> private static TransactionOutput ParseTransactionOutput(BlockMemoryStreamReader blockMemoryStreamReader) { TransactionOutput transactionOutput = new TransactionOutput(); transactionOutput.OutputValueSatoshi = blockMemoryStreamReader.ReadUInt64(); int scriptLength = (int)blockMemoryStreamReader.ReadVariableLengthInteger(); transactionOutput.OutputScript = new ByteArray(blockMemoryStreamReader.ReadBytes(scriptLength)); transactionOutput.Address = AddressParser.GetAddressFromOutputScript(transactionOutput.OutputScript.ToArray()); return(transactionOutput); }