\documentclass[12pt,a4paper]{article}

\usepackage[cm]{fullpage}
\usepackage{amsthm}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{xspace}
\usepackage[english]{babel}
\usepackage{fancyhdr}
\usepackage{titling}
\usepackage{hyperref}
\renewcommand{\thesection}{Exercise \Alph{section}:}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% This part needs customization from you %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% please enter your group number your names and matriculation numbers here
%TODO
\newcommand{\groupnumber}{04}
\newcommand{\name}{Tobias Eidelpes, Ege Mehmet Demirsoy, Nejra Komic}
\newcommand{\matriculation}{01527193, XXXXXXXX, XXXXXXXX, same order as the
names}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%           End of customization         %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\newcommand{\projnumber}{1}
\newcommand{\Title}{Analysing the Blockchain}
\setlength{\headheight}{15.2pt}
\setlength{\headsep}{20pt}
\setlength{\textheight}{680pt}
\pagestyle{fancy}
\fancyhf{} 
\fancyhead[L]{Cryptocurrencies - Project \projnumber\ - Analysing the Blockchain}
\fancyhead[C]{}
\fancyhead[R]{\name}
\renewcommand{\headrulewidth}{0.4pt}
\fancyfoot[C]{\thepage}


\begin{document}
\thispagestyle{empty}
\noindent\framebox[\linewidth]{%
 \begin{minipage}{\linewidth}%
 \hspace*{5pt} \textbf{Cryptocurrencies (WS2021/22)} \hfill Prof.~Matteo Maffei \hspace*{5pt}\\

 \begin{center}
  {\bf\Large Project \projnumber~-- \Title}
 \end{center}

 \vspace*{5pt}\hspace*{5pt} \hfill TU Wien \hspace*{5pt}
\end{minipage}%
}
\vspace{0.5cm}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section*{Group \groupnumber}
Our group consists of the following members:
\begin{center}
\textbf{\name} %please fill the information above

\matriculation %please fill the information above
\end{center}

\section{Finding invalid blocks}

For this exercise all invalid blocks contained in the database provided to us
had to be found. While there is an
official\footnote{\url{https://en.bitcoin.it/wiki/Protocol\_rules\#.22block.22\_messages}}
algorithm which allows network participants to verify whether a block is invalid
or not, the stripped-down version of the blockchain we received does not require
all the steps. This stripped-down version of the algorithm thus specifies which
constraints the data must satisfy:

\begin{enumerate}
    \item All blocks which do not have the coinbase transaction as their first
        transaction are invalid. This will be achieved by creating a view which
        lists all coinbase transactions. Then we query the database for all
        first transactions of each block and check if that transaction is in the
        view of all coinbase transactions. If it is not, we reject the block and
        add it to the invalid list.
    \item All blocks which contain transactions which do not have inputs or
        outputs are invalid. We split this task into two queries, one for
        checking if a block contains transactions with zero inputs and another
        one for checking if a block contains transactions with zero outputs.
    \item All blocks which have transactions with an invalid output value or
        where the sum of all output values exceeds the legal money range are
        invalid. This task is split into two queries as well. One for checking
        if individual output values are outside of the legal money range and a
        second one for checking if the sum of all output values per transaction
        is outside of the legal money range.
    \item Reject all blocks which have transactions with inputs that do not have
        a corresponding output. For this task we first create a view which finds
        all non coinbase transactions. The output of that query is then filtered
        for all inputs which are not part of a coinbase transaction (so the non
        coinbase inputs). Finally, the non coinbase inputs are joined with the
        outputs and rows containing \texttt{NULL} as their \texttt{value}
        indicate an invalid block.
    \item All blocks which contain transactions where the input's
        \texttt{sig\_id} field is not the same as the output's \texttt{pk\_id}
        field are invalid. Since we are not interested in the coinbase
        transactions, the query uses the non coinbase inputs again to join them
        with the outputs. If the two fields do not match, the block is invalid.
    \item All blocks which have inputs for which there exist outputs which have
        already been spent are invalid. This task is split into three queries.
        First, we find all outputs which have more than one input. Second, for
        all the outputs found, we find the corresponding inputs where the output
        was first spent. Third, the two tables are combined such that blocks
        with outputs which have corresponding inputs that are not listed as the
        first spending occurrence, are marked as invalid.
    \item All blocks containing inputs which are not in the legal money range
        are invalid. First, we construct a view which gathers all transactions
        and their corresponding sum of value for all inputs. All blocks
        containing input sums which are outside of the legal money range are
        marked as invalid. Second, we reuse the view of all non coinbase inputs
        and filter them for the ones which have an output value outside of the
        legal money range.
    \item All blocks where the sum of input values is smaller than the sum of
        output values are invalid. This task allows us to reuse the view created
        earlier of all input sums. Additionally, the sum of output values is
        obtained similarly to the input sums. After joining both input sums and
        output sums, we can filter for blocks which have smaller input sums than
        output sums. Those blocks are invalid.
    \item All blocks where the coinbase value is larger than the sum of the
        block creation fee and all transaction fees are invalid. This task is
        split into four queries. First, we create a view which shows all block
        ids and their coinbase values. Second, we need to know the sum of all
        input values per block. Third, we repeat that query for the sum of the
        output values per block. Lastly, these three tables are joined and all
        blocks which satisfy the constraint are invalid.
\end{enumerate}

Finally, the invalid blocks are written to the \texttt{invalid\_blocks} table
and all duplicates are removed.

\section{UTXOs}
% Fill here your answers for exercise B

\section{De-anonymization}
% Fill here your answers for exercise C

\section*{Work distribution}
%Fill in here an overview on which group member participated in which task and to which extent

\end{document}

