diff --git a/project1/a.sql b/project1/a.sql index 8941e98..cf62d53 100644 --- a/project1/a.sql +++ b/project1/a.sql @@ -102,8 +102,8 @@ WHERE sig_id <> pk_id; -- #16.1.5 Get blocks with inputs that have outputs which have already been -- spent (double-spending) --- First, get outputs that have been doubly spent -CREATE OR REPLACE VIEW outputs_doubly_spent AS ( +-- First, get outputs that have more than one input +CREATE OR REPLACE VIEW outputs_multiple_inputs AS ( SELECT output_id FROM non_coinbase_inputs JOIN outputs USING(output_id) @@ -113,14 +113,14 @@ CREATE OR REPLACE VIEW outputs_doubly_spent AS ( -- Second, get corresponding input_id where the output was first spent CREATE OR REPLACE VIEW inputs_first_spent AS ( SELECT MIN(input_id) AS input_id, output_id - FROM outputs_doubly_spent + FROM outputs_multiple_inputs JOIN non_coinbase_inputs USING(output_id) GROUP BY output_id ); -- Third, combine to get invalid blocks INSERT INTO temporary_table SELECT block_id -FROM outputs_doubly_spent +FROM outputs_multiple_inputs JOIN non_coinbase_inputs USING(output_id) WHERE input_id NOT IN ( SELECT input_id diff --git a/project1/project1.pdf b/project1/project1.pdf deleted file mode 100644 index fb6f1e9..0000000 Binary files a/project1/project1.pdf and /dev/null differ diff --git a/project1/project1.tex b/project1/project1.tex deleted file mode 100644 index 4e411c4..0000000 --- a/project1/project1.tex +++ /dev/null @@ -1,80 +0,0 @@ -\documentclass[12pt,a4paper]{article} - -\usepackage[cm]{fullpage} -\usepackage{amsthm} -\usepackage{amsmath} -\usepackage{amsfonts} -\usepackage{amssymb} -\usepackage{xspace} -\usepackage[english]{babel} -\usepackage{fancyhdr} -\usepackage{titling} -\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} -% Fill here your answers for exercise A - -\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} - diff --git a/project1/report1.pdf b/project1/report1.pdf new file mode 100644 index 0000000..1e04a66 Binary files /dev/null and b/project1/report1.pdf differ diff --git a/project1/report1.tex b/project1/report1.tex new file mode 100644 index 0000000..31992c1 --- /dev/null +++ b/project1/report1.tex @@ -0,0 +1,155 @@ +\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 + +\begin{description} + \item[Tobias Eidelpes] Code and report for Exercise A. + \item[Ege Mehmet Demirsoy] + \item[Nejra Komic] +\end{description} + +\end{document} +