Skip to main content

Full text of "Beginning-Blockchain-A-Beginner’s guide"

See other formats










Beginning 


pilelaaarlis 


A Beginners Guide to 
Building Blockchain Solutions 
Bikramaditya Singhal 


Gautam Dhameja 
Priyansu Sekhar Panda 


A Beginner's Guide to 
Building Blockchain Solutions 





Bikramaditya Singhal, Gautam Dhameja and 
Priyansu Sekhar Panda 


Beginning Blockchain 


A Beginner’s Guide to Building 
Blockchain Solutions 


Apress: 


Bikramaditya Singhal 
Bangalore, Karnataka, India 


Gautam Dhameja 
Berlin, Berlin, Germany 


Priyansu Sekhar Panda 
Bangalore, Karnataka, India 


ISBN 978-1-4842-3443-3 e-ISBN 978-1-4842-3444-0 
https://doi.org/10.1007/978-1-4842-3444-0 


Library of Congress Control Number: 2018945613 


© Bikramaditya Singhal, Gautam Dhameja, Priyansu Sekhar 
Panda 2018 


"Standard Apress" 


Trademarked names, logos, and images may appear in this 
book. Rather than use a trademark symbol with every 
occurrence of a trademarked name, logo, or image we use the 
names, logos, and images only in an editorial fashion and to the 
benefit of the trademark owner, with no intention of 
infringement of the trademark. The use in this publication of 
trade names, trademarks, service marks, and similar terms, 
even if they are not identified as such, is not to be taken as an 
expression of opinion as to whether or not they are subject to 
proprietary rights. 


While the advice and information in this book are believed to 
be true and accurate at the date of publication, neither the 
authors nor the editors nor the publisher can accept any legal 
responsibility for any errors or omissions that may be made. 


The publisher makes no warranty, express or implied, with 
respect to the material contained herein. 


Distributed to the book trade worldwide by Springer 
Science+Business Media New York, 233 Spring Street, 6th 
Floor, New York, NY 10013. Phone 1-800-SPRINGER, fax 
(201) 348-4505, e-mail orders-ny@ springer-sbm.com, or visit 
www.springeronline.com. Apress Media, LLC is a California 
LLC and the sole member (owner) is Springer Science + 
Business Media Finance Inc (SSBM Finance Inc). SSBM 
Finance Inc is a Delaware corporation. 


Introduction 


Beginning Blockchain is a book for those willing to learn about 
the technical fundamentals of Blockchain, practical 
implications, and hands-on development aspects of Blockchain 
applications. Adequate history, background, and theoretical 
aspects are covered to help you build a solid foundation for 
your Blockchain journey, and appropriate development aspects 
are covered with coding examples to help you jumpstart on 
Blockchain assignments. The first chapter introduces you to the 
Blockchain world and sets the context. The second chapter 
dives deeper into the core components of Blockchain. The third 
chapter is focused on Bitcoin’s technical concepts so what was 
discussed in the second chapter could be demonstrated with 
Bitcoin as a cryptocurrency use case of Blockchain. The fourth 
chapter is dedicated to the Ethereum Blockchain in an effort to 
demonstrate how Blockchain could be programmed for many 
more use cases and not limited to just cryptocurrencies. The 
fifth chapter is where you get the hang of Blockchain 
development with examples on basic transactions in both 
Bitcoin and Ethereum. The sixth chapter, as the final chapter, 
demonstrates the end-to-end development of a decentralized 
application (DApp). By the end of this chapter, you will have 
been equipped with enough tools and techniques to address 
many real-world business problems with applicable Blockchain 
solutions. Start your journey toward limitless possibilities. 


Any source code or other supplementary material referenced by 
the author in this book is available to readers on GitHub via the 
book’s product page, located at www.apress.com/978-1-4842- 
3443-3 . For more detailed information, please visit 
www.apress.com/source-code . 


Acknowledgments 


We'd like to thank Nikhil and Divya for their cooperation and 
support all through and many thanks to Navin for his thorough 
technical review of this book. We also thank all who have 
directly or indirectly contributed to this book. 


Table of Contents 


Chapter 1: Introduction to Blockchain 

Backstory of Blockchain 

What is Blockchain? 

Centralized vs. Decentralized Systems 
Centralized Systems 
Decentralized Systems 

Layers of Blockchain 
Application Layer 
Execution Layer 
Semantic Layer 
Propagation Layer 
Consensus Layer 

Why is Blockchain Important? 
Limitations of Centralized Systems 
Blockchain Adoption So Far 

Blockchain Uses and Use Cases 

Summary 


References 


Distributed Consensus Mechanisms 


Gas and Transaction Cost 


DApp 


References 


Index 


About the Authors and About 
the Technical Reviewer 


About the Authors 


Bikramaditya Singhal 


is a Blockchain expert and AI 
practitioner with experience 
working in multiple industries. He 
is proficient in Blockchain, 
Bitcoin, Ethereum, Hyperledger, 
cryptography, cyber security, and 
data science. He has extensive 
experience in training and 
consulting on Blockchain and has 
designed many Blockchain 
solutions. He worked with 
companies such as WISeKey, Tech 
Mahindra, Microsoft India, 
Broadridge, and Chelsio 
Communications, and he also 
cofounded a company named 
Mund Consulting that focuses on big data analytics and 
artificial intelligence. He is an active speaker at various 
conferences, summits, and meetups. He has also authored a 
book entitled Spark for Data Science. 





Gautam Dhameja 


is a Blockchain application consultant based out of Berlin, 
Germany. For most of this decade, he has been developing and 
delivering enterprise software including Web and Mobile apps, 


Cloud-based hyper-scale IoT 
solutions, and more recently, 
Blockchain-based decentralized 
applications (DApps). He 
possesses a deep understanding of 
the decentralized stack, cloud 
solutions architecture, and object- 
oriented design. His areas of 
expertise include Blockchain, 
Cloud-based enterprise solutions, 
Internet of Things, distributed 
systems, and native and hybrid 
mobile apps. He is also an active 
blogger and regularly speaks at 
tech conferences and events. 





Priyansu Sekhar Panda 


is a research engineer at 
Underwriters Laboratories, 
Bangalore, India. He has worked 
with other IT companies such as 
Broadridge, Infosys Limited, and 
Tech Mahindra. His areas of 
expertise include Blockchain, 
Bitcoin, Ethereum, Hyperledger, 
game theory, IoT, and artificial 
intelligence. Priyansu’s current 
research is on building next-gen 
applications leveraging 
Blockchain, IoT, and AI. His 
major research interests include 
building Decentralized 5 4 
Autonomous Organizations 

(DAO), and the security, scalability, and consensus of 
Blockchains. 





About the Technical Reviewer 


Navin K Manaswi 


has been developing AI 
solutions/products with the use of 
cutting-edge technologies and 
sciences related to artificial 
intelligence for many years. 
Having worked for consulting 
companies in Malaysia, 
Singapore, and the Dubai Smart 
City project, he has developed a 
rare skill of delivering end-to-end 
artificial intelligence solutions. He 
built solutions for video 
intelligence, document 
intelligence, and human-like 
chatbots in his own company. Currently, he solves B2B 
problems in verticals of healthcare, enterprise applications, 
industrial IoT, and retail in the Symphony AI incubator as 
Deep Learning-AI Architect. Through this book, he wants to 
democratize cognitive computing and services for everyone, 
especially developers, data scientists, software engineers, 
database engineers, data analysts, and CXOs. 





© Bikramaditya Singhal, Gautam Dhameja, Priyansu Sekhar Panda 2018 
Bikramaditya Singhal, Gautam Dhameja and Priyansu Sekhar Panda, Beginning 
Blockchain, https://doi.org/10.1007/978-1-4842-3444-0_1 


1. Introduction to Blockchain 


Bikramaditya Singhal: , Gautam Dhameja’ 
and Priyansu Sekhar Panda‘ 


(1) Bangalore, Karnataka, India 
(2) Berlin, Berlin, Germany 


Blockchain is the new wave of disruption that has already 
started to redesign business, social and political interactions, 
and any other way of value exchange. Again, it is not just a 
change, but a rapid phenomenon that is already in motion. As 
of this writing, more than 40 top financial institutions and 
many different firms across industries have started to explore 
blockchain to lower transaction cost, speed up transaction 
time, reduce the risk of fraud, and eliminate the middleman or 
intermediary services. Some are trying to reimagine legacy 
systems and services to take them to a new level and also come 
up with new kinds of service offerings. 

We will cover blockchain in greater detail throughout the 
book. You can follow through the chapters in the order 
presented if you are new to blockchain or pick only the ones 
relevant to you. This chapter explains what blockchain is all 
about, how it has evolved, and its importance in today’s world 
with some uses and use cases. It gives an outside-in perspective 
to you to be able to delve deeper into blockchain. 


Backstory of Blockchain 


One of the first known digital disruptions that laid the 
foundation of the Internet was TCP/IP (Transmission Control 
Protocol/Internet Protocol) back in the 1970s. Prior to TCP/IP, 
it was the era of circuit switching, which required dedicated 
connection between two parties for communication to happen. 
TCP/IP came up with its packet switching design, which was 
more open and peer-to-peer with no need to preestablish a 
dedicated line between parties. 

When the Internet was made accessible to the public 
through the World Wide Web (WWW) in the early 1990s, it 
was supposed to be more open and peer-to- peer. This is 
because it was built atop the open and decentralized TCP/IP. 
When any new technology, especially the revolutionary ones, 
hits the market, either they fade away on their own, or they 
create such an impact that they become the accepted norm. 
People adapted to the WWW revolution and leveraged the 
benefits it had to offer in every possible way. As a result, the 
World Wide Web started shaping up in a way that might not 
have been the exact way it was imagined. It could have been 
more open, more accessible, and more peer-to-peer. Many new 
technologies and businesses started to build on top of it and it 
became what it is today—more centralized. Slowly and 
gradually, people get used to what technology offers. People are 
just fine if an international transaction takes days to settle, or it 
is too expensive, or it is less reliable. 

Let us take a closer look at the banking system and its 
evolution. Starting from the olden days of barter system till fiat 
currencies, there was no real difference between a transaction 
and its settlement because they were not two separate entities. 
As an example, if Alice had to pay $10 to Bob, she would just 
hand over a $10 note to Bob and the transaction would just get 
settled there. No bank was needed to debit $10 from Alice’s 
account and credit the same to Bob’s account or to serve as a 
system of trust to ensure Alice does not cheat Bob. However, 
transacting directly with someone who is physically not present 
close by was difficult. So, banking systems evolved with many 


more service offerings and enabled transactions from every 
corner of the world. With the help of the Internet, geography 
was no more a limitation and banking became easier than ever. 
Not just banking for that matter: the Internet facilitated many 
different kinds of value exchange over the web. 

Technology enabled someone from India to make a 
monetary transaction with someone in the United Kingdom, 
but with some cost. It takes days to settle such transactions and 
is expensive as well. A bank was always needed to impose trust 
and ensure security for such transactions between two or more 
parties. What if technology could enable trust and security 
without these intermediary and centralized systems? 
Somehow, this part (of technology imposing trust) was missing 
all through, which resulted in development of centralized 
systems such as banks, escrow services, clearing houses, 
registrars and many other such institutions. Blockchain proves 
to be that missing piece of the Internet revolution puzzle that 
facilitates a trustless system in a cryptographically secured way. 

Satoshi Nakamoto, the pseudonymous name by which the 
world knows him, must have felt that the monetary systems 
were not touched by the technological revolution since the 
1980s. Banks formed the centralized institutions that 
maintained the transaction records, governed interactions, 
enforced trust and security, and regulated the whole system. 
The whole of commerce relies on these financial institutions, 
which serve as the trusted third parties to process payments. 
The mediation of financial institutions increases cost and time 
to settle a transaction, and also limits the transaction sizes. The 
mediation was needed to settle disputes, but that meant that 
completely nonreversible transaction was never possible. This 
resulted in a situation where trust was needed for someone to 
transact with another. Certainly, this bureaucratic system had 
to change to keep up with the economy’s expected digital 
transformation. So, Satoshi invented a cryptocurrency called 
Bitcoin that was enabled by the underlying technology— 
blockchain. Bitcoin is just one monetary use case of blockchain 
that addresses the inherent weakness of trust-based models. 
We will delve deeper into the fundamentals of both Bitcoins 
and blockchain in this book. 


What is Blockchain? 


The Internet has revolutionized many aspects of life, society, 
and business. However, we learned in the previous section that 
how people and organizations execute transactions with one 
another has not changed much in the past couple of decades. 
Blockchain is believed to be the component that completes the 
Internet puzzle and makes it more open, more accessible, and 
more reliable. 

To understand blockchain, you have to understand it from 
both a business perspective and technical perspective. Let us 
first understand it in a business transaction context to get the 
“what” of it, and then look into the technicality to understand 
the “how” of it in the following chapters. 

Blockchain is a system of records to transact value (not just 
money!) in a peer-to-peer fashion. What it means is that there 
is no need for a trusted intermediary such as banks, brokers, or 
other escrow services to serve as a trusted third party. For 
example, if Alice pays to Bob $10, why would it go through a 
bank? Take a look at Figure 1-1. 


~ 
allt 


y 


Paid Bob $10 4 


! mans 
Bob 


{) Pay Bob $10 


Transacting through Trusted Intermediary; Bank 


v 


od 
= 
o 


{) Alice Pays $10 to Bob /Bob gets $10 


= Peer-to-Peer Transaction: Blockchain 


= E> 


Figure 1-1 Transaction through an intermediary vs. peer-to-peer 
transaction 


Let us look at a different example now. A typical stock 
transaction happens in seconds, but its settlement takes weeks. 
Is it desirable in this digital age? Certainly not! Figure 1-2 
demonstrates the current situation. 


a 


Company-B 





Stocks settlement through clearing houses 


Figure 1-2 Stocks trading through an intermediary clearing house 


If someone wants to buy some stocks from a company or a 
person, they can just directly buy it from them with instant 
settlement, with no need for brokers, clearing houses, or other 
financial institutions in between. A decentralized and peer-to- 
peer solution to such a situation can be represented as in 
Figure 1-3. 


» Company-A 
Py 


el 


Company-B 
tf 


&S 


Peer-to-Peer trading: Blockchain 


Figure 1-3 Peer-to-peer stock trading 





Please note that transaction and settlement are not two 
different entities in a blockchain setting! The transactions are 
analogous to, say, fiat currency transactions where if someone 
pays another a $10 note, they do not own it anymore and that 
$10 note is physically transferred to the new owner. 


Now that you understand blockchain from a functional 
perspective, at a high level, let us look into it a little technically, 
and the reason for naming it “blockchain” becomes clearer. We 
will see “What” it is technically and leave the “How” it works to 
Chapter 2. 

Read the following statements and do not worry if the 
concepts do not fit together well for your complete 
understanding. You may want to revisit it, but be patient till 
you finish reading this book. 


e Blockchain is a peer-to-peer system of transacting values 
with no trusted third parties in between. 


e It is a shared, decentralized, and open ledger of 


transactions. This ledger database is replicated across a 
large number of nodes. 


e This ledger database is an append-only database and 


cannot be changed or altered. It means that every entry is 
a permanent entry. Any new entry on it gets reflected on 
all copies of the databases hosted on different nodes. 


e There is no need for trusted third parties to serve as 


intermediaries to verify, secure, and settle the 
transactions. 


e It is another layer on top of the Internet and can coexist 
with other Internet technologies. 


e Just the way TCP/IP was designed to achieve an open 
system, blockchain technology was designed to enable true 
decentralization. In an effort to do so, the creators of 
Bitcoin open-sourced it so it could inspire many 
decentralized applications. 


A typical blockchain may look as shown in Figure 1-4. 


Previous Block Previous Bloc Previnus Slock Previous Block 


Transactions Transact ons fire = |arisactions 


Transactions 





‘ 
‘wae Block-2 Block-3 Block-4 Block-1265 
Block-1 


Figure 1-4 The blockchain data structure 


Every node on the blockchain network has an identical copy 
of the blockchain shown in Figure 1-4, where every block is a 
collection of transactions, hence the name. As you can see, 
there are two major parts in every block. The “header” part 
links back to the previous block in the chain. What it means is 
that every block header contains the hash of the previous block 
so that no one can alter any transaction in the previous block. 
We will look into further details of this concept in the following 
chapters. The other part of a block is the “body content” that 
has a validated list of transactions, their amounts, the 
addresses of the parties involved, and some more details. So, 
given the latest block, it is feasible to access all the previous 
blocks in a blockchain. 

Let us consider a practical example and see how the 
transactions take place and the ledger gets updated across the 
network, to see how this system works: 

Assume that there are three candidates—Alice, Bob, and 
Charlie—who are doing some monetary transactions among 
each other on a blockchain network. Let us go through the 
transactions step by step to understand blockchain’s open and 
decentralized features. 

Step-1: 

Let us assume that Alice had $50 with her, which is the 
genesis of all transactions and every node is aware of it, as 
shown in Figure 1-5. 








Genesis 
Alien: tas $50 
Alice 
Ceresis 
Mire hin SM 
Dave 


Figure 1-5 The genesis block 


Step-2: 


Boh 


em 


7) 


Genesis 





fhice: bas Sst 


Grresis 


Alice has $50 





Alice makes a transaction by paying $20 to Bob. Observe 
how the blockchain gets updated at each node, as shown in 


Figure 1-6. 


Geronis a 
Alloa say: S20 to Boh 


Alica has 550 


Alica -> Bod: $20 





Alice 


Genesis 


Alice has Soi 


Allee > Bob: $20 


Dave 





Figure 1-6 The first transaction 


Step-3: 


Beb 


“” 


aed 





Sanesls 


Alive has bbU 


Allee -» 


Boh S20) 





Bob makes another transaction by paying $10 to Charlie 
and the blockchain gets updated as shown in Figure 1-7. 


- Genesis 
Alles say: S20 to Bok | ; 
_—_—_—_——~ Alicea has So 


Aline » Aah: $90 


=) 
La 


Dob-» Charlie: $10 Gob-> Charlie: $10 


ts Medaes o 


Genesis Genesis 


Alice has $50 


Aline has S50 


Mige => Bab: $20 





o 
=> 
q 

=a 


E> arya eS 





Dave 


Figure 1-7 The second transaction 


Please note that the transaction data in the blocks is 
immutable. All transactions are fully irreversible. Any change 
would result in a new transaction, which would get validated by 
all contributing nodes. Every node has its own copy of 
blockchain. 

If there are many questions popping up in your mind, such 
as “What if Alice pays the same amount to Dave to double- 
spend the same amount, or what if she is making a payment 
without having enough funds in her account?,” “How is the 
security ensured?,” and so on, that is wonderful! We are going 
to cover those details in the following chapters. 


Centralized vs. Decentralized Systems 


The very reason we are looking into the debate on 
centralization vs. decentralization is because blockchain is 
designed to be decentralized, defying the centralized design. 
However, the terns decentralized and centralized are not 
always clear. They are very poorly defined and misleading in 
many places. The reason is that there is almost no system that 
is purely centralized or decentralized. Most of the concepts and 
examples in this section are inspired from the notes of Mr. 
Vitalik Buterin, the founder of Ethereum blockchain. 


What is a distributed system then? Just so it does not mess 
with the current discussion, let us understand it first and take it 
off the list. Please note that whether a system is centralized or 
decentralized, it can still be distributed. A centralized 
distributed system is one in which there is, say, a master node 
responsible for breaking down the tasks or data and distribute 
the load across nodes. On the other hand, a decentralized 
distributed system is one where there is no “master” node as 
such and yet the computation may be distributed. Blockchain is 
one such example, and we will look at many diagrammatic 
representations of it later in this book. Figure 1-8 is a pictorial 
representation of how a centralized distributed system may 
look. 


Master 








- x & x 
i x. ne 
= Y MEISE ook ma 
ee ss gf Network XN Bias 
2 4 | \ ~s je 
a \ 
“ “ , / 1 \ ~ “4 
x € 4 + ‘ ‘ “ 
Node-1 Node-2 Node-3 Node-4 Node-N 


Figure 1-8 A distributed system with centralized control 


This representation is similar to Hadoop implementation, 
as an example. Though the computation is faster in such 
designs because of distributed computing, it also suffers from 
limitations due to centralization . 

Let us resume our discussion on centralization vs. 
decentralization. It is extremely important to note that for a 
system to be centralized/decentralized is not just limited to the 
technical architecture. What we intend to say is that a system 


can be centralized or decentralized technically, but may not be 
so logically or politically. Let us take a look at these different 
perspectives to be able to design a system correctly based on 
the requirement: 

Technical Architecture: A system can be centralized or 
decentralized from a technical architecture point of view. What 
we consider is how many physical computers (or nodes) are 
used to design a system, how many node failures it can sustain 
before the whole system goes down, etc. 

Political perspective: This perspective indicates the 
control that an individual, or a group of people, or an 
organization as a whole has on a system. If the computers of 
the system are controlled by them, then the system is naturally 
centralized. However, if no specific individual or groups control 
the system and everyone has equal rights on the system, then it 
is a decentralized system in a political sense! 

Logical perspective: A system can be logically centralized 
or decentralized based on how it appears to be, irrespective of 
whether it is centralized or decentralized technically or 
politically. An alternative analogy could be that if you vertically 
cut a system (say of computing devices) in half with every half 
having service providers and consumers, if they can operate as 
independent units they are decentralized and centralized 
otherwise. 

All the aforementioned perspectives are crucial in designing 
a real-life system and calling it centralized or decentralized. Let 
us discuss some of the examples mixing these perspectives to 
clear up any confusion you might have: 


e If you look at the corporates, they are architecturally 


centralized (one head office), they are politically 
centralized (governed by a CEO or the board), and they are 
logically centralized as well. (You can’t really split them in 
halves.) 


¢ Our language of communication is decentralized from 
every perspective—architecturally, politically, as well as 
logically. For two people to communicate with each other, 
in general, their language is neither politically influenced 


nor logically dependent on the language of communication 
of other people. 


e The torrent systems such as BitTorrent are also 
decentralized from every perspective. Any node can be a 
provider or a consumer, so even if you cut the system into 
halves, it still sustains. 


e The Content Delivery Network on the other hand is 


architecturally decentralized, logically also decentralized, 
but is politically centralized because it is owned by 
corporates. An example is Amazon CloudFront. 


e Let us consider blockchain now. The objective of 
blockchain was to enable decentralization. So, it is 
architecturally decentralized by design. Also, it is 
decentralized from a political viewpoint, as nobody 
controls it. However, it is logically centralized, as there is 
one common agreed state and the whole system behaves 
like a single global computer. 


Let us explore these terms separately and have a 
comparative view to be able to appreciate why blockchain is 
decentralized by design. 


CENTRALIZED SYSTEMS 


As the name suggests, a centralized system has a centralized 
control with all administrative authority. Such systems are easy 
to design, maintain, impose trust, and govern, but suffer from 
many inherent limitations, as follows: 


e They have a central point of failure, so are less stable. 
e They are more vulnerable to attack and hence less secured. 
¢ Centralization of power can lead to unethical operations. 


e Scalability is difficult most of the time. 


A typical centralized system may appear as shown in Figure 
1-9. 









Clien 













Afome =" Server rene 4 
Client-2 Client-3 


Figure 1-9 A centralized system 


DECENTRALIZED SYSTEMS 


As the name suggests, a decentralized system does not have a 
centralized control and every node has equal authority. Such 
systems are difficult to design, maintain, govern, or impose 
trust. However, they do not suffer from the limitations of 
conventional centralized systems. Decentralized systems offer 
the following advantages: 


e They do not have a central point of failure, so more stable 
and fault tolerant 


e Attack resistant, as no central point to easily attack and 
hence more secured 


e Symmetric system with equal authority to all, so less scope 
of unethical operations and usually democratic in nature 


A typical decentralized system may appear as shown in 
Figure 1-10. 





Node-5 Node-6 


Figure 1-10 A decentralized system 


Please note that a distributed system can also be 
decentralized. An example would be blockchain! However, 
unlike common distributed systems, the task is not subdivided 
and delegated to nodes, as there is no master who would do 
that in blockchain. The contributing nodes do not work on a 
portion of the work, rather, the interested nodes (or the ones 
chosen at random) perform the entire work. A typical 
decentralized and distributed system, which is effectively a 
peer-to-peer system, may appear as shown in Figure 1-11. 





Figure 1-11 A decentralized and peer-to-peer system 


Layers of Blockchain 


As of this writing, the public blockchain variants such as 
Ethereum are in the process of maturing, and building complex 
applications on top of these blockchains may not be a good 
idea. Keep in mind that blockchain is never just a piece of 
technology, but a combination of business principles, 
economics, game theory, cryptography, and computer science 
engineering. Most of the real-world applications are quite 
complex in nature, and it is advisable to build blockchain 
solutions from the ground up. 

The purpose of this section is only to provide you with a 
bird’s eye view of various blockchain layers, and delve deeper 
into the core fundamentals in the following chapters. To start 
with, let us just recollect our basic understanding of the TCP/IP 
protocol stack. The layered approach in the TCP/IP stack is 
actually a standard to achieve an open system. Having 
abstraction layers not only helps in understanding the stack 
better, but also helps in building products that are compliant to 
the stack to achieve an open system. Also, having the layers 


abstract from each other makes the system more robust and 
easy to maintain. Any change to any of the layers doesn’t 
impact the other layers. Again, the TCP/IP analogy is not to be 
confused with the blockchain layers. TCP/IP is a 
communication protocol that every Internet application uses, 
and so is blockchain. 

Enter the blockchain. There are no agreed global standards 
yet that would clearly segregate the blockchain components 
into distinct layers. A layered heterogeneous architecture is 
needed, but for now that is still in the future. So, we will try to 
formulate blockchain layers to be able to understand the 
technology better and build a comparative analogy between 
hundreds of blockchain/Cryptocurrency variants out there in 
the market. Take a look at the high-level, layered 
representation of blockchain in Figure 1-12. 


Application Layer is 
Execution Layer #. 
Semantic Layer aR 
Propagation Layer OF 
Consensus Layer eS 


Figure 1-12 Various layers of blockchain 

















You may be wondering why five layers and why not more 
granular layers, or fewer layers. Obviously, there cannot be too 
many or too few layers; it is going to be a trade-off driven 
among complexity, robustness, adaptability, etc., to name a 
few. The purpose again is not really to standardize blockchain 


technology, but to build a better understanding. Please keep in 
mind that all these layers are present on all the nodes. 

In Chapter 6 of this book, we will be building a 
decentralized application from scratch and learning how 
blockchain functions on all these layers with a practical use 
case. 


APPLICATION LAYER 


Because of the characteristics of blockchain, such as 
immutability of data, transparency among participants, 
resilience against adversarial attacks etc., there are multiple 
applications being built. Certain applications are just built in 
the application layer, taking for granted any available “flavor” 
of blockchain, and some applications are built in the 
application layer and are interwoven with other layers in 
blockchain. This is the reason the application layer should be 
considered a part of blockchain. 

This is the layer where you code up the desired 
functionalities and make an application out of it for the end 
users. It usually involves a traditional tech stack for software 
development such as client-side programming constructs, 
scripting, APIs, development frameworks, etc. For the 
applications that treat blockchain as a backend, those 
applications might need to be hosted on some web servers and 
that might require web application development, server-side 
programming, and APIs, etc. Ideally, good blockchain 
applications do not have a client-server model, and there are 
no centralized servers that the clients access, which is just the 
way Bitcoin works. 

You probably have heard or already learned about the off- 
chain networks. The idea is to build applications that wouldn’t 
use blockchain for anything and everything, but use it wisely. 
In other words, this concept is to ensure that the heavy lifting is 
done at the application layer, or bulky storage requirements are 
taken care of off the chain so that the core blockchain is light 
and effective and the network traffic is not too much. 


EXECUTION LAYER 


The Execution Layer is where the executions of instructions 
ordered by the Application Layer take place on all the nodes in 
a blockchain network. The instructions could be simple 
instructions or a set of multiple instructions in the form of a 
smart contract . In either case, a program or a script needs to 
be executed to ensure the correct execution of the transaction. 
All the nodes in a blockchain network have to execute the 
programs/scripts independently. Deterministic execution of 
programs/scripts on the same set of inputs and conditions 
always produces the same output on all the nodes, which helps 
avoid inconsistencies. 

In the case of Bitcoins, these are simple scripts that are not 
Turing-complete and allow only a few set of instructions. 
Ethereum and Hyperledger, on the other hand, allow complex 
executions. Ethereum’s code or its smart contracts written in 
solidity gets compiled to Bytecode or Machine Code that gets 
executed on its own Ethereum Virtual Machine. Hyperledger 
has a much simpler approach for its chaincode smart contracts. 
It supports running of compiled machine codes inside docker 
images, and supports multiple high-level lanuages such as Java 
and Go. 


SEMANTIC LAYER 


The Semantic Layer is a logical layer because there is an 
orderliness in the transactions and blocks. A transaction, 
whether valid or invalid, has a set of instructions that gets 
through the Execution Layer but gets validated in the Semantic 
Layer. If it is Bitcoin, then whether one is spending a legitimate 
transaction, whether it is a double-spend attack, whether one is 
authorized to make this transaction, etc., are validated in this 
layer. You will learn in the following chapters that Bitcoins are 
actually present as transactions that represent the system state. 
To be able to spend a Bitcoin, you have to consume one or 
more previous transactions and there is no notion of Accounts. 
This means that when someone makes a transaction, they use 
one of the previous transactions where they had received at 
least the amount they are spending now. This transaction must 
be validated by all the nodes by traversing previous 


transactions to see if it is a legitimate transaction. Ethereum, 
on the other hand, has the system of Accounts. This means that 
the account of the one making the transaction and that of the 
one receiving it both get updated. 

In this layer, the rules of the system can be defined, such as 
data models and structures. There could be situations that are a 
little more complex compared with simple transactions. 
Complex instruction sets are often coded into smart contracts. 
The system’s state gets updated when a smart contract is 
invoked upon receiving a transaction. A smart contract is a 
special type of account that has executable code and private 
states. A block usually contains a bunch of transactions and 
some smart contracts. The data structures such as the Merkle 
tree are defined in this layer with the Merkle root in the block 
header to maintain a relation between the block headers and 
the set of transactions in a block (usually Key-Value storage on 
disk). Also, the data models, storage modes, in-memory/disk 
based processing, etc. can be defined in this logical layer. 

Apart from the aforementioned, it is the semantic layer that 
defines how the blocks are linked with each other. Every block 
in a blockchain contains the hash of the previous block, all the 
way to the genesis block. Though the final state of the 
blockchain is achieved by the contributions from all the layers, 
the linking of blocks with each other needs to be defined in this 
layer. Depending on the use case, you might want to code up an 
additional functionality in this layer. 


PROPAGATION LAYER 


The previous layers were more of an individual phenomenon: 
not much coordination with other nodes in the system. The 
Propagation Layer is the peer-to-peer communication layer 
that allows the nodes to discover each other, and talk and sync 
with each other with respect to the current state of the network. 
When a transaction is made, we know that it gets broadcast to 
the entire network. Similarly, when a node wants to propose a 
valid block, it gets immediately propagated to the entire 
network so that other nodes could build on it, considering it as 
the latest block. So, transaction/block propagation in the 


network is defined in this layer, which ensures stability of the 
whole network. By design, most of the blockchains are 
designed such that they forward a transaction/block 
immediately to all the nodes they are directly connected to, 
when they get to know of a new transaction/block. 

In the asynchronous Internet network , there are often 
latency issues for transaction or block propagation. Some 
propagations occur within seconds and some take more time, 
depending on the capacity of the nodes, network bandwidth, 
and a few more factors. 


CONSENSUS LAYER 


The Consensus Layer is usually the base layer for most of the 
blockchain systems. The primary purpose of this layer is to get 
all the nodes to agree on one consistent state of the ledger. 
There could be different ways of achieving consensus among 
the nodes, depending on the use case. Safety and security of the 
blockchain is accertained in this layer. In Bitcoin or Ethereum, 
the consensus is achieved through proper incentive techniques 
called “mining.” For a public blockchain to be self-sustainable, 
there has to be some sort of incentivization mechanisms that 
not only helps in keeping the network alive, but also enforces 
consensus . Bitcoin and Ethereum use a Proof of Work (PoW) 
consensus mechanism to randomly select a node that can 
propose a block. Once that block is proposed and propagated to 
all the nodes, they check to see if it a valid block with all 
legitimate transactions and that the PoW puzzle was solved 
properly; they add this block to their own copy of blockchain 
and build further on it. There are many different variants of 
consensus protocols such as Proof of Stake (PoS), deligated PoS 
(dPoS), Practical Byzantine Fault Tolerance (PBFT), etc., which 
we will cover in great detail in the following chapters. 


Why is Blockchain Important? 


We looked at the design aspects of centralized and 
decentralized systems and got some idea of the technical 


benefits of decentralized systems over centralized ones. We 
also learned about different layers of blockchain. Blockchain, 
being a decentralized peer-to-peer system, has some inherent 
benefits and complexities. Keep in mind that it is not a silver 
bullet that can address all the problem areas in the world, but 
there are specific cases where it is the need of the hour. There 
are also scenarios where blockchainizing the existing solution 
makes it more robust, transparent, and secured. However, it 
can as well lead to disaster if not done the right way! Let us 
now keep a business and functional perspective in mind and 
analyze blockchain. 


LIMITATIONS OF CENTRALIZED 
SYSTEMS 


If you take a quick glance at the software evolution landscape, 
you will see that many software solutions have a centralized 
design. The reason is not just because they are easy to develop 
and maintain, but because we are used to such a design to be 
able to trust the system. We always need a trusted third party 
who can assure we are not being cheated or becoming victims 
of a scam. Without a prior business relationship, it is difficult 
to trade with someone or even scale up. One would probably 
not do business with someone they have never known. 

Let us take an example to understand it better. Today when 
we order something from Amazon, we feel safe and assured of 
the item’s delivery. The producer of the item is someone and 
the buyer is someone else. Then what role is being played by 
Amazon here? It is there as an enabler functioning as a trusted 
intermediary, and also to take some cut of the transaction. The 
buyer trusts the seller where the trust relation is actually 
imposed by such trusted third parties. What blockchain 
proposes is that, in the modern digital era, we do not really 
need a third party in between to impose trust, and the 
technology has matured enough to handle it. In blockchain, 
trust is an inherent part of the network by default, which we 
will explore more in upcoming chapters. 

Let us quickly learn a few downsides of a conventional 
centralized system: 


e Trust issues 
e Security issue 
e Privacy issue—data sale privacy is being undermined 


e Cost and time factor for transactions 


Some of the advantages of decentralized systems over 
centralized systems could be: 


e Elimination of intermediaries 

e Easier and genuine verification of transactions 
e Increased security with lower cost 

e Greater transparency 


e Decentralized and immutable 


BLOCKCHAIN ADOPTION SO FAR 


Blockchain came along with Bitcoin, a digital cryptocurrency, 
in 2009 via a simple mailing list. Soon after it was launched, 
people could realize its true potential beyond just 
cryptocurrency. Some companies came up with different 
flavors of blockchain offerings such as Ethereum, Hyperledger, 
etc. Microsoft and IBM came up with SaaS (Software as a 
Service) offerings on their Azure and Bluemix cloud platforms, 
respectively. Different start-ups were formed, and many 
established companies took blockchain initiatives that focused 
on solving some business problems that were not easily solved 
before. 

It is too late now to just say that blockchain has tremendous 
potential to disrupt almost every industry in some way or the 
other; the revolution has already started. It has hugely 
impacted the financial services market. It is difficult to name a 
global bank or finance entity not exploring blockchain. Apart 
from the financial market, initiatives have already been/are 
already being taken in areas such as media and entertainment, 


energy trading, prediction markets, retail chains, loyalty 
rewards systems, insurance, logistics and supply chains, 
medical records, and also government and military 
applications. 

As of this writing, the current situation is such that many 
start-ups and companies are able to see how a blockchain- 
based system can really address some pain areas and become 
beneficial in many ways. However, designing the right kind of 
blockchain solution is quite challenging. There are some really 
great ideas for a blockchain-based product or solution, but it is 
equally difficult to either build them or implement them. There 
are some use cases that can only be built on a public 
blockchain. Designing a self-sustainable blockchain with a 
proper mining ecosystem is difficult, and when it comes to the 
existing public blockchains to build non-cryptocurrency 
applications there is none other than Ethereum. Whether a 
blockchain application is to be built in the Application Layer 
only and use the underlying layers as they are, or the 
application needs to be built from the ground up, is something 
difficult to decide. There are some technical challenges, too. 
Blockchain is still maturing, and it may take few more years for 
mainstream adoption. As of today, there are multiple 
propositions to address the scalability issues of blockchain. We 
will try to build a solid understanding on all these perspectives 
in this entire book. For now, let us see some of the specific uses 
and use cases in the following section. 


Blockchain Uses and Use Cases 


In this section, we will look at some of the initiatives that are 
already being taken across industries such as finance, 
insurance, banking, healthcare, government, supply chains, IoT 
(Internet of Things), and media and entertainment to name a 
few. The possibilities are limitless, however! A true sharing 
economy, which was difficult to achieve in centralized systems, 
is possible using blockchain technology (e.g., peer-to-peer 
versions of Uber, AirBNB). It is also possible to enable citizens 
to own their identity (Self-Sovereign Digital Identity) and 


monetize their own data using this technology. For now, let us 
take a look at some of the existing use cases. 


Any type of property or asset, whether physical or digital, 


such as laptops, mobile phones, diamonds, automobiles, 
real estate, e-registrations, digital files, etc. can be 
registered on blockchain. This can enable these asset 
transactions from one person to another, maintain the 
transaction log, and check validity or ownerships. Also, 
notary services, proof of existence, tailored insurance 
schemes, and many more such use cases can be developed. 


There are many financial use cases being developed on 


blockchain such as cross-border payments, share trading, 
loyalty and rewards system, Know Your Customer (KYC) 
among banks, etc. Initial Coin Offering (ICO) is one of the 
most trending use cases as of this writing. ICO is the best 
way of crowdsourcing today by using cryptocurrency as 
digital assets. A coin in an ICO can be thought of as a 
digital stock in an enterprise, which is very easy to buy and 
trade. 


Blockchain can be used to enable “The Wisdom of Crowds” 


to take the lead and shape businesses, economies, and 
various other national phenomena by using collective 
wisdom! Financial and economic forecasts based on the 
wisdom of crowds, decentralized prediction markets, 
decentralized voting, as well as stocks trading can be 
possible on blockchain. 


The process of determining music royalties has always 


been convoluted. The Internet-enabled music streaming 
services facilitated higher market penetration, but made 
the royalty determination more complex. This concern can 
pretty much be addressed by blockchain by maintaining a 
public ledger of music rights ownership information as 
well as authorised distribution of media content. 


This is the IoT era, with billions of IoT devices everywhere 
and many more to join the pool. A whole bunch of 


different makes, models, and communication protocols 
makes it difficult to have a centralized system to control 
the devices and provide a common data exchange 
platform. This is also an area where blockchain can be 
used to build a decentralized peer-to-peer system for the 
IoT devices to communicate with each other. ADEPT 
(Autonomous Decentralized Peer-To-Peer Telemetry) is a 
joint initiative from IBM and Samsung that has developed 
a platform that uses elements of the Bitcoin’s underlying 
design to build a distributed network of devices—a 
decentralized IOT. ADEPT uses three protocols: 
BitTorrent for file sharing, Ethereum for smart contracts, 
and TeleHash for peer-to-peer messaging in the platform. 
The IOTA foundation is another such initiative. 


e In the government sectors as well, blockchain has gained 


momentum. There are use cases where technical 
decentralization is necessary, but politically should be 
governed by governments: land registration, vehicle 
registration and management, e-Voting, etc. are some of 
the active use cases. Supply chains are another area where 
there are some great use cases of blockchain. Supply 
chains have always been prone to disputes across the 
globe, as it was always difficult to maintain transparency 
in these systems. 


Summary 


In this chapter, we covered the evolution of blockchain, the 
history of it, what it is, the design benefits, and why it is so 
important with some relevant use cases. In this section, we will 
conclude with its game-changing offerings, in line with the 
technology revolution. 

In the 1990s, mass adoption of the Internet changed the 
way people did business. It removed friction from creation and 
distribution of information. This paved the way for new 
markets, more opportunities, and possibilities. Similarly, 
blockchain is here today to take the Internet to a whole new 


level by removing friction along three key areas: Control, Trust, 
and Value. 

Control: Blockchain enabled distribution of the control by 
making the system decentralized. 

Trust: Blockchain is an immutable, tamper-resistant 
ledger. It gives a single, shared source of truth to all nodes, 
making the system trustless. What it means is that trust is no 
longer needed to transact with any unknown person or entity 
and is inherent by design. 

Value: Blockchain enables exchange of value in any form. 
One can issue and transfer assets without central entities or 
intermediaries. 

In Chapter 2, we will take a deep dive into the blockchain 
fundamentals. 





References 


The Meaning of Decentralization 

Buterin, Vitalik, “The Meaning of Decentralization,” 
Medium, https://medium.com/@VitalikButerin/the- 
meaning-of-decentralization-a0c92b76a274, 
February 6, 2017. 

BlockChain Technology 

Crosby, Michael; Nachiappan; Pattanayak, Pradhan; 
Verma, Sanjeev; Kalyanaraman, Vignesh, “BlockChain 
Technology: Beyond Bitcoin,” Berkeley, CA: Sutardja Center for 
Entrepreneurship & Technology, University of California, 
http://scet.berkeley.edu/wp- 
content/uploads/BlockchainPaper.pdf , October 16, 
2015. 

Torpey, Kyle, “Eric Lombrozo: Bitcoin Needs Protocol 
Layers Similar to the Internet,” CoinJournal, 
ihenos?/ / Coin] Ournal~neLyer e¢—Lompro.o—-ba tocol 
needs-protocol-layers-similar-to-the-internet/ 
, January 28, 2016. 

Blockbench: A Framework for Analyzing Private 
blockchains 


Dinh, Tien Tuan Anh; Wang, Ji; Chen, Gang; Liu, Rui; Ooi, 
Beng Chin; Tan, Kian-Lee, “Blockbench: A Framework for 
Analyzing Private blockchains,” 
hetpss) /arxry.ordg/pdt/1703 04057. ode , March 12, 
2017, 


© Bikramaditya Singhal, Gautam Dhameja, Priyansu Sekhar Panda 2018 
Bikramaditya Singhal, Gautam Dhameja and Priyansu Sekhar Panda, Beginning 
Blockchain, https://doi.org/10.1007/978-1-4842-3444-0_2 


2. How Blockchain Works 


Bikramaditya Singhal: , Gautam Dhameja: and 
Priyansu Sekhar Panda' 


(1) Bangalore, Karnataka, India 
(2) Berlin, Berlin, Germany 


We stand at the edge of a new digital revolution. Blockchain 
probably is the biggest invention since the Internet itself! It is the 
most promising technology for the next generation of Internet 
interaction systems and has received extensive attention from many 
industry sectors as well as academia. Today, many organizations 
have already realized that they needed to be blockchain ready to 
sustain their positions in the market. We already looked at a few use 
cases in Chapter 1, but the possibilities are limitless. Though 
blockchain is not a silver bullet for all business problems, it has 
started to impact most business functions and their technology 
implementations. 

To be able to solve some real-world business problems using 
blockchain, we actually need a fine-grained understanding of what it 
is and how it works. For this, it needs to be understood through 
different perspectives such as business, technical, and legal 
viewpoints. This chapter is an effort to get into the nuts and bolts of 
blockchain technology and get a complete understanding of how it 
works. 


Laying the Blockchain Foundation 


Blockchain is not just a technology, it is mostly coupled with 
business functions and use cases. In its cryptocurrency 
implementations, it is also interwoven with economic principles. In 
this section, we will mainly focus on its technical aspects. 
Technically, blockchain is a brilliant amalgamation of the concepts 
from cryptography, game theory, and computer science engineering, 
as shown in Figure 2-1. 





Game Theory 


Figure 2-1 Blockchain at its core 


Let us take a look at what role these components play in the 
blockchain system at a high level and dig deeper into the 
fundamentals eventually. Before that, let us quickly revisit how the 
traditional centralized systems worked. The traditional approach was 
that there would be a centralized entity that would maintain just one 
transaction/modification history. This was to exercise concurrency 
control over the entire database and inject trust into the system 
through intermediaries. What was the problem with such a stable 
system then? A centralized system has to be trusted, whether those 
involved are honest or not! Also, cost due to intermediaries and the 
transaction time could be greater for obvious reasons. Now think 


about the centralization of power; having full control of the entire 
system enables the centralized authorities to do almost anything they 
want. 

Now, let us look at how blockchain addresses these issues due to 
centralized intermediaries by using cryptography, game theory, and 
computer science concepts. Irrespective of the use case, the 
transactions are secured using cryptography. Using cryptography, it 
can be ensured that a valid user is initiating the transaction and no 
one can forge a fraudulent transaction. This means, 
cryptographically it can be ensured that Alice in no way can make a 
transaction on behalf of Bob by forging his signature. Now, what if a 
node or a user tries to launch a double-spend attack (e.g., one has 
just ten bucks and tries to pay the same to multiple people)? Pay 
close attention here—despite not having sufficient funds, one can still 
initiate a double-spend, which is cryptographically correct. The only 
way to prevent double-spend is for every node to be aware of all the 
transactions. Now this leads to another interesting problem. Since 
every node should maintain the transaction database, how can they 
all agree on a common database state? Again, how can the system 
stay immune to situations where one or more computing nodes 
deliberately attempt to subvert the system and try to inject a 
fraudulent database state? The majority of such problems come 
under the umbrella of the Byzantine Generals’ Problem (described 
later). Well, it gained even more popularity because of blockchain, 
but it has been there for ages. If you look at the data center solutions, 
or distributed database solutions, the Byzantine Generals’ Problem is 
an obvious and common problem that they deal with to remain fault 
tolerant. Such situations and their solution actually come from game 
theory. The field of game theory provides a radically different 
approach to determine how a system will behave. The techniques in 
game theory are arguably the most sophisticated and realistic ones. 
They usually never consider if a node is honest, malicious, ethical, or 
has any other such characteristics and believe that the participants 
act according to the advantage they get, not by moral values. The sole 
purpose of game theory in blockchain is to ensure that the system is 
stable (i.e., in Nash Equilibrium) with consensus among the 
participants. 

There are different kinds of business problems and situations 
with varying degrees of complexities. So, the underlying crypto and 
game theoretic consensus protocols could be different in different 
use cases. However, the general principle of maintaining a consistent 
log or database of verified transactions is the same. Though the 


concepts of cryptography and game theory have been around for 
quite some time now, it is the computer science piece that stitches 
these bits and pieces together through data structures and peer-to- 
peer network communication technique. Obviously, it is the “smart 
software engineering” that is needed to realize any logical or 
mathematical concepts in the digital world. It is then the computer 
science engineering techniques that incorporate cryptography and 
game theoretic concepts into an application, enabling decentralized 
and distributed computing among the nodes with data structure and 
network communication components. 


Cryptography 

Cryptography is the most important component of blockchain. It is 
certainly a research field in itself and is based on advanced 
mathematical techniques that are quite complex to understand. We 
will try to develop a solid understanding of some of the 
cryptographic concepts in this section, because different problems 
may require different cryptographic solutions; one size never fits all. 
You may skip some of the details or refer to them as and when 
needed, but it is the most important component to ensure security in 
the system. There have been many hacks reported on wallets and 
exchanges due to weaker design or poor cryptographic 
implementations. 

Cryptography has been around for more than two thousand years 
now. It is the science of keeping things confidential using encryption 
techniques. However, confidentiality is not the only objective. There 
are various other usages of cryptography as mentioned in the 
following list, which we will explore later: 


e Confidentiality : Only the intended or authorized recipient 


can understand the message. It can also be referred to as privacy 
or secrecy. 


e Data Integrity : Data cannot be forged or modified by an 


adversary intentionally or by unintended/accidental errors. 
Though data integrity cannot prevent the alteration of data, it 
can provide a means of detecting whether the data was 
modified. 


e Authentication : The authenticity of the sender is assured and 
verifiable by the receiver. 


e Non-repudiation : The sender, after sending a message, 


cannot deny later that they sent the message. This means that an 
entity (a person or a system) cannot refuse the ownership of a 
previous commitment or an action. 


Any information in the form of a text message, numeric data, or a 
computer program can be called plaintext. The idea is to encrypt the 
plaintext using an encryption algorithm and a key that produces the 
ciphertext. The ciphertext can then be transmitted to the intended 
recipient, who decrypts it using the decryption algorithm and the key 
to get the plaintext. 

Let us take an example. Alice wants to send a message (m) to 
Bob. If she just sends the message as is, any adversary, say, Eve can 
easily intercept the message and the confidentiality gets 
compromised. So, Alice wants to encrypt the message using an 
encryption algorithm (£) and a secret key (k) to produce the 
encrypted message called “ciphertext.” An adversary has to be aware 
of both the algorithm (£) and key (k) to intercept the message. The 
stronger the algorithm and the key, the more difficult it is for the 
adversary to attack. Note that it would always be desirable to design 
blockchain systems that are at least provably secure. What this 
means is that a system must resist certain types of feasible attacks by 
adversaries. 

The common set of steps for this approach can be represented as 
shown in Figure 2-2. 


War. Ane Bell hd 


wens 
ea? “taro me 
=aite-ni ne ria 
—_— ee +e 
diya: Beier 
vaguest ae + 
OAL TAI tt. 


TOHRtond aos) 
Alice Message (m) 35 Ciphertext 
Eneryption 

Algorithm (E) as 
‘aX Network 


r (K) 


bettered tld 
'evies me 


Decr = — ie oe 
nh wane: we 
a jevaue tror caer 


Message 3 prea 
OOO aS 
Decryption 
Algorithm (D) 


Figure 2-2 How Cryptography works in general 


Broadly, there are two kinds of cryptography: symmetric key and 
asymmetric key (a.k.a. public key) cryptography. Let us look into 
these individually in the following sections. 


SYMMETRIC KEY CRYPTOGRAPHY 


In the previous section we looked at how Alice can encrypt a message 
and send the ciphertext to Bob. Bob can then decrypt the ciphertext 
to get the original message. If the same key is used for both 
encryption and decryption, it is called symmetric key cryptography. 
This means that both Alice and Bob have to agree on a key (k) called 
“shared secret” before they exchange the ciphertext. So, the process 
is as follows: 

Alice—the Sender: 


e Encrypt the plaintext message m using encryption algorithm E 
and key k to prepare the ciphertext c 


e c= E(k, m) 
e Send the ciphertext c to Bob 
Bob—the Receiver: 


e Decrypt the ciphertext c using decryption algorithm D and the 
same key k to get the plaintext m 


e m=D(k,c) 


Did you just notice that the sender and receiver used the same 
key (k)? How do they agree on the same key and share it with each 
other? Obviously, they need a secure distribution channel to share 
the key. It typically looks as shown in Figure 2-3. 





+ th Very Secure ' 
Key (k ery of - Key (k 
y (h) Communication Channel ae y (k) 
| | hat-har | | 
ie —+(| Encryption |— ies "i —+i|Reervption | =B 
+ a a, 


P ‘ ny Insecure > tenn 
ae Ciphertext Communication Channel ciphertext | 
ai Encryption \e) {cl Decryption 
Algorithm Algerither 
rs (D) 
Sender Receiver 


Message 
{rei 





Figure 2-3 Symmetric cryptography 


Symmetric key cryptography is used widely; the most common 
uses are secure file transfer protocols such as HTTPS, SFTP, and 
WebDAVS. Symmetric cryptosystems are usually faster and more 
useful when the data size is huge. 

Please note that symmetric key cryptography exists in two 
variants: stream ciphers and block ciphers. We will discuss these in 
the following sections but we will look at Kerchoffs principle and 
XOR function before that to be able to understand how the 
cryptosystems really work. 


Kerckhoff 's Principle and XOR Function 


Kerckhoff’s principle states that a cryptosystem should be secured 
even if everything about the system is publicly known, except the 
key. Also, the general assumption is that the message transmission 
channel is never secure, and messages could easily be intercepted 
during transmission. This means that even if the encryption 


algorithm E and decryption algorithm D are public, and there is a 
chance that the message could be intercepted during transmission, 
the message is still secure due to a shared secret. So, the keys must 
be kept secret in a symmetric cryptosystem. 

The XOR function is the basic building block for many encryption 
and decryption algorithms. Let us take a look at it to understand how 
it enables cryptography. The XOR, otherwise known as “Exclusive 


OR” and denoted by the symbol ©, can be represented by the 
following truth table (Table 2-1). 


Table 2-1 XOR Truth Table 


A B A@B 
oO oO oO 
1 O 1 
oO 1 1 
1 1 oO 


The XOR function has the following properties, which are 
important to understand the math behind cryptography: 


e Associative: A © (B © C)=(A @ B) ®C 
e Commutative: A ® B=B@A 

¢ Negation: A ®1=A 

« Identity: A ® A=o0 


Using these properties, it would now make sense how to compute 
the ciphertext “c” using plaintext “m” and the key “k,” and then 
decrypt the ciphertext “c” with the same key “k” to get the plaintext 
“m.” The same XOR function is used for both encryption and 
decryption. 

nee k—ceande Oem 

The previous example is in its simplest form to get the hang of 
encryption and decryption. Notice that it is very simple to get the 
original plaintext message just by XORing with the key, which is a 
shared secret and only known by the intended parties. Everyone may 
know that the encryption or decryption algorithm here is XOR, but 
not the key. 


Stream Ciphers vs. Block Cipher 


Stream cipher and block cipher algorithms differ in the way the 
plaintext is encoded and decoded. 

Stream ciphers convert one symbol of plaintext into one 
symbol of ciphertext. This means that the encryption is carried out 
one bit or byte of plaintext at a time. In a bit by bit encryption 
scenario, to encrypt every bit of plaintext, a different key is generated 
and used. So, it uses an infinite stream of pseudorandom bits as the 
key and performs the XOR operation with input bits of plaintext to 
generate ciphertext. For such a system to remain secure, the 
pseudorandom keystream generator has to be secure and 
unpredictable. Stream ciphers are an approximation of a proven 
perfect cipher called “the one-time pad,” which we will discuss in a 
little while. 

How does the pseudorandom keystream get generated in the first 
place? They are typically generated serially from a random seed 
value using digital shift registers. Stream ciphers are quite simple 
and faster in execution. One can generate pseudorandom bits offine 
and decrypt very quickly, but it requires synchronization in most 
cases. 

We saw that the pseudorandom number generator that generates 
the key stream is the central piece here that ensures the quality of 
security—which stands to be its biggest disadvantage. The 
pseudorandom number generator has been attacked many times in 
the past, which led to deprecation of stream ciphers. The most widely 
used stream cipher is RC4 (Rivest Cipher 4) for various protocols 
such as SSL, TLS, and Wi-Fi WEP/WPA etc. It was revealed that 


there were vulnerabilities in RC4, and it was recommended by 
Mozilla and Microsoft not to use it where possible. 

Another disadvantage is that all information in one bit of input 
text is contained in its corresponding one bit of ciphertext, which is a 
problem of low diffusion. It could have been more secured if the 
information of one bit was distributed across many bits in the 
ciphertext output, which is the case with block ciphers. Examples of 
stream ciphers are one-time pad, RC4, FISH, SNOW, SEAL, A5/1, 
etc. 

Block cipher on the other hand is based on the idea of 
partitioning the plaintext into relatively larger blocks of fixed-length 
groups of bits, and further encoding each of the blocks separately 
using the same key. It is a deterministic algorithm with an unvarying 
transformation using the symmetric key. This means when you 
encrypt the same plaintext block with the same key, you'll get the 
same result. 

The usual sizes of each block are 64 bits, 128 bits, and 256 bits 
called block length, and their resulting ciphertext blocks are also of 
the same block length. We select, say, an r bits key k to encrypt every 
block of length n, then notice here that we have restricted the 
permutations of the key k to a very small subset of 2”. This means 
that the notion of “perfect cipher” does not apply. Still, random 
selection of the r bits secret key is important, in the sense that more 
randomness implies more secrecy. 

To encrypt or decrypt a message in block cipher cryptography, we 
have to put them into a “mode of operation” that defines how to 
apply a cipher’s single-block operation repeatedly to transform 
amounts of data larger than a block. Well, the mode of operation is 
not just to divide the data into fixed sized blocks, it has a bigger 
purpose. We learned that the block cipher is a deterministic 
algorithm. This means that the blocks with the same data, when 
encrypted using the same key, will produce the same ciphertext— 
quite dangerous! It leaks a lot of information. The idea here is to mix 
the plaintext blocks with the just created ciphertext blocks in some 
way so that for the same input blocks, their corresponding 
Ciphertext outputs are different. This will become clearer when we 
get to the DES and AES algorithms in the following sections. 

Note that different modes of operations result in different 
properties being achieved that add to the security of the underlying 
block cipher. Though we will not get into the nitty-gritty of modes of 
operations, here are the names of a few for your reference: Electronic 


Codebook (ECB), Cipher Block Chaining (CBC), Cipher Feedback 
(CFB), Output Feedback (OFB), and Counter (CTR). 

Block ciphers are a little slow to encrypt or decrypt, compared 
with the stream ciphers. Unlike stream ciphers where error 
propagation is much less, here the error in one bit could corrupt the 
whole block. On the contrary, block ciphers have the advantage of 
high diffusion, which means that every input plaintext bit is diffused 
across several ciphertext symbols. Examples of block ciphers are 
DES, 3DES, AES, etc. 





One-Time Pad 


It is a symmetric stream cipher where the plaintext, the key, and the 
ciphertext are all bit strings. Also, it is completely based on the 
assumption of a “purely random” key (and not pseudorandom), 
using which it could achieve “perfect secrecy.” Also, as per the 
design, the key can be used only once. The problem with this is that 
the key should be at least as long as the plaintext. It means that if 
you are encrypting a 1GB file, the key would also be 1GB! This gets 
impractical in many real-world cases. 

Example: 


Table 2-2. Example Encryption Using XOR Function 


ex OHS "9 — UV 


< OF? 
° 
e 
° 
° 
e 
e 
° 
a 
a 
e 
° 
° 
e 
° 
a 
° 
e 


P)}1/;0/;0 ;1 |;1 }1 }]0 |]O0/1 |O0);1 )}0 |171 1/1 |0)1 | 1 
| 
a 
i 
n 
T 
e 
x 
t 
C 
i 
p 
h 
Sa [eae roa jaei too liken eis lo Fata, |e) oa | ae leat Ico 
t 
e 
a 
t 


You can refer to the XOR truth table in the previous section to 
find how ciphertext is generated by XOR-ing plaintext with the key. 
Notice that the plaintext, the key, and the ciphertext are all 18 bits 
long. 

Here, the receiver upon receipt of the ciphertext can simply XOR 
again with the key and get the plaintext. You can try it on your own 
with Table 2-2 and you will get the same plaintext. 

The main problem with this one-time pad is more of practicality, 
rather than theory. How do the sender and receiver agree on a secret 
key that they can use? If the sender and the receiver already have a 
secure channel, why do they even need a key? If they do not have a 
secure channel (that is why we use cryptography), then how can they 
share the key securely? This is called the “key distribution problem.” 

The solution is to approximate the one-time pad by using a 
pseudorandom number generator (PRNG). This is a deterministic 
algorithm that uses a seed value to generate a sequence of random 
numbers that are not truly random; this in itself is an issue. The 
sender and the receiver have to have the same seed value for this 
system to work. Sharing that seed value is way better compared with 
sharing the entire key; just that it has to be secured. It is susceptible 
to compromise by someone who knows the algorithm as well as the 
seed. 


Data Encryption Standard 


The Data Encryption Standard (DES) is a symmetric block cipher 
technique. It uses 64-bit block size with a 64-bit key for encryption 
and decryption. Out of the 64-bit key, 8 bits are reserved for parity 
checks and technically 56 bits is the key length. It has been proven 
that it is vulnerable to brute force attack and could be broken in less 
than a day. Given Moore’s law, it could be broken a lot quicker in the 
future, so its usage has been deprecated quite a bit because of the key 
length. It was very popular and was being used in banking 
applications, ATMs, and other commercial applications, and more so 
in hardware implementations than software. We give a high-level 
description of the DES encryption in this section. 

In symmetric cryptography, a large number of block ciphers use a 
design scheme known as a “Feistel cipher” or “Feistel network.” A 
Feistel cipher consists of multiple rounds to process the plaintext 
with the key, and every round consists of a substitution step followed 
by a permutation step. The more the number of rounds, the more 
secure it could be but encryption/decryption gets slower. The DES is 
based on a Feistel cipher with 16 rounds. A general sequence of steps 
in the DES algorithm is shown in Figure 2-4. 


64 bit- Plaintext 64 bits- Key 


Parity Removal 


8 bits 56 bits- Key 58 bi 
Initial Permutation o a 
Left Shift Left Shift 


K1 (48 bits . 
Round sae 
Left Shift Left Shift 


K2 (48 bit i 
ae cee) | 


Round-16 K16 (48 bits) 


| 
\ v 


———|_Compression _| 
Final Permutation 


Key Generator 





64 bit- Ciphertext 


Figure 2-4 DES cryptography 


Let us first talk about the key generator and then we will get into 
the encryption part. 


e As mentioned before, the key is also 64 bits long. Since 8 bits are 


used as parity bits (more precisely, bit number 8, 16, 24, 32, 40, 
48, 56, and 64), only 56 bits are used for encryption and 
decryption. 


e After parity removal, the 56-bit key is divided into two blocks, 
each of 28 bits. They are then bit-wise left shifted in every 
round. We know that the DES uses 16 rounds of Feistel network. 
Note here that every round takes the previous round’s left- 


shifted bit block and then again left shifts by one bit in the 
current round. 


e Both the left-shifted 28-bit blocks are then combined through a 


compression mechanism that outputs a 48-bit key called subkey 
that gets used for encryption. Similarly, in every round, the two 
28-bit blocks from the previous round get left shifted again by 
one bit and then clubbed and compressed to the 48-bit key. This 
key is then fed to the encryption function of the same round. 


Let us now look at how DES uses the Feistel cipher rounds for 
encryption: 


¢ First, the plaintext input is divided into 64 bit blocks. If the 


number of bits in the message is not evenly divisible by 64, then 
the last block is padded to make it a 64-bit block. 


e Every 64-bit input data block goes through an initial 


permutation (IP) round. It simply permutes, i.e., rearranges all 
the 64-bit inputs in a specific pattern by transposing the input 
blocks. It has no cryptographic significance as such, and its 
objective is to make it easier to load plaintext/ciphertext into 
DES chips in byte-sized format. 


e After the IP round, the 64-bit block gets divided into two 32-bit 
blocks, a left block (L) and a right block (R). In every round, the 
blocks are represented as L; and R;, where the subscript “I” 
denotes the round. So, the outcomes of IP round are denoted as 
Lg and Ro: 

¢ Now the Feistel rounds start. The first round takes Lo and Rg as 
input and follows the following steps: 


e The right side 32-bit block (R) comes as is to the left side 


and the left side 32-bit block (L) goes through an operation 
with the key k of that round and the right side 32-bit block 
(R) as shown following: 


e L; = R; -1 
e R; = L,-1 © F(R; -1, K;) where “I” is the round number 


e The FQ is called the “Cipher Function” that is actually the 
core part of every round. There are multiple steps or 


operations that are bundled together in this FQ operation. 


In the first step , operation of the 32-bit R-block is 
expanded and permuted to output a 48-bit block. 


In the second step, this 48-bit block is then XORed with the 


48-bit subkey supplied by the key generator of the same 
round. 


In the third step, this 48-bit XORed output is fed to the 


substitution box to reduce the bits back to 32 bits. The 
substitution operation in this S-box is the only nonlinear 
operation in DES and contributes significantly to the 
security of this algorithm. 


In the fourth step, the 32-bit output of the S-box is fed to 


the permutation box (P-box), which is just a permutation 
operation that outputs a 32-bit block, which is actually the 
final output of FO cipher function. 


The output of FQ is then XORed with the 32-bit L-block, 


which is input to this round. This XORed output then 
becomes the final R-block output of this round. 


Refer to Figure 2-5 to understand the various operations 
that take place in every round. 


+ 32 bits +— 32 bits 


Lj-1 





Expansion Permutation 


! 
! 
! 
| 
| | 48 bits 
————eee ks 
' 6 (48 bits) ! h t 
eth | , 
PF . 48 bits 
! 
| 
! 
| 
| 
| 
I 
| 
! 
| 
I 


round S-Box (Substitution) 


32 | 


P-Box (Permutation) 


32 bits D 


* 32bits — +32 bits —> 
Figure 2-5 Round function of DES 


. 


e The previously discussed Feistel round gets repeated 16 times, 


where the output of one round is fed as the input to the 
following round. 


e Once all the 16 rounds are over, the output of the 16th round is 


again swapped such that the left becomes the right block and 
vice versa. 


e Then the two blocks are clubbed to make a 64-bit block and 
passed through a permutation operation, which is the inverse of 
the initial permutation function and that results in the 64-bit 
ciphertext output. 


We looked at how the DES algorithm really works. The 
decryption also works a similar way in the reverse order. We will not 
get into those details, but leave it to you to explore. 

Let us conclude with the limitations of the DES. The 56-bit key 
length was susceptible to brute force attack and the S-boxes used for 
substitution in each round were also prone to cryptanalysis attack 
because of some inherent weaknesses. Because of these reasons, the 
Advanced Encryption Standard (AES) has replaced the DES to the 
extent possible. Many applications now choose AES over DES. 


Advanced Encryption Standard 


Like DES, the AES algorithm is also a symmetric block cipher but is 
not based on a Feistel network. The AES uses a substitution- 
permutation network in a more general sense. It not only offers 
greater security, but also offers greater speed! As per the AES 
standards, the block size is fixed at 128 bits and allows a choice of 
three keys: 128 bits, 192 bits, and 256 bits. Depending on the choice 
of the key, AES is named as AES-128, AES-192, and AES-256. 

In AES, the number of encryption rounds depend on the key 
length. For AES-128, there are ten rounds; for AES-192, there are 12 
rounds; and for AES-256, there are 14 rounds. In this section, our 
discussion is limited to key length 128 (i.e., AES-128), as the process 
is almost the same for other variants of AES. The only thing that 
changes is the “key schedule,” which we will look into later in this 
section. 

Unlike DES, AES encryption rounds are iterative and operate an 
entire data block of 128 bits in every round. Also, unlike DES, the 
decryption is not very similar to the encryption process in AES. 

To understand the processing steps in every round, consider the 
128-bit block as 16 bytes where individual bytes are arranged in a 4 x 
4 matrix as shown: 


Byte O Byte 4 Byte 8 Byte 12 
Byte 1 Byte 5 Byte 9 Byte 13 
Byte 2 Byte 6 Byte10 Byteli4 
Byte 3 Byte 7 Byte11 Bytei5 


This 4 x 4 matrix of bytes as shown is referred to as state array . 
Please note that every round consumes an input state array and 
produces an output state array. 

The AES also uses another piece of jargon called “word” that 
needs to be defined before we go further. Whereas a byte consists of 
eight bits, a word consists of four bytes, that is, 32 bits. The four 
bytes in each column of the state array form 32-bit words and can be 
called state words . The state array can be shown as follows: 


word, word, word, word; 


2 4 ! ! 

it it 1 i 
\ByteO | \Byte41 iByte8 1 1Byte 121 

it 1 1 1 
\Byte1 | |Byte5\ |Byte9 | |Byte13\ 
1 it 1 1 1 
| Byte 2 | Byte 6 | | Byte 10! |Byte 14! 
I | | 1 
1 Byte 3 | Byte 7 4 ‘Byte 11 iByte 151 
oa! CSS Li... eae 





Also, every byte can be represented with two hexadecimal 
numbers. Example: if the 8-bit byte is {00111010}, it could be 
represented as “3A” in Hex notation. “3” represents the left four bits 
“0011” and “A” represents the right four bits “1010.” 

Now to generalize each round, processing in each round happens 
at byte level and consists of byte-level substitution followed by word- 
level permutation, hence it is a substitution-permutation network. 
We will get to further details when we discuss the various operations 
in each round. The overall encryption and decryption process of AES 
can be represented in Figure 2-6. 


128 bits- Plaintext 128 bits- Plaintext 


sssaiaites 













Inverse ShiftRows 


‘ ' 
' \ 
' : » 
! 12 
1B 
i a 
' lo 
i ! 
te 
oO | 
© v (a Sea! ! 
_ = | k 
a 2) bah Aa Nar eras ha tas Bhacs ' 
c (a) ' | 
é < 
wr Ss) i | 
t | 
“") a ' 
™ ! eS 
a ad ed tc 
J ' 
v 2 
a ee age ee re / [_— 
| , Inverse SubBytes | | 6 
Maen sean ra j «“ 
' 
! 
i 
! 
| 


+ 
eee ee ee 


Roune-10 
wo 
= 
5 | 
c 
= 
w 


128 bits- Ciphertext 128 bils- Ciphertext 
Encryption Decryption 


Figure 2-6 AES cryptography 


If you paid close attention to Figure 2-6, you would have noticed 
that the decryption process is not just the opposite of encryption. 
The operations in the rounds are executed in a different order! All 
steps of the round function—SubBytes, ShiftRows, MixColumns, 
AddRoundKey-—are invertible. Also, notice that the rounds are 
iterative in nature. Round 1 through round 9 have all four 
operations, and the last round excludes only the “MixColumns” 
operation. Let us now build a high-level understanding of each 
operation that takes place in a round function. 

SubBytes : This is a substitution step. Here, each byte is 
represented as two hexadecimal digits. As an example, take a byte 
{00111010} represented with two hexadecimal digits, say {3A}. To 
find its substitution values, refer to the S-box lookup table (16 x 16 
table) to find the corresponding value for 3-row and A-column. So, 


for {3A}, the corresponding substituted value would be {80}. This 
step provides the nonlinearity in the cipher. 

ShiftRows : This is the transformation step and is based upon 
the matrix representation of the state array. It consists of the 
following shift operations: 


¢ No circular shifting of the first row, and remains as is 


Circularly shifting of the second row by one byte to the left 
¢ Circularly shifting of the third row by two bytes to the left 


e Circularly shifting of the fourth row (last row) by three bytes to 
the left 


It can be represented as shown: 


ByteQ =6Byred = GyteS = Bytei2 [TTT —- SyteO 8 Byte# = Sytef = Byte i2 
Byte? ByreS Byred Byte i3 - /____s — ByteS Byted Sytei3 Bytel 
Byte? Ayres = Ryteld = ayteta —+ Co + + Byte10 Byteid Syte2 Byte 
Byte? Bye? Aye? Bytets —+ , +) —— + syters Byte? Byte? Bele dD 


MixColumns : It is also a transformation step where all the four 
columns of the state are multiplied with a fixed polynomial (C,) and 
get transformed to new columns. In this process, each byte of a 
column is mapped to a new value that is a function of all four bytes 
in the column. This is achieved by the matrix multiplication of state 
as shown: 





2 3 1 1 || ByteO Byte4 Bytes Byte12 Byte Byte4’ Bytes Byte 12’ 
1 Saf Bytel Bytes Byte9 Bytel3 | | Byte 1 Byte 5 ‘ Byte 9 Byte 13, 
fof WD & Byte2 Byteé6 Byte10 Byte 14 = Byte 2 : Byte 6 Byte 10 Byte 14 , 
3.1 2 2 || Byte? Byte7 Byte11 Byte 15 | Byte3’ Byte7’ Byte11 Byte 15’ 


tees Sens 


The matrix multiplication is as usual, but the AND products are 
XORed. Let us see one of the examples to understand the process. 
Byte 0’ is calculated as shown: 

Byte 0’ = (2. Byteo) ® (3. Byte1) ® Byte3 ® Byte4 

It is important to note that this MixColumns step, along with the 
ShiftRows step, provide the necessary diffusion property 


(information from one byte gets diffused to multiple bytes) to the 
cipher. 

AddRoundKey: This is again a transformation step where the 
128-bit round key is bitwise XORed with 128 bits of state in a column 
major order. So, the operation takes place column-wise, meaning 
four bytes of a word state column with one word of the round key. In 
the same way we represented the 128-bit plaintext block, the 128-bit 
key should also be represented in the same 4 x 4 matrix as shown 
here: 


Wo W; W2 W3 
mae | eee Bi gees | aes 
| 2 § , ft ai | 
1ByteO 1 'Byte4 1 iByte8 1 'Bytei2) 
| tt 1 mz | 
| Byte 1 | Byte 5 | | Byte 9 \Byte 13} 
1 Zz : @ | 
| Byte 2 : | Byte 6 | Byte 10! Byte 14) 
ta 1 


1 1 I | 
iByte3 1 1Byte71 iByte11: \Byte 15) 
aaa!) CoeSel loc w.| OSS 


128-bit key 

This operation affects every bit of a state. Now, recollect that 
there are ten rounds, and each round has its own round key. Since 
there is an “AddRoundKey” step before the rounds start, effectively 
there are eleven (10 + 1) AddRoundKey operations. In one round, all 
128-bits of subkey, that is, all four words of subkey, are used to XOR 
with the 128-bit input data block. So, in total, we require 44 key 
words, Wg through wy. This is why the 128-bit key has to go 
through a key expansion operation, which we will get to in a little 
while. 

Note here that the key word [Wo, W,, Ws, Ws] gets XORed with 
the initial input block before the round-based processing begins. The 
remaining 40 word-keys, w, through wyg, get used four words at a 
time in each of the ten rounds. 

AES Key Expansion: The AES key expansion algorithm takes 
as input a 128-bit cipher key (four-word key) and produces a 
schedule of 44 key words from it. The idea is to design this system in 
such a way that a one-bit change in the key would significantly affect 
all the round keys. 

The key expansion operation is designed such that each grouping 
of a four-word key produces the next grouping of a four-word key in 


a four-word to four-word basis. It is easy to explain this with a 
pictorial representation, so here we go: 


! 1 
wo | ws] we] w, |i (8) 








Figure 2-7 AES key expansion 


We will quickly run through the operations that take place for key 


expansion by referring to the diagram: 


¢ The initial 128-bit key is [Wo, Wi, We, Ws] arranged in four 


words. 


e Take a look at the expanded word now: [wy, ws, W6, Wa]. Notice 


that w, depends on wy and w,. This means that every expanded 
word depends on the immediately preceding word, i.e., w; — 1 
and the word that is four positions back, i.e., w; — 4. Test the 
same for Wg as well. As you can see, just a simple XOR 
operation is performed here. 


Now, what about w,? Or, any other position that is a multiple of 
four, such as Wg Or W,.? For these words, a more complex 
function denoted as “g” is used. It is basically a three-step 
function. In the first step, the input four-word block goes 
through circular left shift by one byte. For example [Wo, W,, Wo, 
w,] becomes [w,, Wz, Wg, Wo]. In the second step, the four 
bytes input word (e.g., [W,, Ws, We, Wo]) is taken as input and 
byte substitution is applied on ook byte using S-box. Then, in 
the third step, the result of step 2 is XORed with something 
called round constant denoted as Rcon[ |. The round constant is 
a word in which the right-most three bytes are always zero. For 


example, [x, 0, 0, 0]. This means that the purpose of Rcon[ ] is 
to just perform XOR on the left-most byte of the step 2 output 
key word. Also note that the Rcon[ ] is different for each round. 
This way, the final output of the complex function “g” is 
generated, which is then XORed with w; — 4 to get w; where “I” 


is a multiple of 4. 
e This is how the key expansion takes place in AES. 


The output state array of the last round is rearranged back to 
form the 128-bit ciphertext block. Similarly, the decryption process 
takes place in a different order, which we looked at in the AES 
process diagram. The idea was to give you a heads-up on how this 
algorithm works at a high level, and we will restrict our discussion to 
just the encryption process in this section. 

The AES algorithm is standardized by the NIST (National 
Institute of Standards and Technology) . It had the limitation of long 
processing time. Assume that you are sending just a 1 megabyte file 
(8388608 bits) by encrypting with AES. Using a 128-bit AES 
algorithm, the number of steps required for this encryption will be 
8388608/128 = 65536 on this same number of data blocks! Using a 
parallel processing approach, AES efficiency can be increased, but is 
still not very suitable when you are dealing with large data. 


Challenges in Symmetric Key Cryptography 


There are some limitations in symmetric key cryptography. A few of 
them are listed as follows: 


e The key must be shared by the sender and receiver before any 


communication. It requires a secured key establishment 
mechanism in place. 


e The sender and receiver must trust each other, as they use the 


same symmetric key. If a receiver is hacked by an attacker or the 
receiver deliberately shared the key with someone else, the 
system gets compromised. 


e A large network of, say, n nodes require key n(n—1)/2 key pairs 
to be managed. 


e It is advisable to keep changing the key for each communication 
session. 


e Often a trusted third party is needed for effective key 
management, which itself is a big issue. 


CRYPTOGRAPHIC HASH FUNCTIONS 


Hash functions are the mathematical functions that are the most 
important cryptographic primitives and are an integral part of 
blockchain data structure. They are widely used in many 
cryptographic protocols, information security applications such as 
Digital Signatures and message authentication codes (MACs) . Since 
it is used in asymmetric key cryptography, we will discuss it here 
prior to getting into asymmetric cryptography. Please note that the 
concepts covered in this section may not be in accordance with the 
academic text books, and a little biased toward the blockchain 
ecosystem. 

Cryptographic hash functions are a special class of hash functions 
that are apt for cryptography, and we will limit our discussion 
pertaining to it only. So, a cryptographic hash function is a one-way 
function that converts input data of arbitrary length and produces a 
fixed-length output. The output is usually termed “hash value” or 
“message digest.” It can be represented as shown Figure 2-8. 





| 
Message of Hash Value of 
Arbitrary Length =, Fixed Length 
| Sanne een a 
(Mt) 1H) (h) 


Figure 2-8 Hash function in its basic form 


For the hash functions to serve their design purpose and be 
usable, they should have the following core properties: 


e Input can be any string of any size, but the output is of fixed 
length, say, a 256-bit output or a 512-bit output as examples. 


e The hash value should be efficiently computable for any given 
message. 


¢ It is deterministic, in the sense that the same input when 
provided to the same hash function produces the same hash 


value every time. 


e It is infeasible (though not impossible!) to invert and generate 


the message from its hash value, except trying for all possible 
messages. 


e Any small change in the message should greatly influence the 


output hash, just so no one can correlate the new hash value 
with the old one after a small change. 


Apart from the aforementioned core properties, they should also 
meet the following security properties to be considered as a 
cryptographic protocol: 


e Collision resistance: It implies that it is infeasible to find two 
different inputs, say, X and Y, that hash to the same value. 


X —— H — H(x) 


H(x)=4 H(Y) — Given(x LY 
(a RS (x) & H(Y) iven(X = Y) 


This makes the hash function H() collision resistant because 
no one can find X and Y, such that H(X) = H(Y). Note that this 
hash function is a compression function, as it compresses a 
given input to fixed sized output that is shorter than the input. 
So, the input space is too large (anything of any size) compared 
with the output space, which is fixed. If the output is a 256-bit 
hash value, then the output space can have a maximum of 275° 
values, and not beyond that. This implies that a collision must 
exist. However, it is extremely difficult to find that collision. As 
per the theory of “the birthday paradox,” we can infer that it 
should be possible to find a collision by using the square root of 
the output space. So, by taking 212° + 1 inputs, it is highly likely 
to find a collision; but that is an extremely huge number to 
compute, which is quite infeasible! 

Let us now discuss where this property could be useful. In 
the majority of online storage, cloud file storage, blob storage, 
App Stores, etc., the property “collision resistance” is widely 
used to ensure the integrity of the files. Example: someone 
computes the message digest of a file and uploads to cloud 
storage. Later when they download the file, they could just 
compute the message digest again and cross-check with the old 


one they have. This way, it can be ensured if the file was 
corrupted because of some transmission issues or possibly due 
to some deliberate attempts. It is due to the property of collision 
resistance that no one can come up with a different file or a 
modified file that would hash to the same value as that of the 
original file. 


Preimage resistance: This property means that it is 


computationally impossible to invert a hash function; i.e., 
finding the input X from the output H(X) is infeasible. 
Therefore, this property can also be called “hiding” property. 
Pay close attention here; there is another subtle aspect to this 
situation. Note that when X can be anything in the world, this 
property is easily achieved. However, if there are just a limited 
number of values that X can take, and that is known to the 
adversary, they can easily compute all possible values of X and 
find which one hashes to the outcome. 

Example: A laboratory decided to prepare the message 
digests for the successful outcome of an experiment so that any 
adversary who gets access to the results database cannot make 
any sense of it because what is stored in the system are hashed 
outputs. Assume that there can only be three possible outcomes 
of the experiment such as OP111, OP112, and OP113, out of 
which only one is successful, say, OP112. So, the laboratory 
decides to hash it, compute H(OP112), and store the hashed 
values in the system. Though an adversary cannot find OP112 
from H(OP112), they can simply hash all the possible outcomes 
of the experiment, i.e., H(OP111), H(OP112), and H(OP113) and 
see that only H(OP112) is matching with what is stored in the 
system. Such a situation is certainly vulnerable! This means 
that, when the input to a hash function comes from a limited 
space and does not come from a spread-out distribution, it is 
weak. However, there is a solution to it as follows: 

Let us take an input, say “X” that is not very spread out, just 
like the outcomes of the experiment we just discussed with a few 
possible values. If we can concatenate that with another random 
input, say “r,” that comes from a probability distribution with 
high min entropy, then it will be difficult to find X from H(r || 
X). Here, high min entropy means that the distribution is very 
spread out and there is no particular value that is likely to occur. 
Assume that “r” was chosen from 256-bit distribution. For an 
adversary to get the exact value of “r” that was used along with 


input, there is a success probability of 1/275°, which is almost 


impossible to achieve. The only way is to consider all the 
possible values of this distribution one by one—which is again 
practically impossible. The value “r” is also referred to as 
“nonce.” In cryptography, a nonce is a random number that can 
be used only once. 

Let us now discuss where this property of preimage 
resistance could be useful. It is very useful in committing to a 
value, so “commitment” is the use case here. This can be better 
explained with an example. Assume that you have participated 
in some sort of betting or gambling event. Say you have to 
commit to your option, and declare it as well. However, no one 
should be able to figure out what you are betting on, and you 
yourself cannot deny later on what you bet on. So, you leverage 
the preimage resistance property of Hash Function. You take a 
hash of the choice you are betting on, and declare it publicly. No 
one can invert the hash function and figure out what you are 
betting on. Also, you cannot later say that your choice was 
different, because if you hash a different choice, it will not match 
what you have declared publicly. It is advisable to use a nonce 
“y” the way we explained in the previous paragraph to design 
such systems. 


¢ Second preimage resistance: This property is slightly different 
from “collision resistant.” It implies that given an input X and 
its hash H(X), it is infeasible to find Y, such that H(X) = H(Y). 
Unlike in collision-resistant property, here the discussion is for 
a given X, which is fixed. This implies that if a hash function is 
collision resistant already, then it is second preimage resistant 
also. 


There is another derived property from the properties mentioned 
that is quite useful in Bitcoin. Let us look into it from a technical 
point of view and learn how Bitcoin leverages it for mining when we 
hit Chapter 3. The name of this property is “puzzle friendliness.” This 
name implies that there is no shortcut to the solution and the only 
way to get to the solution is to traverse through all the possible 
options in the input space. We will not try to define it here but will 
directly try to understand what it really means. Let us consider this 
example: H(r || X) = Z, where “r’” is chosen from a distribution with 
high min entropy, “X” is the input concatenated with “r,” and “Z” is 
the hashed output value. The property means that it is way too hard 
for an adversary to find a value “Y” that exactly hashes to “Z.” That 


is, H(r’ || Y) = Z, where r’ is a part of the input chosen in the same 
randomized way as “r.” What this means is that, when a part of the 
input is substantially randomized, it is hard to break the hash 
function with a quick solution; the only way is to test with all 
possible random values. 

In the previous example, if “Z” is an n-bits output, then it has 
taken just one value out of 2” possible values. Note carefully that a 
part of your input, say “r,” is from a high min-entropy distribution, 
which has to be appended with your input X. Now comes the 
interesting part of designing a search puzzle. Let’s say Z is an n-bits 
output and is a set of 2” possible values, not just an exact value. You 
are asked to find a value of r such that when hashed appended with 
X, it falls within that output set of 2” values; then it forms a search 
puzzle. The idea is to find all possible values of r till it falls withing 
the range of Z. Note here that the size of Z has limited the output 
space to a smaller set of 2” possible values. The smaller the output 
space, the harder is the problem. Obviously, if the range is big, it is 
easier to find a value in it and if the range is quite narrow with just a 
few possibilities, then finding a value within that range is tough. This 
is the beauty of the “r,” called the “nonce” in the input to hash 
function. Whatever random value of r you take, it will be 
concatenated with “X” and will go through the same hash function, 
again and again, till you get the right nonce value “r” that satisfies 
the required range for Z, and there are absolutely no shortcuts to it 
except for trying all possible values! 

Note that for an n-bit hash value output, an average effort of 2” is 
needed to break preimage and second preimage resistance, and 2”/2 
for collision resistance. 

We discussed various fundamental and security properties of 
hash functions. In the following sections we will see some important 
hash functions and dive deeper as applicable. 


A Heads-up on Different Hash Functions 


One of the oldest hash functions or compression function is the MD4 
hash function. It belongs to the message digest (MD) family. Other 
members of the MD family are MD5 and MD6, and there are many 
other variants of MD4 such as RIPEMD. The MD family of 
algorithms produce a 128-bit message digest by consuming 512-bit 
blocks. They were widely used as checksums to verify data integrity. 
Many file servers or software repositories used to provide a 
precomputed MD5 checksum, which the users could check against 


the file they downloaded. However, there were a lot of vulnerabilities 
found in the MD family and it was deprecated. 

Another such hash function family is the Secure Hash Algorithm 
(SHA) family. There are basically four algorithms in this family, such 
as SHA-o, SHA-1, SHA-2, and SHA-3. The first algorithm proposed 
in this family was named SHA, but newer versions were coming with 
security fixes and updates, so a retronym was applied to it and it was 
made SHA-o. It was found to have a serious yet undisclosed security 
flaw and was discontinued. Later, SHA-1 was proposed as a 
replacement to SHA-o. SHA-1 had an extra computational step that 
addressed the problem in SHA-o. Both SHA-o and SHA-1 were 160- 
bit hash functions that consumed 512-bit block sizes. SHA-1 was 
designed by the National Security Agency (NSA) to use it in the 
digital signature algorithm (DSA) . It was used quite a lot in many 
security tools and Internet protocols such as SSL, SSH, TSL, etc. It 
was also used in version control systems such as Mercurial, Git, etc. 
for consistency checks, and not really for security. Later, around 
2005, cryptographic weaknesses were found in it and it was 
deprecated after the year 2010. We will get into SHA-2 and SHA-3 in 
detail in the following sections. 


SHA-2 
It belongs to the SHA family of hash functions, but itself is a family 
of hash functions. It has many SHA variants such as SHA-224, SHA- 
256, SHA-384, SHA-512, SHA-512/224, and SHA-512/256. SHA-256 
and SHA-512 are the primitive hash functions and the other variants 
are derived from them. The SHA-2 family of hash functions are 
widely used in applications such as SSL, SSH, TSL, PGP, MIME, etc. 

SHA-224 is a truncated version of SHA-256 with a different 
initial value or initialization vector (IV). Note that the SHA variants 
with different truncations applied can produce the same bit length 
hash outputs, hence different initialization vectors are applied in 
different SHA variants to be able to properly differentiate them. Now 
coming back to the SHA-224 computation, it is a two-step process. 
First, SHA-256 value is computed with a different IV compared with 
the default one used in SHA-256. Second, the resulting 256-bit hash 
value is truncated to 224-bit; usually the 224 bits from left are kept, 
but the choice is all yours. 

SHA-384 is a truncated version of SHA-512, just the way SHA- 
224 is a truncated version of SHA-256. Similarly, both 512/224 and 
SHA-512/256 are truncated versions of SHA-512. Are you wondering 


why this concept of “truncation” exists? Note that truncation is not 
just limited to the ones we just mentioned, and there can be various 
other variants as well. The primary reasons for truncation could be 
as follows: 


e Some applications require a message digest with a certain length 
that is different from the default ones. 


e Irrespective of the SHA-2 variant we are using, we can select a 
truncation level depending on what security property we want to 
sustain. Example: Considering today’s state of computing 
power, when collision resistance is necessary, we should keep at 
least 160 bits and when only preimage-resistance is necessary, 
we should keep at least 80 bits. The security property such as 
collision resistance decreases with truncation, but it should be 
chosen such that it would be computationally infeasible to find a 
collision. 


e Truncation also helps maintain the backward compatibility with 


older applications. Example: SHA-224 provides 112-bit security 
that can match the key length of triple-DES (3DES). 


Talking about efficiency, SHA-256 is based on a 32-bit word and 
SHA-512 is based on a 64-bit word. So, on a 64-bit architecture, 
SHA-512 and all its truncated variants can be computed faster with a 
better level of security compared with SHA-1 or other SHA-256 
variants. 
that represents SHA-1 and different SHA-2 algorithms properties in 
a nutshell. 


Table 2-3, SHA-1 & SHA-2 Hash Function in a Nutshell 
































As arule of thumb, it is advisable not to truncate when not 
necessary. Certain hash functions tolerate truncation and some 
don’t, and it also depends on how you are using it and in what 
context. 


SHA-256 and SHA-512 


As mentioned already, SHA-256 belongs to the SHA-2 family of hash 

functions, and this is the one used in Bitcoins! As the name suggests, 

: produces a 256-bit hash value, hence the name. So, it can provide 
28_bit security as per the birthday paradox. 

Recall that the hash functions take arbitrary length input and 
produce a fixed size output. The arbitrary length input is not fed as is 
to the compression function and is broken into fixed length blocks 
before it is fed to the compression function. This means that a 
construction method is needed that can iterate through the 
compression function by constructing fixed-sized input blocks from 
arbitrary length input data and produce a fixed length output. There 
are various types of construction methods such as Merkle-Damgard 
construction, tree construction, and sponge construction. It is 
proven that if the underlying compression function is collision 
resistant, then the overall hash function with any construction 
method should also be collision resistant. 

The construction method that SHA-256 uses is the Merkle- 
Damgard construction, so let us see how it works in Figure 2-9. 


(M) i 20] — it 512 bits 
512-bits $12-bits 512- - 512-bits 
| 


| --4 Message 
| 1 --4 | ies Block - n 


512-bits §12-bits 312-bits 
Fee ts —p s--3 
ee + Compression ~~"! Compression | Compression . h 
| WV 1 Function Function ia) ‘ "Has 
‘ i) (0_"t56-bi Le accu: value 4 
Ye a me” 2s6-bits |e 256 bits 256-bits’._ 
256-bits r is te 256 bits 


Figure 2-9 Merkle-Damgard construction for SHA-256 


Referring to the diagram, the following steps (presented at a high 
level) are executed in the order specified to compute the final hash 
value: 


e As you can see in the diagram, the message is first divided into 


512-bit blocks. When the message is not an exact multiple of 512 
bits (which is usually the case), the last block falls short of bits, 
hence it is padded to make it 512 bits. 


e The 512-bit blocks are further divided into 16 blocks of 32-bit 
words (16 x 32 = 512). 


e Each block goes through 64 rounds of round function where 
each 32-bit word goes through a series of operations. The round 
functions are a combination of some common functions such as 
XOR, AND, OR, NOT, Bit-wise Left/Right Shift, etc. and we will 
not get into those details in this book. 


Similar to SHA-256, the steps and the operations are quite 
similar in SHA-512, as SHA-512 also uses Merkle-Damgard 
construction. The major difference is that there are 80 rounds of 
round functions in SHA-512 and the word length is 64 bits. The 
block size in SHA-512 is 1024 bits, which gets further divided into 16 
blocks of 64-bit words The output message digest is 512 bits in 
length, that is, eight blocks of 64-bit words. While SHA-512 was 
gaining momentum, and started being used in many applications, a 
few people turned to the SHA-3 algorithm to be future ready. SHA-3 
is just a different approach to hashing and not a real replacement to 
SHA-256 or SHA-512, though it allows tuning. We will learn a few 
more details about SHA-3 in the following sections. 


RIPEMD 


RACE Integrity Primitives Evaluation Message Digest (RIPEMD) 
hash function is a variant of the MD4 hash function with almost the 
same design considerations. Since it is used in Bitcoins, we will have 
a brief discussion on it. 

The original RIPEMD was of 128 bits, later RIPEMD-160 was 
developed. There exist 128-, 256-, and 320-bit versions of this 
algorithm, called RIPEMD-128, RIPEMD-256, and RIPEMD-320, 
respectively, but we will limit our discussion to the most popular and 
widely used RIPEMD-160. 


RIPEMD-160 is a cryptographic hash function whose 
compression function is based on the Merkle—Damgard 
construction. The input is broken into 512-bit blocks and padding is 
applied when the input bits are not a multiple of 512. The 160-bit 
hash value output is usually represented as 40-digit hexadecimal 
numbers. 

The compression function is made up of 80 stages, made up of 
two parallel lines of five rounds of 16 steps each (5 x 16 = 80). The 
compression function works on sixteen 32-bit words (512-bit blocks). 


Note _Bitcoin uses both SHA-256 and RIPEMD-160 hashes 


together for address generation. RIPEMD-160 is used to further 
shorten the hash value output of SHA-256 to 160 bits. 





SHA-3 

In 2015, the Keccak (pronounced as “ket-chak”) algorithm was 
standardized by the NIST as the SHA-3. Note that the purpose was 
not really to replace the SHA-2 standard, but to complement and 
coexist with it, though one can choose SHA-3 over SHA-2 in some 
situations. 

Since both SHA-1 and SHA-2 were based on Merkle-Damgard 
construction, a different approach to hash function was desirable. 
So, not using Merkle-Damgard construction was one of the criteria 
set by the NIST. This was because the new design should not suffer 
from the limitations of Merkle-Damgard construction such as 
multicollision. Keccak, which became SHA-3, used a different 
construction method called sponge construction. 

In order to make it backward compatible, it was required that 
SHA-3 should be able to produce variable length outputs such as 
224, 256, 384, and 512 bits and also other arbitrary length outputs. 
This way SHA-3 became a family of cryptographic hash functions 
such as SHA3-224, SHA3-256, SHA3-384, SHA3 -512, and two 
extendable-output functions (XOFs), called SHAKE128 and 
SHAKE256. Also, SHA-3 had to have a tunable parameter (capacity) 
to allow a tradeoff between security and performance. Since 
SHAKE128 and SHAKE256 are XOFs, their output can be extended 
to any desired length, hence the name. 

The following diagram (Figure 2-10) shows how SHA-3 (Keccak 
algorithm) is designed at a high level. 


Message (M) Output H(i) 


Xo x) ge | vy) ¥ = 
| Pad | , 1 i : if Trunct | 





i Ir r fbr : 
ue f } 
— i enanes | bel |—w fa [— ee. 
Cc ae Le yy 
Absorbing Squeezing 


Figure 2-10 Sponge construction for SHA-3 


A series of steps that take place for SHA-3 are as follows: 


e As you can see in Figure 2-10, the message is first divided into 
blocks (x;) of size r bits. If the input data is not a multiple of r 
bits, then padding is required. If you are wondering about this r, 
do not worry, we will get to it in a little while. Now, let us focus 
on how this padding happens. For a message block x; which is 
not a multiple of r and has some message m in it, padding 
happens as shown in the following: 

= Mell PO tl 

“P” is a predetermined bit string followed by 1 {o0}* 1, which 
means a leading and trailing 1 and some number of zeros (could 
be no zero bits also) that can make x; a multiple of r. Table 2-4 
shows the various values of P. 


Table 2-4 Padding in SHA-3 variants 


Pere 
Viogde 


SHA3-224 224 11001 = 1{0}'1 


tnd 





SHA3-256 256 11101  1{0}"1 
SHA3-384 384 11001 1{0}"1 
SHA3 -512 512 11101 1{0}"1 


Variable Length (XOFs) Arbitrary 1111 1{0}'1 


As you can see in Figure 2-10, there are broadly two phases to 
SHA-3 sponge construction: the first one is the “Absorbing” 
phase for input, and the second one is the “Squeezing” phase for 
output. In the Absorbing phase, the message blocks (x;) go 
through various operations of the algorithm and in the 
Squeezing phase, the output of configurable length is computed. 
Notice that for both of these phases, the same function called 
“Kecaak-f” is used. 


For the computation of SHA3-224, SHA3-256, SHA3-384, 
SHA -512, which is effectively a replacement of SHA-2, only the 
first bits of the first output block yo are used with required level 
of truncation. 


The SHA-3 is designed to be tunable for its security strength, 
input, and output sizes with the help of tuning parameters. 


As you can see in the diagram, “b” represents the width of the 


state and requires that r + c = b. Also, “b” depends on the 
exponent “f” such that b = 25 x 2! 


Since “f” can take on values between 0 and 6, “b”can have 


widths {25, 50, 100, 200, 400, 800 and 1600}. It is advisable 
not to use the smallest two values of “b” in practice as they are 
just there to analyze and perform cryptanalysis on the 
algorithm. 


In the equation r + c = b, the “r” that we see is what we used to 
preprocess the message and divided into blocks of length “r.” 
This is called the “bit rate.” Also, the parameter “c” is called the 
capacity that just has to satisfy the condition r + c = b © {25, 50, 


100, 200, 400, 800, 1600} and get computed. This way “r” and 


c” are used as tuning parameters to trade off between security 
and performance. 


For SHA-3, the exponent value £ is fixed to be “6,” so the value of 
b is 1600 bits. For this given b = 1600, two bit-rate values are 
permissible: r = 1344 and r = 1088. This leads to two distinct 
values of “c.” So, for r = 1344, c = 256 and for r = 1088, c = 512. 


Let us now look at the core engine of this algorithm, i.e. Keccak- 


co 99 


f, which is also called “Keccak-f Permutation.” There are “n 


eo 99 


rounds in each Keccak-f, where “n” is computed as: n = 12 + 28. 
Since the value of f is 6 for SHA-3, there will be 24 rounds in 
each Keccak-f. Every round takes “b” bits (r + c) input and 
produces the same number of “b” bits as output. 


e In each round, the input “b” is called a state. This state array “b” 
can be represented as a three-dimensional (3-D) array b = (5x5 
x w), where word size w = 2°. So, w = 64 bits, which means 5 x 5 
= 25 words of 64 bits each. Recall that 2 = 6 for SHA-3, sob = 5 
x 5 x 64 = 1600. The 3-D array can be shown as in Figure 2-11. 





Figure 2-11 State array representationin SHA-3 


e Each round consists of a sequence of five steps and the state 


array gets manipulated in each of those steps as shown in Figure 
2-12. 


tate A fam FA joan fen fe 
“i "art _ Q 0 (ry X l To Array 
- bits easly Weay Vg Salil vena b - bits 
Theta Rho Pi Chi lota 


Figure 2-12 The five steps in each SHA-3 round 


e Without getting into much detail into each of the five steps, let 
us quickly learn what they do at a high level: 


e Theta (0) step: It performs the XOR operation to provide 
minor diffusion. 


e Rho (p) step: It performs bitwise rotation of each of the 25 
words. 


e Pi (x) step: It performs permutation of each of the 25 
words. 


e Chi (x) step: In this step, bits are replaced by combining 
those with their two subsequent bits in their rows. 


e Jota (1) step: It XORs a round constant into one word of the 
state to break the symmetry. 


e The last round of Keccak-f produces the yg output, which is 
enough for SHA-2 replacement mode, i.e., the output with 224, 
256, 384, and 512 bits. Note that the least significant bits of yo 
are used for the desired length output. In case of variable length 
output, along with yo, other output bits of y,, Yo, ys... can also be 
used. 


When it comes to the real-life implementation of SHA-3, it is 
found that its performance is good in software (though not as good 
as SHA-2) and is excellent in hardware (better than SHA-2). 


Applications of Hash Functions 


The cryptographic hash functions have many different usages in 
different situations. Following are a few example use cases: 


e Hash functions are used in verifying the integrity and 
authenticity of information. 


e Hash functions can also be used to index data in hash tables. 


This can speed up the process of searching. Instead of the whole 
data, if we search based on the hashes (assuming the much 
shorter hash value compared with the whole data), then it 
should obviously be faster. 


e They can be used to securely authenticate the users without 
storing the passwords locally. Imagine a situation where you do 
not want to store passwords on the server, obviously because if 
an adversary hacks on to the server, they cannot get the 


password from their stored hashes. Every time a user tries to log 
in, hash of the punched in password is calculated and matched 
against the stored hash. Secured, isn’t it? 


e Since hash functions are one-way functions, they can be used to 
implement PRNG. 


e Bitcoin uses hash functions as a proof of work (PoW) algorithm. 
We will get into the details of it when we hit the Bitcoin chapter. 


e Bitcoin also uses hash functions to generate addresses to 
improve security and privacy. 


e The two most important applications are digital signatures and 


in MACs such as hash-based message authentication codes 
(HMACs). 


Understanding the working and the properties of the hash 
functions, there can be various other use cases where hash functions 
can be used. 


Note The Internet Engineering Task Force (IETF) adopted 
version 3.0 of the SSL (SSLv3) protocol in 1999, renamed it to 


Transport Layer Security (TLS) version 1.0 (TLSv1) protocol and 
defined it in RFC 2246. SSLv3 and TLSv1 are compatible as far as 
the basic operations are concerned. 





Code Examples of Hash Functions 

Following are some code examples of different hash functions. This 
section is just intended to give you a heads-up on how to use the 
hash functions programatically. Code examples are in Python but 
would be quite similar in different languages; you just have to find 
the right library functions to use. 


# -*- coding: utf-8 -*- 

ain(tjeoucie er. eoveld nal 6) 

# hashlib module is a popular module to do hashing 
aRaven sy Asi avenal 


TOOMsmiele bonsai aNGloulee peice leer tia 4alee 
slrez 6,0), shaso4 Or, ancishaal7() present, jam 


hashlib 

md=hashlib.md5d() 

md.update ("The quick brown fox jumps over the lazy 
dog") 

print md.digest () 

Dita Pics oso NC OLgSs ih. Sulae wai. EboCls 
SZ St eo etMc LOC ks ize 


# Comparing digest of SHA224, SHA256,SHA384,SHA512 
PED: “Degese SHAZZ4™ hash vo. shaZ74 ie ine qulck 
brown fox jumps over the lazy dog") .hexdigest () 

Di tiie MUMS WHA oe: wash be ciao. wees cure 
brown fox jumps over the lazy dog") .hexdigest () 
Joheak onc, ab sige (evone: PSE VANS eo: eae Mobskodoidlmlle wa sNehe ores Me iMayes wo rbislyor« 
brown fox jumps over the lazy dog") .hexdigest () 
jenaau icemIP ble aisun Sinlaodey aay waversigiiaaiieyaisl gic oboe Hilal sono pulake < 
brown fox jumps over the lazy dog") .hexdigest () 

# All hashoutputs are unique 





# RIPEMD160 160 bit hashing example 

h = hashlib.new('ripemd160"') 

h.update("The quick brown fox jumps over the lazy 
dog") 

h.hexdigest () 


#Key derivation Alogithm: 

#Native hashing algorithms are not resistant 
against brutefore attack. 

#Key deviation algorithms are used for securing 
password hashing. 

Tig] Closcueey avekeycMloll ovet pf eaigyeNsioubal 

algorithm='sha256' 

password='HomewWifi' 

Salt='sale’ #4 salt 1S tandom cate that can be used 
eS (aieeadicas Tote |) pW Esso. eh OMe awash Un Cis Icon 

nu foumds— 10.00 

key Jength=o4 fdklen asthe engin or the derived 
key 


dk — hasnlib=pbkdt2vhmac (algorithm, password, salt, 
A Se OuiiS >. Ciera ya ei tela) 

print 'derieved key: ',dk 

print 'derieved key in hexadeximal :', 
binascii.hexlify (dk) 





# Check properties for hash 
amo Owmbe ers ikalks 


input = "Sample Input Text" 
ROP Hl ny sscange GUN ss 
# add the iterator to the end of the text 
LM PUES ais, — oO Meat AS es 1) 
# show the input and hash result 
jSpentishea slech abies 1c, 
2 esi sew she Olen pu sex rene x cnc es sir.() 


MAC AND HMAC 


HMAC is a type of MAC (message authentication code) . As the name 
suggests, a MAC’s purpose is to provide message authentication 
using Symmetric Key and message integrity using hash functions. So, 
the sender sends the MAC along with the message for the receiver to 
verify and trust it. The receiver already has the key K (as symmetric 
key cryptography is being used, so both sender and receiver have 
agreed on it already); they just use it to compute the MAC of the 
message and check it against the MAC that was sent along with the 
message. 

In its simplest form, MAC = H(key || message). HMAC is actually 
a technique to turn the hash functions into MACs. In HMAC, the 
hash functions can be applied multiple times along with the key and 
its derived keys. HMACs are widely used in RFID-based systems, 
TLS, etc. In SSL/TLS (HTTPS is TTP within SSL/TLS), HMAC is 
used to allow client and server to verify and ensure that the 
exchanged data has not been altered during transmission. Let us 
take a look at a few of the important MAC strategies that are widely 
used: 


e MAC-then-Encrypt: This technique requires the computation 


of MAC on the cleartext, appending it to the data, and then 
encrypting all of that together. This scheme does not provide 


integrity of the ciphertext. At the receiving end, the message 
decryption has to happen first to be able to check the integrity of 
the message. It ensures the integrity of the plaintext, however. 
TLS uses this scheme of MAC to ensure that the client-server 
communication session is secured. 


e Encrypt-and-MAC: This technique requires the encryption 


and MAC computation of the message or the cleartext, and then 
appending the MAC at the end of the encrypted message or 
ciphertext. Notice that MAC is computed on the cleartext, so 
integrity of the cleartext can be assured but not of the ciphertext, 
which leaves scope for some attacks. Unlike the previous 
scheme, integrity of the cleartext can be verified. SSH (Secure 
Shell)uses this MAC scheme. 


e Encrypt-then-MAC: This technique requires that the cleartext 


needs to be encrypted first, and then compute the MAC on the 
ciphertext. This MAC of the ciphertext is then appended to the 
ciphertext itself. This scheme ensures integrity of the ciphertext, 
so it is possible to first check the integrity and if valid then 
decrypt it. It easily filters out the invalid ciphertexts, which 
makes it efficient in many cases. Also, since MAC is in 
ciphertext, in no way does it reveal information about the 
plaintext. It is usually the most ideal of all schemes and has 
wider implementations. It is used in IPsec. 


ASYMMETRIC KEY CRYPTOGRAPHY 


Asymmetric key cryptography, also known as “public key 
cryptography,” is a revolutionary concept introduced by Diffie and 
Hellman. With this technique, they solved the problem of key 
distribution in a symmetric cryptography system by introducing 
digital signatures. Note that asymmetric key cryptography does not 
eliminate the need for symmetric key cryptography. They usually 
complement each other; the advantages of one can compensate for 
the disadvantages of the other. 

Let us see a practical scenario to understand how such a system 
would work. Assume that Alice wants to send a message to Bob 
confidentially so that no one other than Bob can make sense of the 
message, then it would require the following steps: 

Alice—The Sender: 


e Encrypt the plaintext message m using encryption algorithm E 
and the public key Pukgop to prepare the ciphertext ec. 


e c= E(Pukgop, m ) 
e Send the ciphertext c to Bob. 
Bob—The Receiver: 


e Decrypt the ciphertext ¢ using decryption algorithm D and its 
private key Prkgoy to get the original plaintext m. 


¢ m= D(Prkgop, Cc) 
Such a system can be represented as shown in Figure 2-13. 


Public Key Repository 










' 
; (Alice) (Charlie) 
: Puk, Puk. 


| Reliable Key Distribution Channel 





Privale Key 
(Alicel 
ee ! 


Public Key Private Key 
looks Unlocks 





“Public Key (Pukg} 


a —>(| er | Eeeryption | — ens 










Any insecure { 
Communication Channel < hese 


Message f 
(im) Ciphertext im) 
Encryption te) om ; Decryption 
Algcrithm Algorithm 





(E\ (D) 
Sender (Alice) Receiver (Bob) 
Figure 2-13 Asymmetric cryptography for confidentiality 


Notice that the public key should be kept in a public repository 
accessible to everyone and the private key should be kept as a well- 
guarded secret. Public key cryptography also provides a way of 
authentication. The receiver, Bob, can verify the authenticity of the 
origin of the message m in the same way. 


Public Key Repository 


ieee! 
Z 

5 
2 z 
# 3 














' Reliable Key Distribution Channel ( 










Privale Key 
| (Alice) 





Privote Key 
for signing 






Public Key for 
verificotion 








Private Key 
(Rohi 
Public Key (Puk,) 
Be Decretion | = an i+ gl 


Message 
im) 


Private Key (Prk,) 


| Sr 
fl — (Geer) Feeryption > Bs 


Message 
(m) 






Any insecure 
Communication Channel 





tl ” ciphertaxt 

(c) ‘gies jon 

Algorithm 
(D) 


Ciphertext 
Encryption te) 
Algcrithm 

{E) 


Sender (Alice) Receiver (Bob) 








Figure 2-14 Asymmetric cryptography for authentication 


In the example in Figure 2-14, the message was prepared using 
Alice’s private key, so it could be ensured that it only came from 
Alice. So, the entire message served as a digital signature. Note that 
both confidentiality and authentication are desirable. To facilitate 
this, public key encryption has to be used twice. The message should 
first be encrypted with the sender’s private key to provide a digital 
signature. Then it should be encrypted with the receiver’s public key 
to provide confidentiality. It can be represented as: 


e c= E[Puk Bob 3 E(Prk Alice 9 m)] 
¢ m= D[Puk Alice » D(Prk Bob >» ©)] 


As you can see, the decryption happens in just its reverse order. 
Notice that the public key cryptography is used four times here: 
twice for encryption and twice for decryption. It is also possible that 
the sender may sign the message by applying the private key to just a 
small block of data derived from the message to be sent, and not to 
the whole message. In the real world, App stores such as Google Play 
or Apple App Store require that the software apps should be digitally 
signed before they get published. 

We looked at the uses of the two keys in asymmetric 
cryptography, which can be summarized as follows: 


e Public keys are known and accessible to everyone. They can be 
used to encrypt the message or to verify the signatures. 


e Private keys are extremely private to individuals. They are used 
to decrypt the message or to create signatures. 


In asymmetric or public key cryptography, there is no key 
distribution problem, as exchanging the agreed upon key is no longer 
needed. However, there is a significant challenge with this approach. 
How would one ensure that the public key they are using to encrypt 
the message is really the public key of the intended recipient and not 
of an intruder or eavesdropper? To solve this, the notion of a trusted 
third party called public key infrastructure (PKI) is introduced. 
Through PKIs, the authenticity of public keys is assured by the 
process of attestation or notarization of user identity. The way PKIs 
operate is that they provide verified public keys by embedding them 
in a security certificate by digitally signing them. 

The public key encryption scheme can also be called one-way 
function or a trapdoor function. This is because encrypting a 
plaintext using the public key “Puk” is easy, but the other direction is 
practically impossible. No one really can deduce the original 
plaintext from the encrypted ciphertext without knowing the secret 
or private key “Prk,” which is actually the trapdoor information. 
Also, in the context of just the keys, they are mathematically related 
but it is computationally not feasible to find one from the other. 

We discussed the important objectives of public key cryptography 
such as key establishment, authentication and non-repudiation 
through digital signatures, and confidentiality through encryption. 
However, not all public key cryptography algorithms may provide all 
these three characteristics. Also, the algorithms are different in 
terms of their underlying computational problem and are classified 
accordingly. Certain algorithms such as RSA are based on integer 
factorization scheme because it is difficult to factor large numbers. 
Certain algorithms are based on the discrete logarithm problems in 
finite fields such as Diffie-Hellman key exchange (DH) and DSA. A 
generalized version of discrete logarithm problems is elliptic curve 
(EC) public key schemes. The Elliptic Curve Digital Signature 
Algorithm (ECDSA) is an example of it. We will cover most of these 
algorithms in the following section. 


RSA 


RSA algorithm, named after Ron Rivest, Adi Shamir, and Leonard 
Adleman is possibly one of the most widely used cryptographic 
algorithms. It is based on the practical difficulty of factoring very 


large numbers. In RSA, plaintext and ciphertext are integers between 
oO and n - 1 for some n. 

We will discuss the RSA scheme from two aspects. First is 
generation of key pairs and second, how the encryption and 
decryption works. Since modular arithmetic provides the mechanism 
for key generation, let us quickly look at it. 


Modular Arithmetic 
Let m be a positive integer called modulus. Two integers a and b are 
congruent modulo m if: 

a =b (mod m), which implies a —- b = m. k for some integer k. 

Example: if a = 16 (mod 10) then a can have the following 
solutions: 

a=...,—24,— 14, —-4, 6, 16, 26, 36, 46 

Any of these numbers subtracted by 16 is divisible by 10. For 
example, —24 -16 = —40, which is divisible by 10. Note that a = 36 
(mod 10) can also have the same solutions of a. 

As per the Quotient-Remainder theorem, only a unique solution 
of “a” exists that satisfies the condition: 0 < a < m. In the example a 
= 16 (mod 10), only the value 6 satisfies the condition 0 < 6 < 10. 
This is what will be used in the encryption/decryption process of 
RSA algorithm. 

Let us now look at the Inverse Midulus. If b is an inverse to a 
modulo m, then it can be represented as: 

a b =1 (mod m), which implies that a b - 1 = m.k for some 
integer k. 

Example: 3 has inverse 7 modulo 10 since 

3-7=1(mod 10) => 21 - 1 = 20, which is divisible by 10. 


Generation of Key Pairs 
As discussed already, a key pair of private and public keys is needed 
for any party to participate in asymmetric crypto-communication. In 
the RSA scheme, the public key consists of (e, n) where n is called 
the modulus and e is called the public exponent. Similarly, the 
private key consists of (d, n), where n is the same modulus and d is 
the private exponent. 

Let us see how these keys get generated along with an example: 


e Generate a pair of two large prime numbers p and q. Let us take 
two small prime numbers as an example here for the sake of 
easy understanding. So, let the two primes be p = 7 and q = 17. 


e Compute the RSA modulus (n) as n = pq. This n should be a 


large number, typically a minimum of 512 bits. In our example, 
the modulus (n) = pq = 119. 


e Find a public exponent e such that 1 < e < (p — 1) (q - 1) and 


there must be no common factor for e and (p — 1) (q — 4) except 
1. It implies that e and (p - 1) (q - 1) are coprime. Note that 
there can be multiple values that satisfy this condition and can 
be taken as e, but any one should be taken. 


e In our example, (p — 1) (q —- 1) = 6 x 16 = 96. So, e can be 
relatively prime to and less than 96. Let us take e to be 5. 


e Now the pair of numbers (e, n) form the public key and should 
be made public. So, in our example, the public key is (5, 119). 


e Calculate the private exponent d using p, q, and e considering 


the number d is the inverse of e modulo (p — 1) (q - 1). This 
implies that d when multiplied by e is equal to 1 modulo (p — 1) 
(q - 1) andd < (p- 4) (q - 1). It can be represented as: 


e d =1 mod (p - 1) (q-1) 


e Note that this multiplicative inverse is the link between the 


private key and the public key. Though the keys are not derived 
from each other, there is a relation between them. 


e In our example, we have to find d such that the above equation 
is satisfied. Which means, 5 d = 1 mod 96 and also d < 96. 


e Solving for multiple values of d (can be calculated using the 
extended version of Euclid’s algorithm), we can see that d = 77 
satisfies our condition. See the math: 77 x 5 = 385 and 385 -1= 
384 is divisible by 96 because 4 x 96 + 1= 385 

e We can conclude that the in our example, the private key will be 
(77, 119). 


e Now you have got your key pairs! 
Encryption/Decryption Using Key Pair 


Once the keys are generated, the process of encryption and 
decryption are fairly simple. The math behind them is as follows: 


Encrypting the plaintext message m to get the ciphertext 
message C is as follows: 

c =m.e (mod n) given the public key (e, n) and the plaintext 
message m. 

Decrypting the ciphertext message c to get the plaintext message 
m is as follows: 

m =c.d (mod n) given the private key (d, n) and the ciphertext 
c. 

Note that RSA scheme is a block cipher where the input is divided 
into small blocks that the RSA algorithm can consume. Also, the 
plaintext and the ciphertext are all integers from o to n — 1 for some 
integer n that is known to both sender and receiver. This means that 
the input plaintext is represented as integer, and when that goes 
through RSA and becomes ciphertext, they are again integers but not 
the same ones as input; we encrypted them remember? Now, 
considering the same key pairs from the previous example, let us go 
through the steps to understand how it works practically: 


e The sender wants to send a text message to the receiver whose 
public key is known and is say (e, n). 


e The sender breaks the text message into blocks that can be 
represented as a series of numbers less than n. 


e The ciphertext equivalents of plaintext can be found using c = m 


e (mod n). If the plaintext (am) is 19 and the public key is (5, 119) 
with e = 5 and n = 119, then the ciphertext ¢ will be 195(mod 
119) = 2, 476, 099 (mod 119) = 66, which is the remainder and 
20,807 is the quotient, which we do not use. So, ¢ = 66 


e When the ciphertext 66 is received at the receiver’s end, it needs 
to be decrypted to get the plaintext using m = ec d (mod n). 


e The receiver already has the private key (d, n) with d = 77 andn 


= 119, and received the ciphertext c = 66 by the sender. So, the 
receiver can easily retrieve the plaintext using these values as m 
= 6,677(mod 119) = 19 


e For the modular arithmetic calculations, there are many online 


calculators that you can play around with, such as: 
hetp?/ / comnuen.com/cmnn02/ emin0Z20087 


We looked at the math behind RSA algorithm. Now we know that 
n (supposed to be a very large number) is publicly available. Though 
it is public, factoring this large number to get the prime numbers p 
and q is extremely difficult. The RSA scheme is based on this 
practical difficulty of factoring large numbers. If p and q are not 
large enough, or the public key e is small, then the strength of RSA 
goes down. Currently, RSA keys are typically between 1024 and 2048 
bits long. Note that the computational overhead of the RSA 
cryptography increases with the size of the keys. 

In situations where the amount of data is huge, it is advisable to 
use a Symmetric encryption technique and share the key using an 
asymmetric encryption technique such as RSA. Also, we looked at 
one of the aspects of RSA, that is, for encryption and decryption. 
However, it can also be used for authentication through digital 
signature. Just to give a high-level idea, one can take the hash of the 
data, sign it using their own private key, and share it along with the 
data. The receiver can check with the sender’s public key and ensure 
that it was the sender who sent the data, and not someone else. This 
way, in addition to secure key transport, the public key encryption 
method RSA also offers authentication using a digital signature. Note 
here that a different algorithm called digital signature algorithm 
(DSA) can also be used in such situations that we will learn about in 
the following section. 

RSA is widely being used with HTTPS on web browsers, emails, 
VPNs, and satellite TV. Also, many commercial applications or the 
apps in app stores are also digitally signed using RSA. SSH also uses 
public key cryptography; when you connect to an SSH server, it 
broadcasts a public key that can be used to encrypt data to be sent to 
that server. The server can then decrypt the data using its private 
key. 


Digital Signature Algorithm 


The DSA was designed by the NSA as part of the Digital Signature 
Standard (DSS) and standardized by the NIST. Note that its primary 
objective is to sign messages digitally, and not encryption. Just to 
paraphrase, RSA is for both key management and authentication 
whereas DSA is only for authentication. Also, unlike RSA, which is 
based on large-number factorization, DSA is based on discrete 
logarithms. At a high level, DSA is used as shown in Figure 2-15. 


fh, 


Alice 
(Sender) 


- 


Bob 
(Receiver)! 
\ 


~ 
So 
aa 


™ i aust vat 
arty de nt y 
Messege - 
Text Hash 
1 
¥ 


Te pop st tee 2: 
1) fo rend the 


oe Tur: Fa 





Message with 
Signed Hash 






N =!» De ALS: 28 ee 
H |= ersten [— > xs —- apt tt cin Ho 
= Serene Sender’s 9 tefhoty : hie 
pat Hashed Private Ke lg <a==. i 
' Y : Message with 
Function Our jut Si ned Hash i =55ace 
' Signing : ' Signed Hash 





Ik 


hv C——>| ff | came 
‘ef | a Hashed Output 
Message Text Hash function 


/ et 
Public Key |“ authenticity 
Verlfled Hash 





Signed Hash 


Verlfleation 


Figure 2-15 Digital Signature Algorithm (DSA) 


As you can see in Figure 2-15, the message is first hashed and 
then signed because it is more secured compared with signing and 
then hashing it. Ideally, you would like to verify the authenticity 


before doing any other operation. So, after the message is signed, the 


signed hash is tagged with the message and sent to the receiver. The 
receiver can then check the authenticity and find the hash. Also, hash 


the message to get the hash again and check if the two hashes match. 


This way, DSA provides the following security properties: 


e Authenticity: Signed by private key and verified by public key 


e Data integrity: Hashes will not match if the data is altered. 


e Non-repudiation: Since the sender signed it, they cannot deny 
later that they did not send the message. Non-repudiation is a 
property that is most desirable in situations where there are 
chances of a dispute over the exchange of data. For example, 
once an order is placed electronically, a purchaser cannot deny 
the purchase order if non-repudiation is enabled in such a 
situation. 


A typical DSA scheme consists of three algorithms: (1) key 
generation, (3) signature generation, and (3) signature verification. 


Elliptic Curve Cryptography 


Elliptic curve cryptography (ECC) actually evolved from Diffie- 
Hellman cryptography. It was discovered as an alternative 
mechanism for implementing public key cryptography. It actually 
refers to a suite of cryptographic protocols and is based on the 
discrete logarithm problem, as in DSA. However, it is believed that 
the discrete logarithmic problem is even harder when applied to the 
points on an elliptic curve. So, ECC offers greater security for a given 
key size. A 160-bit ECC key is considered to be as secured as a 1024- 
bit RSA key. Since smaller key sizes in ECC can provide greater 
security and performance compared with other public key 
algorithms, it is widely used in small embedded devices, sensors, and 
other IoT devices, etc. There are extremely efficient hardware 
implementations available for ECC. 

ECC is based on a mathematically related set of numbers on an 
elliptic curve over finite fields. Also, it has nothing to do with 
ellipses! Mathematically, an elliptic curve satisfies the following 
mathematical equation: 

y~ = x? + ax + b, where 4 a® + 27b* #0 

With different values of “a” and “b”, the curve takes different 
shapes as shown in the following diagram: 


3 
- 


y=xr-l Pexe+] ypewt—-3xt+3 yper-de  yvexr-x 


/ | J IFA | / 
\ 1% at || ST \ 


\ 
\ : sb \ ‘ 4 \J L 1 4 


_ m L - 4 L 






































There are several important characteristics of elliptic curves that 
are used in cryptography, such as: 


e They are horizontally symmetrical. i.e., what is below the X-axis 


is a mirror image of what is above the X-axis. So, any point on 
the curve when reflected over the X-axis still remains on the 
curve. 


e Any nonvertical line can intersect the curve in at most three 
places. 


e If you consider two points P and Q on the elliptic curve and 
draw a line through them, the line may exactly cross the curve at 
one more places. Let us call it (—- R). If you draw a vertical line 
through (- R), it will cross the curve at, say, R, which is a 
reflection of the point (— R). Now, the third property implies 
that P + Q = R. This is called “point addition,” which means 
adding two points on an elliptic curve will lead you to another 
point on the curve. Refer to the following diagram for a pictorial 
representation of these three properties. 





e So, you can apply point addition to any two points on the curve. 
Now, in the previous bullet-point, we did point addition of P 
and Q (P + Q) and found — R and then ultimately arrived at R. 
Once we arrive at R, we can then draw a line from P to R and 
see that the line intersects the graph again at a third point. We 
can then take that point and move along a vertical line until it 
intersect the graph again. This becomes the point addition for 
points P and R. This process with a fixed P and the resulting 
point can continue as long as we want, and we will keep getting 
new points on the curve. 


Now, instead of two points P and Q, what if we apply the 
operation to the same point P, i.e., P and P (called “point 
doubling”). Obviously, infinite numbers of lines are possible 
through P, so we will only consider the tangential line. The 
tangent line will cross the curve in one more point and a vertical 


line from there will cross the curve again to get to the final value. 
It can be shown as follows: 





ce 99 


e It is evident that we can apply point doubling “n” number of 


times to the initial point and every time it will lead us to a 
different point on the curve. The first time we applied point 
doubling to the point P, it took us to the resulting point 2P as 
you can see in the diagram. Now, if the same is repeated “n” 
number of times, we will reach a point on the curve as shown in 
the following diagram: 





In the aforementioned scenario, when the initial and final point 


is given, there is no way one can say that the point doubling was 
applied “n” number of times to reach the final resulting point 
except trying for all possible “n” one by one. This is the discrete 
logarithm problem for ECC, where it states that given a point G 
and Q, where Q is a multiple of G, find “d” such that Q = d G. 
This forms the one-way function with no shortcuts. Here, Q is 
the public key and d is the private key. Can you extract private 
key d from public key Q? This is the elliptic curve discrete 
logarithm problem, which is computationally difficult to solve. 


Further to this, the curve should be defined over a finite field 
and not take us to infinity! This means the “max” value on the 
X-axis has to be limited to some value, so just roll the values 
over when we hit the maximum. This value is represented as P 
(not the P used in the graphs here) in the ECC cryptosystem and 
is called "modulo” value, and it also defines the key size, hence 
the finite field. In many implementations of ECC, a prime 
number for “P” is chosen. 


Increased size of “P” results in more usable values on the curve, 
hence more security. 


We observed that point addition and point doubling form the 


basis for finding the values that are used for encryption and 
decryption. 


So, in order to define an ECC, the following domain parameters 


need to be defined: 


The Curve Equation: y* = x* + ax + b, where 4 a® + 27 b* #0 
P: The prime number, which specifies the finite field that the 
curve will be defined over (modulo value) 


a and b: Coefficients that define the elliptic curve 


G: Base point or the generator point on the curve. This is the 
point where all the point operations begin and it defines the 
cyclic subgroup. 

n: The number of point operations on the curve until the 
resultant line is vertical. So, it is the order of G, i.e., the smallest 


positive number such that nG = ©. It is normally prime. 


e h: It is called “cofactor,” which is equal to the order of the curve 
divided by n. It is an integer value and usually close to 1. 


Note that ECC is a great technique to generate the keys, but is 
used alongside other techniques for digital signatures and key 
exchange. For example, Elliptic Curve Diffie-Hellman (ECDH) is 
quite popularly used for key exchange and ECDSA is used for digital 
signatures. 


Elliptic Curve Digital Signature Algorithm 


The ECDSA is a type of DSA that uses ECC for key generation. As the 
name suggests, its purpose is digital signature, and not encryption. 
ECDSA can be a better alternative to RSA in terms of smaller key 
size, better security, and higher performance. It is one of the most 
important cryptographic components used in Bitcoins! 

We already looked at how digital signatures are used to establish 
trust between the sender and receiver. Since authenticity of the 
sender and integrity of the message can be verified through digital 
signatures, two unknown parties can transact with each other. Note 
that the sender and the receiver have to agree on the domain 
parameters before engaging in the communication. 

There are broadly three steps to ECDSA: key generation, 
signature generation, and signature verification. 


Key Generation 

Since the domain parameters (P, a, b, G, n, h) are preestablished, 
the curve and the base point are known by both parties. Also, the 
prime P that makes it a finite field is also known (P is usually 160 
bits and can be greater as well). So, the sender, say, Alice does the 
following to generate the keys : 


e Select a random integer d in the interval [1, n - 1] 
e Compute Q=dG 
e Declare Q is the public key and keep d as the private key. 


Signature Generation 

Once the keys are generated, Alice, the sender, would use the private 
key “d” to sign the message (mm). So, she would perform the following 
steps in the order specified to generate the signature: 


e Select a random number k in the interval [1, n - 1] 
e Compute k.G and find the new coordinates (x,, y,) and find r = 
xX,modn 
If r = o, then start all over again 
¢ Compute e = SHA-1 (im) 
e Computes =k *(e+d.r)modn 
If s = oO, then start all over again from the first step 
e Alice’s signature for the message (m) would now be (1, s) 


Signature Verification 


Let us say Bob is the receiver here and has access to the domain 
parameters and the public key Q of the sender Alice. As a security 
measure, Bob should first verify that the data he has, which is the 
domain parameters, the signature, and Alice’s public key Q are all 
valid. To verify Alice’s signature on the message (m), Bob would 
perform the following operations in the order specified: 


e Verify that r and s are integers in the interval [1, n - 1] 
e Compute e = SHA-1 (im) 

e Compute w=s *modn 

e Compute u, = e wmod n, andu, =rwmodn 


e Compute X = u, G + uy G, where X represents the coordinates, 
Say CS; Yo) 


e Compute v = x, modn 
e Accept the signature if r = v, otherwise reject it 


In this section, we looked at the math behind ECDSA. Recollect 
that we used a random number while generating the key and the 
signature. It is extremely important to ensure that the random 
numbers generated are actually cryptographically random. In many 
use cases, 160-bit ECDSA is used because it has to match with the 
SHA-1 hash function. 


Out of so many use cases, ECDSA is used in digital certificates. In 
its simplest form, a digital certificate is a public key, bundled with 
the device ID and the certificate expiration date. This way, 
certificates enable us to check and confirm to whom the public key 
belongs and the device is a legitimate member of the network under 
consideration . These certificates are very important to prevent 
“impersonation attack” in key establishment protocols. Many TLS 
certificates are based on ECDSA key pair and this usage continues to 
grow. 


Code Examples of Assymetric Key Cryptography 
Following are some code examples of different public ley algorithms. 
This section is just intended to give you a heads-up on how to use 
different algorithms programatically. Code examples are in Python 
but would be quite similar in different languages; you just have to 
find the right library functions to use. 


# -*- coding: utf-8 -*- 

IMpork —CrypEo 

Prom ryote .Publvehey ampork, Rox 
MEOMCr VOLO: TnpOke Rancdom 

FeO dics kan AMO Omis Site o0 


# Function to generate keys with default lenght 
1024 
del generar ey wey (KEN CEN mE—kQAe \-s 
random value= Random.new().read 
kKevyPair—RoA Generate (KEY TENGIN, random value) 
return keyPair 





#Generate Key for ALICE and BOB 
Dobhey—gene nate key.) 
aliceKey=generate key () 





#Print Public Key of Alice and Bob. This key could 
shared 

alicePK=aliceKey.publickey () 
bobPK=bobKey.publickey () 


Pir relce Ss. Pulp ie heaves) elaiGe Rik 


jcuanhehe i Jaiolemacems so lollkime: Mven au lore je) 2x. 


#Alice wants to send a secret message to Bob. Lets 
create a dummy message for Alice 

See reUmMessage— alee Ss Seerek Message GO.bol, 
Prime “Message, —Ssecrer message 


# Function to generate a signature 

dere generate stone curetkey.,mMescacgeye 
Message Nasi—shea2so(mMessage digest i) 
SLgmaluTe-Key.stgnimescage: Mmasinye. \) 
return signature 


# Lets generate a signature for secret message 
cl Mee nstgn Generate signet seta brcekey, secuct mess 
age) 


# Before sending message in network, encrypt 
message using the Bob's public key... 
enoryOLed hon ibob: = sbobeK enc rypu (secre message, 
a) 


# Bob decrypts secret message using his own 
private key... 

decrypted message = 
bobkhey.dSery DE lencryoreds for soob) 

Prant Sbeckypted Messages. , -decEyovecemescage 


# Bob will use the following function to verify 
the signature from Alice using her public key 
deb veri tvesltonabure (message, Publ Chey, srdnearure)e: 
Message hash—shazoo(messaqe) digest () 
verify = 
PUbLUCKey veri Ey(nescagesiasil.s rOnacure) 
return verify 


# bob is verifying using decrypted message and 
alicels soup ac key 


print "Is alice's signature for decrypted message 
pigonlhuite Raph 

VElliy ss1onatune (Seerypred Message palwecrk, 
icon sign) 


The ECDSA Algorithm 


import ecdsa 


+ Oo 2 Gk Misc het Babe Ons aL irinLen Clune 
SigningKey = 

ecdsa.SigningKey.generate (curve=ecdsa.SECP256k1) 
# Get the verifying key 

VEELEYy MnGKe y= Stoning hey. Get Verve Bing Rey) 


# Generate The signature of a message 
Signature = signingKey.sign(b"signed message") 


# Verify the signature is valid or invalid for a 
message 

verifyingKey.verify(signature, b"signed message") 
# True. slgnature as" valid 


# Verify the signature is valid or invalid for a 
message 

assert verifyingKey.verify(signature, b"message") 
# THrOWS an Error. Signature is invalid for 
message 


DIFFIE-HELLMAN KEY EXCHANGE 


We already looked at symmetric key cryptography in the 
previous sections. Recollect that sharing the secret between the 
sender and the receiver is a very big challenge. As a rule of 
thumb, we are now aware that the the communication channel 
is always insecure. There could always be an Eve trying to 
intercept your message while it is being transmitted by using 
various different kinds of attacks. So, the technique of DH was 
developed for securely exchanging the cryptographic keys. 
Obviously, you must be wondering how secure key exchange is 
possible when the communication channel itself is insecured. 
Well, later in this section you will see that the DH technique is 
not really sharing the entire secret key between two parties, 
rather it is about creating the key together. At the end of the 
day, what is important is that the sender and the receiver both 
have the same key. However, keep in mind that it is not 
asymmetric key cryptography, as encryption/decrytion does 
not take place during the exchange. In fact, it was the base 
upon which asymmetric key cryptography was later designed. 
The reason we are looking at this technique now is because a 
lot of math that we already studied in the previous section is 
useful here. 

Let us first try to understand the concept at a high level 
before getting into the mathematical explanation. Take a look 
at the following (Figure 2-16), where a simple explanation of 
DH algorithm is presented with colors. 


Alice Bob 


Common paint 


Yellow ae 4 Yellow 
(shared in the clear) 


. + 
— Red SS: Secret colors +E Green — 










Public transport 


(assume 
that mixture separation 
is expensive) 


—— 





Secret colors 


Common secret 





Figure 2-16 Diffie-Hellman key exchange illustration 


Notice that only the yellow color was shared between the 
two parties in the first step, which may represent any other 
color or a randon number. Both parties then add their own 
secret to it and make a mixture . That mixture is again shared 
through the same insecured channel. Respective parties then 
add their secret to it and form their final common secret. In 
this example with colors, observe that the common secrets are 
the combination of same sets of colors. Let us now look at the 


actual mathematical steps that take place for the generation of 
keys: 


e Alice and Bob agree on P = 23 andG=9 


e Alice chooses private key a = 4, computes 9* mod 23 = 6 
and sends it to Bob 


e Bob chooses private key b = 3, computes 9° mod 23 = 16 
and sends it to Alice 


e Alice computes 16+ mod 23 = 9 
e Bob computes 6° mod 23 = 9 


If you follow through these steps, you will find that both 
Alice and Bob are able to generate the same secret key at their 
ends that can be used for encryption/decryption. We used 
small numbers in this example for easy understanding, but 
large prime numbers are used in real-world use cases. To 
understand it better, let us go through the following code 
snippet and see how DH algorithm can be implemented in a 
simple way: 


/* Program to calculate the Keys for two 
parties using Diffie-Hellman Key exchange 
aloo tam 77 


(of EC enie ce On poe mis Mee aul ere ie sales = umole rE) 
home) Loney ua ower lO me Lone, erie ae ehoma tome 
abe Oy Lon Ga wk@mcemiinitesce) 
{ 
if (b == 1) 
IGS IEW ees 


else 
des ere ae Ce ores orn dst | Ow Cel a Oaahe ce 


(/ Main preogram fon DH key compubat ton 
int main () 


{ 
Gage OMe beth prey ye welg a Aya e eh ye oli 


// Both the parties agree upon the public 
keys G and P 

P = 23; // A prime number P is taken 

[aviquin ahieniag (Mabie ey ach iINo om conn Nokece ce lilo l Vianys taal 


C= oF, AY pramitve toot for PP, se. 16 
taken 
prime rd ihe adie Ones Sa Saleh wn Gye 


// Alice will choose the private key a 

a = 4; // a is the chosen private key 

printf("The private key a for Alice 
ClMBCh igi ee euls 

xX = power(G, a, P); // gets the generated 
key 





// Bob will choose the private key b 

b = 3; // b is the chosen private key 

DEI: (TINS private key b tor Bob 
IRS BNI cieVinlsereed On ec 

y = power(G, b, P); // gets the generated 
key 








// Generating the secret key after the 
exchange of keys 

ka = power(y, a, P); // Secret key for 
Alice 

kb = power(x, b, P); // Secret key for Bob 


printf("Secret key for the Alice is 
obec) Wa yerskien) ¢? 


printf ("Secret Key for the Bob is 
ole ym 7 KD); 


Retire (Os 


Note While the discrete logarithm problem is traditionally 


used (the x” mod p), the general process can be modified to 
use elliptic curve cryptography as well. 





SYMMETRIC VS. ASYMMETRIC KEY 
CRYPTOGRAPHY 


We looked at various aspects and types of both symmetric and 
asymmetric key algorithms. Obviously, their design goals and 
implications are different. Let us have a comparative analysis 
so that we use the right one at the right place. 


e Symmetric key cryptography is also referred to as private 
key cryptography. Similarly, asymmetric key cryptography 
is also called public key cryptography. 

e Key exchange or distribution in symmetric key 

cryptography is a big headache, unlike asymmetric key 

cryptography. 

Asymmetric encryption is quite compute-intensive because 


the length of the keys is usually large. Hence, the process 
of encryption and decryption is slower. On the contrary, 
symmetric encryption is faster. 


Symmetric key cryptography is appropriate for long 
messages because the speed of encryption/decryption is 
fast. Asymmetric key cryptography is appropriate for short 
messages, and the speed of encryption/decryption is slow. 


In symmetric key cryptography, symbols in plaintext and 
ciphertext are permuted or substituted. In asymmetric key 


cryptography, plaintext and ciphertext are treated as 
integers. 


In many situations, when symmetric key is used for 


encryption and decryption, asymmetric key technique is 
used to share and agree upon the key used in encryption. 


Asymmetric key cryptography finds its strongest 


application in untrusted environments, when parties 
involved have no prior relationship. Since the unknown 
parties do not get any prior opportunity to establish shared 
secret keys with each other, sharing of sensitive data is 
secured through public key cryptography. 


Symmetric cryptographic techniques do not provide a way 


for digital signatures, which are only possible through 
asymmetric cryptography. 


Another good case is the number of keys required among a 


group of nodes to communicate with each other. How 
many keys do you think would be needed among, say, 100 
participants when symmetric key cryptography is needed? 
This problem of finding the keys needed can be 
approached as a complete graph problem with order 100. 
Like each vertex requires 99 connected edges to connect 
with everyone, every participant would need 99 keys to 
establish secured connections with all other nodes. 

So, in total, the keys needed would be 100 * (100 - 1)/2 
= 4,950. It can be generalized for “n” number of 
participants as n * (n — 1)/2 keys in total. With an 
increased number of participant, it becomes a nightmare! 
However, in the case of asymmetric key cryptography, 
each participant would just need two keys (one private and 
one public). For a network of 100 participants, total keys 
needed would be just 200. Table 2-5 shows some sample 
data to give you an analogy on the increased number of 
keys needed when the number of participants increases. 


Table 2-5 Key Requirements Comparison for Symmetric and 
Asymmetric Key Techniques 





Game Theory 


Game Theory is a certainly quite an old concept and is being 
used in many real-life situations to solve complex problems. 
The reason we are covering this topic at a high level is because 
it is used in Bitcoins and many other blockchain solutions. It 
was formally introduced by John von Neumann to study 
economic decisions. Later, it was more popularized by John 
Forbes Nash Jr because of his theory of “Nash Equilibrium,” 
which we will look into shortly. Let us first understand what 
game theory is. 

Game theory is a theory on games, where the games are not 
just what children play. Most are situations where two or more 
parties are involved with some strategic behavior. Examples: A 
cricket tournament is a game, two conflicting parties in a court 
of law with lawyers and juries is a game, two siblings fighting 
over an ice cream is a game, a political election is a game, a 
traffic signal is also a game. Another example: Say you applied 
for a blockchain job and you are selected and offered a job offer 
with some salary, but you reject the offer, thinking there is a 
huge gap in the demand and supply and chances are good they 
will revise the offer with a higher salary. You must be thinking 
now, what is not a game? Well, in real situations, almost 
everything is a game. So, a “game” can be defined as a situation 
involving a “correlated rational choice.” What it means is that 
the prospects available for any player are dependent not only 
on their own choices, but also on the choices that others make 


in a given situation. In other words, if your fate is impacted by 
the actions of others, then you are in a game. So what is game 
theory? 

Game theory is a study of strategies involved in complex 
games. It is the art of making the best move, or opting for a 
best strategy in a given situation based on the objective. To do 
so, one must understand the strategy of the opponent and also 
what the opponent thinks your move is going to be. Let us take 
a simple example: There are two siblings, one elder and the 
other younger. Now, there are two ice creams in the fridge, one 
is orange flavor and the other is mango flavor. The elder one 
wants to eat the orange flavor, but knows if he opts for that, 
then the younger one would cry for the same orange. So, he 
opts for the mango flavored ice cream and it turns out as 
expected, the younger one wants the same. Now, the elder one 
pretends to have sacrificed the mango flavored ice cream and 
gives it to the younger one and eats the orange one himself. 
Look at the situation: this is a win-win for both the parties, as 
this was the objective of the elder one. If the elder one wanted, 
he could simply have fought with the younger kid and got the 
orange one if that was his objective. In the second case, the 
elder one would strategize where to hit so that the younger kid 
is not injured much but enough so that he gives up on the 
orange flavored ice cream. This is game theory: what is your 
objective and what should be your best move? 

One more example: more on a business side this time. 
Imagine that you are a vendor supplying vegetables to a town. 
There are, say, three ways to get to the town, out of which one 
is a regular route in the sense that everyone goes by that route, 
maybe because it is shorter and better. One day, you see that 
the regular route has been blocked because of some repair 
activity and in no way can you go by that route. You are now 
left with two other routes. One of those is a short route to the 
destination town but is a little narrow. The other one is a little 
longer route but wide enough. Here, you have to make a 
strategy as to which route of the two you need to go by. The 
situation may be such that there is heavy traffic on the roads 
and many people would try to get through the shortest route. 
This can lead to heavy congestion on that route and can cause a 


huge delay. So, you decided to take the longer route to reach 
the town on time, but at the cost of few extra dollars spent on 
fuel. You are sure you can easily get compensated for that if you 
arrive on time and sell your vegetables early at a good price. 
This is game theory: what is your best move for the objective 
you have in mind, which is usually finding an optimal solution. 

In many situations, the role that you play and your objective 
both play a vital role in formulating the strategy. Example: If 
you are an organizer of a sport event, and not a participant in 
the competition, then you would formulate a strategy where 
your objective could be that you want the participants to play 
by the rules and follow the protocol. This is because you do not 
care who wins at the end, you are just an organizer. On the 
other hand, a participant would strategize the winning moves 
by taking into account the strengths and weaknesses of the 
opponent, and the rules imposed by the organizer because 
there could be penalties if you break the rules. Now, let us 
consider this situation with you playing the role of the 
organizer. You should consider if there could be a situation 
where a participant breaks a rule and loses one point but 
injures the opponent so much that they cannot compete any 
longer. So, you have to take into account what the participants 
can think and set your rules accordingly. 

Let us try to define game theory once again based on what 
we learned from the previous examples. It is the method of 
modeling real-life situations in the form of a game and 
analyzing what the best strategy or move of a person or an 
entity could be in a given situation for a desired outcome. 
Concepts from game theory are widely used in almost every 
aspect of life, such as politics, social media, city planning, 
bidding, betting, marketing, distributed storage, distributed 
computing, supply chains, and finance, just to name a few. 
Using game theoretic concepts, it is possible to design systems 
where the participants play by the rules without assuming 
emotional or moral values of them. If you want to go beyond 
just building a proof of concept and get your product or 
solution to production, then you should prioritize game theory 
as one of the most important elements. It can help you build 
robust solutions and lets you test those with different 


interesting scenarios. Well, many people already think in game 
theoretic perspectives without knowing it is game theory. 
However, if you are equipped with the many tools and 
techniques from game theory, it definitely helps. 


NASH EQUILIBRIUM 


In the previous section, we looked at different examples of 
games. There are many ways to classify games, such as 
cooperative/noncooperative games, symmetric/asymmetric 
games, zero-sum/non-zero-sum games, 
simultaneous/sequential games, etc. More generally, let us 
focus on the cooperative/noncooperative perspective here, 
because it is related to the Nash equilibrium. 

As the name suggests, the players cooperate with each other 
and can work together to form an alliance in cooperative 
games. Also, there can be some external force applied to ensure 
cooperative behavior among the players. On the other hand, in 
noncooperative games, the players compete as individuals with 
no scope to form an alliance. The participants just look after 
their own interests. Also, no external force is available to 
enforce cooperative behavior. 

Nash equilibrium states that, in any noncooperative games 
where the players know the strategies of each other, there 
exists at least one equilibrium where all the players play their 
best strategies to get the maximum profits and no side would 
benefit by changing their strategies. If you know the strategies 
of other players and you have your own strategy as well, if you 
cannot benefit by changing your own strategy, then this is the 
state of Nash equilibrium. Thus, each strategy in a Nash 
equilibrium is a best response to all other strategies in that 
equilibrium. 

Note that a player may strategize to win as an individual 
player, but not to defeat the opponent by ensuring the worst for 
the opponents. Also, any game when played repeatedly may 
eventually fall into the Nash equilibrium. 

In the following section, we will look at the “prisoner”s 
dilemma” to get a concrete understanding of the Nash 
equilibrium . 


PRISONER’ S DILEMMA 


Many games in real life can also be non-zero-sum games. 
Prisoner’s dilemma is one such example, which can be broadly 
categorized as a symmetric game. This is because, if you change 
the identities of the players (e.g., if two players “A” and “B” are 
playing, then “A” becomes “B” and “B” becomes “A”), and also 
the strategies do not change, then the payoff remains the same. 
This is what a symmetric game is. 

Let us start directly with an example. Assume that there are 
two guys, Bob and Charlie, who are caught by the cops for 
selling drugs independently, say in different locations. They are 
kept in two different cells for interrogation. They were then 
toldd that they would be sentenced to jail for two years for this 
crime. Now, the cops somehow suspect that these two guys 
could also be involved in the robbery that just happened last 
week. If they did not do the robbery, then it is two years of 
imprisonment anyway. So, the cops have to strategize a way to 
get to the truth. So here is what they do. 

The cops go to Bob and give him a choice, a good choice that 
goes like this. If Bob confesses his crime and Charlie does not, 
then his punishment would go down from two years to just one 
year and Bob gets five years. However, if Bob denies and 
Charlie confesses, then Bob gets five years and Charlie gets just 
one year. Also, if both confess, then both get three years of 
imprisonment. Similarly, the same choice is given to Charlie as 
well. What do you think they are going to do? This situation is 
called the prisoner’s dilemma. 

Both Bob and Charlie are in two different cells. They cannot 
talk to each other and conclude with the situation where they 
both deny and get two years in jail (just for the drug dealing 
case), which seems to be the global optimum in this situation. 
Well, even if they could talk to each other, they may not really 
trust each other. 

What would go through Bob’s mind now? He has two 
choices, confess or deny. He knows that Charlie would choose 
what is best for him, and he himself is no different. If he denies 
and Charlie confesses, then he is in trouble by getting five years 


of jail and Charlie gets just one year of jail. He certainly does 
not want to get into this situation. 

If Bob confesses, then Charlie has two choices: confess or 
deny. Now Bob thinks that if he confesses, then whatever 
Charlie does, he is not getting more than three years. Let us 
state these scenarios for Bob. 


e Bob confesses and Charlie denies—Bob gets one year, 
Charlie gets five years (best case given Bob confesses) 


¢ Bob confesses and Charlie also confesses—Both Bob and 
Charlie get three years (worst case given Bob confesses) 


This situation is called Nash equilibrium where each party 
has taken the best move, given the choices of the other party. 
This is definitely not the global optimum, but represents the 
best move as an individual. Now, if you look at this situation as 
an outsider, you would say both should deny and get two years. 
But when you play as a participant in the game, Nash 
equilibrium is what you would eventually fall into. Note that 
this is the most stable stage where you changing your decision 
does not benefit you at all. It can be pictorially represented as 
shown in Figure 2-17. 


Charlie 


Confess Deny 


Bob : 








Figure 2-17 Prisoner’s dilemma-—payoff matrix 


BYZANTINE GENERALS’ PROBLEM 


In the previous section, we looked at different examples of 
games and learned a few game theory concepts. Now we will 
discuss a specific problem from the olden days that is still 
widely used to solve many computer science as well as real-life 
problems. 

The Byzantine Generals’ Problem was a problem faced by 
the Byzantine army while attacking a city. The situation was 
straightforward yet very difficult to deal with. To put it simply, 
the situation was that several army factions commanded by 
separate generals surrounded a city to win over it. The only 
chance of victory is when all the generals attack the city 
together. However, the problem is how to reach a consensus. 
This implies that either all the generals should attack or all of 
them should retreat. If some of them attack and some retreat, 
then chances are greater they would lose the battle. Let us take 
an example with numbers to be able to understand the 
situation better. 

Let us assume a situation where there are five factions of 
the Byzantine army surrounding a city. They would attack the 
city if at least three out of five generals are willing to attack, but 
retreat otherwise. If there is a traitor among the generals, what 
he can do is vote for attack with the generals willing to attack 
and vote for retreat with the generals willing to retreat. He can 
do so because the army is dispersed in factions , which makes 
centralized coordination difficult. This can result in two 
generals attacking the city and getting outnumbered and 
defeated. There could be more complicated issues with such a 
situation: 


e What if there is more than one traitor? 


¢ How would the message coordination between generals 
take place? 


e What if a messenger is caught/killed/bribed by the city 
commander? 


e What if a traitor general forges a different message and 
fools other generals? 


e How to find the generals who are honest and who are 
traitors? 
As you can see, there are so many challenges that need to be 


addressed for a coordinated attack on the city. It can be 
pictorially represented as in Figure 2-18. 





Figure 2-18 Byzantine army attacking the city 


There are numerous scenarios in real life that are analogous 
to the Byzantine Generals’ Problem . How a group of people 
reach consensus on some voting agenda or how to maintain the 
consistent state of a distributed or decentralized database, or 
maintaining the consistent state of blockchain copies across 
nodes in a network are a few examples similar to the Byzantine 
Generals’ Problem. Note, however, that the solutions to these 
different problems could be quite different in different 
situations. We will look at how Bitcoin solves the Byzantine 
Generals’ Problem later in this book. 


ZERO-SUM GAMES 


A zero-sum game in game theory is quite straightforward. In 
such games, one player’s gain is equivalent to another player’s 


loss. Example: One wins exactly the same amount as the 
opponent loses, which means choices by players can neither 
increase nor decrease the available resources in a given 
situation. 

Poker, Chess, Go, etc. are a few examples of zero-sum 
games. To generalize even more, the games where only one 
person wins and the opponent loses, such as tennis, 
badminton, etc. are also zero-sum games. Many financial 
instruments such as swaps, forwards, and options can also be 
described as zero-sum instruments. 

In many real-life situations, gains and losses are difficult to 
quantify. So, zero-sum games are less common compared with 
non-zero-sum games. Most financial transactions or trades and 
the stock market are non-zero-sum games. Insurance, 
however, is a field where a zero-sum game plays an important 
role. Just think about how the insurance schemes might work. 
We pay an insurance premium to the insurance companies to 
guard against some difficult situations such as accidents, 
hospitalization, death, etc. Thinking that we are insured, we 
live a peaceful life and we are fairly compensated by the 
insurance companies when we face such tough situations. 
There is certainly a financial backup that helps us survive. Note 
that everyone who pays the premium does not meet with 
accident or get hospitalized, and the ones who do need a lot of 
money compared with the premium they pay. You see, things 
are quite balanced here, even considering the operational 
expenses of the insurance company. Again, the insurance 
company may invest the premium we pay and get some return 
on that. Still, this is a zero-sum game. 

Just to give you a different example, if there is one open 
position for which an interview drive is happening, then the 
candidate who qualifies actually does it at the cost of others’ 
disqualification. This is also a zero-sum game. 

You may ask if there is any use in studying about zero-sum 
games . Just being aware of a zero-sum situation is quite useful 
in understanding and devising a strategy for any complex 
problem. We can analyze if we can practically gain in a given 
situation in which the transactions are taking place. 


WHY TO STUDY GAME THEORY 


Game theory is a revolutionary interdisciplinary phenomenon 
bringing together psychology, economics, mathematics, 
philosophy, and an extensive mix of various other academic 
areas. 

We say that game theory is related to real-world problems. 
However, the problems are limitless. Are the game theoretic 
concepts limitless as well? Certainly! We use game theory every 
day, knowingly or unknowingly, because we always use our 
brains to take the best strategic action, given a situation. Don’t 
we? If that is so, why study game theory? 

Well, there are numerous examples in game theory that 
help us think differently. There are some theories developed 
such as Nash Equilibrium that relate to many real-life 
situations. In many real-world situations, the participants or 
the players are faced with a decision matrix similar to that of a 
“prisoner’s dilemma .” So, learning these concepts not only 
helps us formulate the problems in a more mathematical way, 
but also enables us to make the best move. It lets us identify 
aspects that each participant should consider before choosing a 
strategic action in any given interaction. It tells us to identify 
the type of game first; who are the players, what are their 
objectives or goals, what could be their actions, etc., to be able 
to take the best action. Much decision-making in real life 
involves different parties; game theory provides the basis for 
rational decision-making. 

The Byzantine Generals’ Problem that we studied in the 
previou section is widely used in distributed storage solutions 
and data centers to maintain data consistency across 
computing nodes. 


Computer Science Engineering 


As mentioned already, it is clever engineering with the concepts 
from computer science that stitches the components of 
cryptography, game theory, and many others to build a 


blockchain. In this section, we will learn some of the important 
computer science components that are used in blockchain. 


THE BLOCKCHAIN 


As we will see, a blockchain is actually a blockchain data 
structure; in the sense that it is a chain of blocks linked 
together. When we say a block, it can mean just a single 
transaction or multiple transactions clubbed together. We will 
start our discussion with hash pointers, which is the basic 
building block of blockchain data structure. 

A hash pointer is a cryptographic hash pointing to a data 
block, where the hash pointer is the hash of the data block itself 
(Figure 2-19). Unlike linked lists that point to the next block so 
you can get to it, hash pointers point to the previous data block 
and provide a way to verify that the data has not been tampered 
with. 





Data Block 


Figure 2-19 Hash pointer for a block of transactions 


The purpose of the hash pointer is to build a tamper 
resistant blockchain that can be considered as a single source 
of truth. How does blockchain achieve this objective? The way 
it works is that the hash of the previous block is stored in the 
current block header, and the hash of the current block with its 
block header will be stored in the next block’s header. This 
creates the blockchain as we can see in Figure 2-20. 


eevichs Hi | Previous H Previous Hi) | | Previous [Previous H{)| | H( ) 
eer SS call | ite 
nee — (| —_— \ | 
am / mdse | 
— 


; 
f J 


—_— => 
Figure 2-20 Blocks in a blockchain linked through hash pointers 





Wel! 





As we can observe, every block points to its previous block, 
known as “the parent block.” Every new block that gets added 
to the chain becomes the parent block for the next block to be 
added. It goes all the way to the first block that gets created in 
the blockchain, which is called “the genesis block.” In such a 
design where blocks are linked back with hashes, it is 
practically infeasible for someone to alter data in any block. We 
already looked at the properties of hash functions, so we 
understand that the hashes will not match if the data is altered. 
What if someone changes the hash as well? Let us focus on 
Figure 2-21 to understand how it is not possible to alter the 
data in any way. 


Previous H{ ) 
iiteiens = " 
avs, 


\. JJ 





Figure 2-21 Any attempt in changing Header or Block content 
breaks the entire chain. Assume that you altered the data in block- 
1234. If you do so, the hash that is stored in the block header of 
block-1235 would not match. 


e What if you also change the hash stored in the block 


header of block-1235 so that it perfectly matches the 
altered data. In other words, you hash the data block-1234 
after you alter it and replace that new hash with the one 
stored in block header of block-1235. After you do this, the 
hash of the block-1235 changes (because block-1235 means 


the data and the header together) and it does not match 
with the one stored in the block header of block-1236. 


e One has to keep doing this all the way till the final or the 


most recent hash. Since everyone or many in the network 
already have a copy of the blockchain along with the most 
recent hash, in no way is it possible to hack into the 
majority of the systems and change all the hashes at a 
time. 


e This makes it a tamper-proof blockchain data structure. 


This clearly means that each block can be uniquely 
identified by its hash. To calculate this hash, you can use either 
the SHA2 or SHA family of hash functions that we discussed 
in the cryptography section. If you use SHA-256 to hash the 
blocks, it would produce a 256-bit hash output such as: 


OOO0D000000000000aT73b6a2af JVbad40ec3fc2a83dafd7/be 
il Shimer Wl ciy alechy/sles CAI ens: 





Notice that there are only 64 characters in it. Since the 
hashed output is represented using hexadecimal characters, 
and every hex digit can be represented using four bits, the 
output is 64 x 4 = 256 bits. You would usually see that the 256- 
bit hashed output is represented using the 64 hex characters in 
many places. 

The structure of a block, that is, block size, the data and 
header sections, number of transactions in a block, etc., is 
something that you should decide while designing a blockchain 
solution. For existing blockchains such as Bitcoin, Ethereum, 
or Hyperledger, the structure is already defined and you have 
to understand that to build on top of these platforms. We will 
take a closer look at the Bitcoin and Ethereum blockchains 
later in this book. 


MERKLE TREES 


A Merkle tree is a binary tree of cryptographic hash pointers, 
hence it is a binary hash tree. It is named so after its inventor 


Ralph Merkle. It is another useful data structure being used in 
blockchain solutions such as Bitcoin. Merkle trees are 
constructed by hashing paired data (usually transactions at the 
leaf level), then again hashing the hashed outputs all the way 
up to the root node, called the Merkle root. Like any other tree, 
it is constructed bottom-up. In Bitcoin, the leaves are always 
transactions of a single block in a blockchain. We will discuss in 
a little while the advantages of using Merkle trees, so you can 
decide for yourself if the leaves would be transactions or a 
group of transactions in blocks. A typical Merkle tree can be 
represented as in Figure 2-22. 


Merkle Root 


H(ABCD + EFGH) 







H(FF + GH) 











H (HiA) + HIB) | H(H(C} + H(D)) H (H(E| + HIF) H [H(G) + H(H)} 


[Hil [ KiB) Hic) H{D) H(E). HIF) is H(H) 
Tea gs TX€ TKD IX THF TxH 


Figure 2-22 Merkle tree representation 





Similar to the hash pointer data structure, the Merkle tree is 
also tamper-proof. Tampering at any level in the tree would not 
match with the hash stored at one level up in the hierarchy, and 
also till the root node. It is really difficult for an adversary to 
change all the hashes in the entire tree. It also ensures the 
integrity of the order of transactions. If you change just the 
order of the transactions, then also the hashes in the tree till 
the Merkle root will change. 

Here is a situation. The Merkle tree is a binary tree and 
there should be an even number of items at the leaf level. What 


if there are an odd number of items? One good solution would 
be to duplicate the last transaction hash. Since it is the hash we 
are duplicating, it would mean just the same transaction and 
not create any issue such as double-spend or repeated 
transactions. That way, it is possible to balance the tree. 

In the blockchain we discussed, if we were to find a 
transaction through its hash, or check if a transaction had 
happened in the past, how would we get to that transaction? 
The only way is to keep traversing till you encounter the exact 
block that matches the hash of the transaction. This is a case 
where a Merkle tree can help a great deal. 

Merkle trees provide a very efficient way to verify if a 
specific transaction belongs to a particular block. If there are 
“n” transactions in a Merkle tree (leaf items), then this 
verification takes just Log (n) time as shown in Figure 2-23. 


Merkle Raat 








Figure 2-23 Verification in Merkle tree 


To verify if a transaction or any other leaf item belongs to a 
Merkle tree, we do not need all items and the whole tree. 
Rather, a subset of it is needed as we can see in the diagram in 
Figure 2-23. One can just start with the transaction to verify 
along with its sibling (it is a binary tree so there would be one 
sibling leaf item), calculate the hash of those two, and see if it 


matches their parent hash. Then continue with that parent 
hash and its sibling at that level and hash them together to get 
their parent hash. Continuing this process all the way to the top 
root hash is the quickest possible way for transaction 
verification (just Log (n) time for n items). In the figure, only 
the solid rectangles are required and the dotted rectangles can 
be just computed, provided the solid rectangle data. Since there 
are eight transaction elements (n = 8), only three computations 
(log2 8 = 3) would be required for verification. 

Now, how about a hybrid of both blockchain data structure 
and Merkle tree? Imagine a situation in a blockchain where 
each block has a lot of transactions. Since it is a blockchain, the 
hash of the previous block is already there; now, including the 
Merkle root of all the transactions in a block can help in 
quicker verification of the transactions. If we have to verify a 
transaction that is claimed to be from, say, block-22456, we can 
get the transactions of that block, verify the Merkle tree, and 
confirm quickly if that transaction is valid. We already saw that 
verifying a transaction is quite easy and fast with Merkle trees. 
Though blocks in the blockchain are tamper resistant and do 
not provide even the slightest scope to change anything in a 
block, the Merkle tree also ensures that the order of 
transactions is preserved. 

In a typical blockchain setting, there could be many 
situations where a node (for simplicity sake, assume any node 
that does not have the full blockchain data, 1.e., a light node) 
has to verify if a certain transaction took place in the past. 
There are actually two things that need verification here: 
transaction as part of the block, and block as part of the 
blockchain. To do so, a node does not have to download all the 
transactions of a block , it can simply ask the network for the 
information pertaining to the hash of the block and the hash of 
the transaction. The peers in the network who have the relevant 
information can respond with the Merkle path to that 
transaction. Well, you might ask how to trust the data that an 
unknown peer in the network is sharing with you. You already 
know that the hash functions are one-way. So in no way can an 
adversarial node forge transactions that would match a given 


hash value; it is even difficult to do so from transaction level till 
the Merkle root. 

The use of Merkle trees is not limited to just blockchains: 
they are widely used in many other applications such as 
BitTorrent, Cassandra—an NoSQL database, Apache Wave, etc. 


Example Code Snippet for Merkletree 


This section is just intended to give you a heads-up on how to 
code up a Merkle tree at its most basic level. Code examples are 
in Python but would be quite similar in different languages; 
you just have to find the right library functions to use. 


i. = SS COON. subs aac 


Peo iialya oie scenOos ts tren iG) 





class MerkelTree (object): 
Slope # Te ch gatiw stein) ie 
pass 


det chunke (sel to tt ramrsaci em, i) 
PS EUNCELon vetlel number :O 
transaction at time 
Ler Im range. (0, 
len(transaction),number): 
viekdstrancseck ton iat A] 


deh sierra etree (sel hiranis ee be voms)c: 
#Here we will find the merkel tree 
Hash -Of sell, MeanisactLons passed) Lo bles 
LUCELON 
#Problem is solved using recursion 
techqiue 


# Given a list of transactions, we 
concatinate the hashes in groups of two and 
compute 


# the hash of the group, then keep the 
hash of group: We repeat, thas steo fii 
# we reach a single hash 


SUbgiekee= || 
Petes wichva Ge havik <4 dies eet toil Supe has 
if len(1i)==2: 
hash = 
Sita Gils (ah POs dance xieicies 2215) 
else: 
hash = 
Shiat sonst rat Os bas Ol oye xd ages: (3) 


cll eee. cippend (nasi) 
1 MMen wae sstion etree Nas Oniky ome" hash 
then we reached our merkel tree hash. 
TOCKerWESe, Wwe call this fuction 





recursively 
1iie above Cenbieteiciaeto) ie Rhy 
ig siArigiar sills brace Od 
else: 


Peeiian (eS lbh Moe tke se hee eile meio) 


Ue Se ovel Ne aa BG ge 

mk=MerkelTree() 

ners Kewl iias a= 
nk Meshes jiioes( ieee De I SS OL a OPAL SIND GS Mee LANDS G4 CLR, Ge aie 
MAC OP lly 

Print merkel hasnt 





Putting It All Together 


To get to this section, we covered all the necessary components 
of blockchain that can help us understand how it really works. 
After going through them, namely cryptography, game theory, 
and computer science engineering concepts, we must have 
developed a notion of how blockchains might work. Though 
these concepts have been around for ages, no one could ever 


imagine how the same old stuff can be used to build a 
transforming technology such as blockchain. Let us have a 
quick recap of some fundamentals we covered so far, and we 
will build further understanding on those concepts. So here 
they are: 


Cryptographic functions are one-way and cannot be 
inverted. They are deterministic and produce the same 
output for a given input. Any changes to the input would 
produce a completely different output when hashed again. 


Using public key cryptography, digital signatures are 
possible. It helps in verifying the authenticity of the 
person/entity that has signed. Considering the private key 
is kept confidential, it is not feasible to forge a signature 
with someone else’s identity. Also, if someone has signed 
on any document or a transaction, they cannot later deny 
they did not. 


Using game theoretic principles and best practices, robust 
systems can be designed that can sustain in most of the 
odd situations. Systems that can face the Byzantine 
Generals’ Problem need to be handled properly. Our 
approach to any system design should be such that the 
participants play by the rules to get the maximum payoff; 
deviating from the protocol should not really benefit them. 


The blockchain data structure, by using the cryptographic 


hashes, provides a tamper resistant chain of blocks. The 
usage of Merkle trees makes the transaction verification 
easier and faster. 


With all these concepts in mind, let us now think of a real 


blockchain implementation. What problems can you think of 
that need to be addressed for such a decentralized system to 
work properly? Well, there are loads of them; some would be 
generic to most of the blockchain use cases and some would be 
specific to a few. Let us discuss at least some of the scenarios 
that need to be addressed: 


e Who would maintain the distributed ledger of 
transactions? Should all the participants maintain, or only 
a few would do? How about the computing nodes that are 
not powerful enough to process transactions or do not 
have enough storage space to accommodate the entire 
history of transactions? 


¢ Howis it possible to maintain a single consistent state of 
the distributed ledger? Network latency, packet drops, 
deliberate hacking attempts, etc. are inevitable. How 
would the system survive all these? 


e Who would validate or invalidate the transactions? Would 


only a few authorized nodes validate, or all the nodes 
together would reach a consensus? What if some of the 
nodes are not available at a given time? 


e What if some computing nodes deliberately want to 


subvert the system or try to reject some of the 
transactions? 


e How would you upgrade the system when there is no 
centralized entity to take the responsibility? In a 
decentralized network, what if a few computing nodes 
upgrade themselves and the rest don’t? 


There are in fact a lot more concerns that need to be 
addressed apart from the ones just mentioned. For now we will 
leave you with those thoughts, but most of those queries should 
be clarified by the end of this chapter. 

Let us start with some basic building blocks of a blockchain 
system that may be required to design any decentralized 
solution. 


PROPERTIES OF BLOCKCHAIN 
SOLUTIONS 


So far, we have only learned the technical aspects of blockchain 
solutions to understand how blockchains might work. In this 


section, we will learn some of the desired properties of 
blockchains. 


Immutability 


It is the most desired property to maintain the atomicity of the 
blockchain transactions. Once a transaction is recorded, it 
cannot be altered. If the transactions are broadcast to the 
network, then almost everyone has a copy of it. With time, 
when more and more blocks are added to the blockchain, the 
immutability increases and after a certain time, it becomes 
completely immutable. For someone to alter the data of so 
many blocks in a series is not practically feasible because they 
are cryptographically secured. So, any transaction that gets 
logged remains forever in the system. 


Forgery Resistant 


A decentralized solution where the transactions are public is 
prone to different kinds of attacks. Attempts at forgery are the 
most obvious of all, especially when you are transacting 
anything of value. Cryptographic hash and digital signatures 
can be used to ensure the system is forgery resistant. We 
already learned that it is computationally infeasible to forge 
someone else’s signature. If you make a transaction and sign a 
hash of it, no one can alter the transaction later and say you 
signed a different transaction. Also, you cannot later claim you 
never did the transaction, because it is you who signed it. 


Democratic 


Any peer-to-peer decentralized system should be democratic by 
design (may not be fully applicable to the private blockchain, 
which we will park for later). There should not be any entity in 
the system that is more powerful than the others. Every 
participant should have equal rights in any situation, and 
decisions are made when the majority reaches a consensus. 


Double-Spend Resistant 


Double-spend attacks are quite common in monetary as well as 
nonmonetary transactions. In a cryptocurrency setting, a 
double-spend attempt is when you try to spend the same 
amount to multiple people. Example: You have $100 in your 
account and you pay $90 to two or more parties is a type of 
double-spend. This is a little different when it comes to 
cryptocurrency such as Bitcoin where there is no notion of a 
closing balance. Input to a transaction (when you are paying to 
someone) is the output of another transaction where you have 
received at least the amount you are paying through this 
transaction. Assume Bob received $10 from Alice some time 
back in a transaction. Today if Bob wants to pay Charlie $8, 
then the transaction in which he received $10 from Alice would 
be the input to transact with Charlie. So, Bob cannot use the 
same input (Alice’s $10 paid to him) multiple times to pay to 
other people and double-spend. Just to give you a different 
example: if someone owns some land and sells the same piece 
of land to two people. 

In a centralized system it is quite easy to prevent double- 
spend because the central authority is aware of all the 
transactions. A blockchain solution should also be immune to 
such double-spend attacks. While cryptography ensures 
authenticity of a transaction, it cannot help prevent double- 
spend. Because, technically, both a normal transaction and a 
double-spend transaction are genuine. So, the only way 
possible to prevent double-spend is to be aware of all the 
transactions. If we are aware of all transactions that happened 
in the past, we can figure out if a transaction is an attempt to 
double-spend. So, the nodes that would validate the 
transactions should definitely be accessible to the whole 
blockchain data since the genesis block. 


Consistent State of the Ledger 


The properties we just discussed ensure that the ledger is 
consistent throughout, to some extent. Imagine a situation 
when some nodes deliberately want a transaction to not go 
through and to get rejected. Or, if somehow some nodes are not 
in sync with the ledger and hence not aware of a few 


transactions that took place while they were offline, then to 
them a transaction may look like fraudulent. So, how to ensure 
consensus among the participants is something that needs to 
be handled very carefully. Recollect the Byzantine Generals’ 
Problem. The right kind of consensus suitable for a given 
situation plays the most important role to ensure stability of a 
decentralized solution. We will learn different consensus 
mechanisms later in this book. 


Resilient 


The network should be resilient enough to withstand 
temporary node failures, unavailability of some computing 
nodes at times, network latency and packet drops, etc. 


Auditable 


A blockchain is a chain of blocks that are linked together 
through hashes. Since the transaction blocks are linked back till 
the genesis block, auditability already exists and we have to 
ensure that it does not break at any cost. Also, if one wants to 
verify whether a transaction took place in the past, then such 
verification should be quicker. 


BLOCKCHAIN TRANSACTIONS 


When we say blockchain, we mean a blockchain of 
transactions, right? So it starts from a transaction and then the 
transaction goes through a series of steps and ultimately 
resides in the blockchain. Since blockchain is a peer-to-peer 
phenomenon, if you are dealing with a use case that has a lot of 
transactions taking place every second, you may not want to 
flood the whole network with all transactions. Obviously when 
an individual or an entity is making a transaction, they just 
have to broadcast it to the whole network. Once that happens, 
it has to be validated by multiple nodes. Upon validation, it has 
to again get broadcast to the whole network for the transaction 
to get included in the blockchain. Now, why not a transaction 
chain instead of a blockchain? It may make sense to some 
extent if your business case does not involve a lot of 


transactions. However, if there are a huge number of 
transactions every second, then hashing them at transaction 
level, keeping a trail of it, and broadcasting that to the network 
can make the system unstable. You may want a certain number 
of transactions to be grouped in a block and broadcast that 
block. Broadcasting individual transactions can become a 
costly affair. Another good reason for a blockchain instead of a 
transaction chain is to prevent Sybil Attack. In Chapter 3, you 
will learn in more detail how the PoW mining algorithm is used 
and one node is chosen at random that could propose a block. 
If it was not the case, people might create replicas of their own 
node to subvert the system. 

In its most simplified form, the blockchain transactions go 
through the following steps to get into the blockchain: 


e Every new transaction gets broadcast to the network so 
that all the computing nodes are aware of that fact at the 
time it took place (to ensure the system is double-spend 
resistant) . 


e Transactions may get validated by the nodes to accept or 
reject by checking the authenticity. 


e The nodes may then group multiple transactions into 
blocks to share with the other nodes in the network. 


e Here comes the difficult situation. Who would propose the 


block of transactions that they have grouped individually? 
Broadly speaking, the generation of new blocks should be 
controlled but not in a centralized fashion, and the 
mechanism should be such that every node is given equal 
priority. Every node agreeing upon a block is called the 
consensus, but there are different algorithms to achieve 
the same objective, depending on your use case. We will 
discuss different consensus mechanisms in the following 
section. 


Though there is no notion of a global time due to network 


latency, packet drops, and geographic locations, such a 
system still works because the blocks are added one after 


another in an order. So, we can consider that the blocks 
are time stamped in the order they arrive and get added in 
the blockchain. 


Once the nodes in the network unanimously accept a 
block, then that block gets into the blockchain and it 
includes the hash of the block that was created right before 
it. So this extends the blockchain by one block. 


We already discussed the blockchain data structure and the 
Merkle trees, so we understand their value now. Recollect that 
when a node would like to validate a transaction, it can do so 
more efficiently by the Merkle path. The other nodes in the 
network do not have to share the full block of data to justify 
proof of membership of a transaction in a block. Technically 
speaking, memory efficient and computer-friendly data 
structures such as “Bloom filters” are widely used in such 
scenarios to test the membership. 

Also, note that for a node to be able to validate a 
transaction, it should ideally have the whole blockchain data 
(transactions along with their metadata) locally. You should 
select an efficient storage mechanism that the nodes will adopt 
based on your use case. 


DISTRIBUTED CONSENSUS 
MECHANISMS 


When the nodes are aware of the entire history of transactions 
by having a local copy of the full blockchain data to prevent 
double-spend, and they can verify the authenticity of a 
transaction through digital signatures, what is the use of 
consensus? Imagine the presence of one or more malicious 
nodes. Can’t they say an invalid transaction is a valid one, or 
vice versa? Recollect the Byzantine Generals’ Problem, which is 
most likely to occur in many decentralized systems. To 
overcome such issues, we need a proper consensus mechanism 
in place. 

So far in our discussion, the one thing that is not clear yet is 
who proposes the block. Obviously, not every node should 


propose a block to the rest of the nodes at the same time 
because it is only going to create a mess; forget about the 
consistent state of the ledger. On the other hand, had it been 
the case with just transactions without grouping them into 
blocks, you could argue that if every transaction gets broadcast 
to the whole network and every node in the network casts a 
vote on those individual transactions, it would only complicate 
the system and lead to poor performance. 

So, grouping transactions into blocks is important for 
obvious reasons and consensus is required on a block by block 
basis. The best strategy for this problem is that only one block 
should propose a block at a time and the rest of the nodes 
should validate the transactions in the block and add to their 
blockchains if transactions are valid. We know that every node 
maintains its own copy of the ledger and there is no centralized 
source to sync from. So, if any one node proposes a block and 
the rest of the nodes agree on it, then all those nodes add that 
block to their respective blockchains. In such a design, you 
would prefer that there are at least a few minutes of gap in 
block creation and it should not be the case where multiple 
blocks arrive at the same time. Now the question is: who might 
be that lucky node to propose a block? This is the trickiest part 
and can lead to proper consensus; we will discuss this aspect 
under different consensus mechanisms. 

These consensus mechanisms actually come from game 
theory. Your system should be designed such that the nodes get 
the most benefit if they play by the rules. One of the aspects to 
ensure the nodes behave honestly is to reward for honest 
behavior and punish for fraudulent activities. However, there is 
a catch here. In a public blockchain such as Bitcoin, one can 
have many different public identities and they are quite 
anonymous. It gets really difficult to punish such identities 
because they have a choice to avoid that punishment by 
creating new identities for themselves. On the other hand, 
rewarding them works great, because even if someone has 
multiple identities, they can happily reap the rewards given to 
them. So, it depends on your business case: if the identities are 
anonymous, then punishing them may not work, but may work 
well if the identities are not anonymous. You may want to 


consider this reward/punish aspect despite having a great 
mechanism to select a node that would propose the next block. 
This is because you would never know in advance if the node 
selected is a malicious node or an honest one. Keep in mind the 
term mining that we may be using quite often, and it would 
mean generating new blocks. 

The goal of consensus is also to ensure that the network is 
robust enough to sustain various types of attacks. Irrespective 
of the types of consensus algorithms one may choose 
depending on the use case, it has to fall into the Byzantine fault 
tolerant consensus mold to be able to get accepted. Let us now 
learn some of the consensus mechanisms pertaining to the 
blockchain scenarios that we may be able to use in different 
situations. 


Proof of Work 


The PoW consensus mechanism has been around for a long 
time now. However, the way it was used in Bitcoin along with 
other concepts made it even more popular. We will discuss this 
consensus mechanism at its basic level and look at how it is 
implemented in Bitcoin in Chapter 3. 

The idea behind the PoW algorithm is that certain work is 
done for a block of transactions before it gets proposed to the 
whole network. A PoW is actually a piece of data that is difficult 
to produce in terms of computation and time, but easy to 
verify. One of the old usages of PoW was to prevent email 
spams. If a certain amount of work is to be done before one can 
send an email, then spamming a lot of people would require a 
lot of computation to be performed. This can help prevent 
email spams. Similarly, in blockchain as well, if some amount 
of compute-intensive work is to be performed before producing 
a block, then it can help in two ways: one is that it will 
definitely take some time and the second is, if a node is trying 
to inject a fraudulent transaction in a block, then rejection of 
that block by the rest of the nodes will be very costly for the one 
proposing the block. This is because the computation 
performed to get the PoW will have no value. 


Just think about proposing a block without much of effort 
vs. doing some hard work to be able to propose a block. If it 
was with almost no effort, then proposing a node with a 
fraudulent transaction and getting rejected would not have 
been a big concern. People may just keep proposing such 
blocks with a hope that one may get through and make it to the 
blockchain sometime. On the contrary, doing some hard work 
to propose a block prevents a node from injecting a fraudulent 
transaction in a subtle way. 

Also, the difficulty of the work should be adjustable so that 
there is a control over how fast the blocks can get generated. 
You must be thinking, if we are talking about some work that 
requires some computation and time, what kind of work must 
it be? It is very simple yet tricky work. An example would help 
here. Imagine a problem where you have to find a number 
which, if you hash, the hashed output would start with the 
alphabet “a.” How would you do it? We have learned about the 
hash functions and know that there are no shortcuts to it. So 
you would just keep guessing (maybe take any number and 
keep incrementing by one) the numbers and keep hashing 
them to see if that fits the bill. If the difficulty level needs to be 
increased, then one can say it starts with three consecutive 
“a”s. Obviously, finding a solution for something like 
“aXXXXXxx” is easier to find compared with “aaaxxxxx” because 
the latter is more constrained. 

In the example just given, if multiple different nodes are 
working to solve such a computational puzzle , then you will 
never know which node would solve it first. This can be 
leveraged to select a random node (this time it is truly random 
because there is no algorithm behind it) that solves the puzzle 
and proposes the block. It is extremely important to note that 
in case of public blockchains, the nodes that are investing their 
computing resources have to be rewarded for honest behavior , 
else it would be difficult to sustain such a system. 


Proof of Stake 


The Proof of Stake (PoS) algorithm is another consensus 
algorithm that is quite popular for distributed consensus. 


However, what is tricky about it is that it isn’t about mining, 
but is about validating blocks of transactions. There are no 
mining rewards due to generation of new coins, there are only 
transaction fees for the miners (more accurately validators, but 
we will keep using ‘miners’ so it gets easier to explain). 

In PoS systems, the validators have to bond their stake 
(mortgage the amount of cryptocurrency thay would like to 
keep at stake) to be able to participate in validating the 
transactions. The probability of a validator producing a block is 
proportional to their stake; the more the amount at stake, the 
greater is their chance to validate a new block of transactions. A 
miner only needs to prove they own a certain percentage of all 
coins available at a certain time in a given currency system. For 
example, if a miner owns 2% of all Ether (ETH) in the 
Ethereum network, they would be able to mine 2% of all 
transactions across Ethereum. Accordingly, who gets to create 
the new block of transaction is decided, and it varies based on 
the PoS algorithm you are using. Yes, there are variants of PoS 
algorithm such as naive PoS, delegated PoS, chain-based PoS, 
BFT-style PoS, and Casper PoS, to name a few. Delegated PoS 
(DPOS) is used by Bitshares and Casper PoS is being developed 
to be used in Ethereum. 

Since the creator of a block in a PoS system is deterministic 
(based on the amount at stake), it works much faster compared 
with PoW systems. Also, since there are no block rewards and 
just transaction fees, all the digital currencies need to be 
created in the beginning and their total amount is fixed all 
through. 

The PoS systems may provide better protection against 
malicious attacks because executing an attack would risk the 
entire amount at stake. Also, since it does not require burning a 
lot of electricity and consuming CPU cycles, it gets priority over 
PoW systems where applicable. 


PBET 


PBFT is the acronym for the Practical Byzantine Fault 
Tollerance algorithm, one of the many consensus algorithms 
that one can consider for their blockchain use case. Out of so 


many blockchain initiatives, Hyperledger, Stellar, and Ripple 
are the ones that use PBFT consensus. 

PBFT is also an algorithm that is not used to generate 
mining rewards, similar to PoS algorithms. However, the 
technicalities in their respective implementations are different. 
The inner working of PBFT is beyond the scope of this book, 
but at a high level, requests are broadcast to all participating 
nodes that have their own replicas or internal states. When 
nodes receive a request, they perform the computation based 
on their internal states. The outcome of the computation is 
then shared with all other nodes in the system. So, every node 
is aware of what other nodes are computing. Considering their 
own computation results along with the ones received from 
ther nodes, they make a decision and commit to a final value, 
which is again shared across the nodes. At this moment, every 
node is aware of the final decision of all other nodes. Then they 
all respond with their final decisions and, based on the 
majority, the final consensus is achieved. This is demonstrated 
in Figure 2-24. 


= 

© 
Ss 
=< 


Commit 


t Pre jj 
Request ! Preparation i Preparation 


Client 


Replica 0 


Replica 1 


Replica 2 





Replica 3 
Figure 2-24 PBFT consensus approach 


PBFT can be efficient compared with other consensus 
algorithms, based on the effort required. However, anonymity 
in the system may be compromised because of the way this 
algorithm is designed. It is one of the most widely used 


algorithms for consensus even in non-blockchain environments 


Blockchain Applications 


While we looked at the nuts and bolts of blockchain throughout 
this chapter, it is also important that we look at how it is being 
used in building blockchain solutions. There are applications 
being built that treat blockchain as a backend database behind 
a web server, and there are applications that are completely 
decentralized with no centralized server. Bitcoin blockchain, 
for example, is a blockchain application where there is no 
server to send a request to! Every transaction is broadcast to 
the entire network. However, it is possible that a web 
application is built and hosted in a centralized web server, and 
that makes Bitcoin blockchain updates when required. Take a 
look at Figure 2-25 where a Bitcoin node broadcasts the 
transactions to the nodes that are reachable at a given point in 
time. 





Figure 2-25  Bitcoin blockchain nodes 


From a software application perspective, every node is self- 
sufficient and maintains its own copies of the blockchain 
database. Considering Bitcoin blockchain as a benchmark, the 
blockchain applications with no centralized servers appear to 
be the purest decentralized applications and most of them fall 
under the “public blockchain” category. Usually for such public 
blockchains, usage of resources from cloud service providers 
such as Microsoft Azure, IBM Bluemix, etc. are not quite 
popular yet. For most of the private blockchains, however, the 
cloud service providers have started to gain popularity. To give 
you an analogy, there could be one or more web applications 
for different departments or actors, all of them having their 
own Blockchin backends and still the blockchains are in syne 
with each other. In such a setting, though technical 
decentralization is achieved, politically it could still be 
centralized. Even though control or governance is enforced, the 
system is still able to maintain transparency and trust because 
of the accessibility to single source of truth. Take a look at 
Figure 2-26 , which may resemble most of the blockchain POCs 
or applications being built on blockchain where blockchains are 
hosted by some cloud service provider by consuming their 
blockchain-as-a-Service (BaaS) offering. 





~ Blockchain Vaa\ 
PEEEE CEEEE F 


ca a ee ee ee ee a ee es a ee ee ee ee ee ee 


= = Web Servers £> 


| Web Application is hosted here 
Dept. A * Dept. BY Dept. C* * 


os 
en 
ca 
=n ee ii 
Lit 





Actors in a Blockchain system 


Figure 2-26 Cloud-powered blockchain system 


It may not be necessary that all the departments have their 
own different web application. One web application can handle 
requests from multiple different actors in the system with 
proper access controm mechanisms. It might be a good idea 
that all the actors in the system have their own copies of 
blockchains. Having a local copy of blockchain not only helps 
maintain transparency in the system, but also may help 
generate data-driven insights with ready access to data all the 
time. The different “blockchains” maintained by different 
actors in the system are consistent by design, thanks to 
consensus algorithms such as PoW, PoS, etc. Most of the 
private blockchains prefer any consensus algorithm other than 
PoW to mitigate heavy resource consumption, and save 
electricity and computing power as much possible. The PoS 
consensus mechanism is quite common when it comes to 
private or consortium blockchains. Since blockchain is 
disrupting many aspects of businesses, and there was no better 


way of enabling transparency among them, creating a 
blockchain solution in the cloud with a “pay as you use” model 
is gaining momentum. Cloud services are helping businesses 
leapfrog in their blockchain-enabled digital transformation 
journey with minimal upfront investments. 

There are also decentralized applications (DApps) being 
built on Ethereum blockchain networks . These applications 
could be permissioned on private Ethereum or could be 
permissionless on a public Ethereum network. Also, these 
applications could be for different use cases on the same public 
Ethereum network. Though we will cover the Ethereum- 
specific details later in this book, just look at Figure 2-27 for a 
high-level understanding of how those applications might look. 


Os n® EI | 





Ethereum Nodes 


_, 
| Ethereum Blockchain 





Figure 2-27 DApps on Ethereum network 


As discussed already in previous sections, developing 
blockchain applications is only limited by your imagination. 


Pure blockchain native applications could be built. Applications 
that treat blockchain as just a backend are also being built, and 
there are hybrid applications that are also being built that use 
the legacy applications and use blockchain for some specific 
purpose only. So far, blockchain scalability is one of the biggest 
concerns. Though the scalability itself is in research, let us 
learn some of the scalability techniques. 


Scaling Blockchain 


We looked at blockchain from a historic perspective and how it 
proves to be one of the most disruptive technologies as of 
today. While exploring it technically in this chapter, we learned 
about the scalability issues inherent to most of the Blockchin 
flavors. By design, blockchains are difficult to scale and thus a 
research area in academia and for some innovation-driven 
corporates. If you look at the Bitcoin adoption, it is not being 
used to replace fiat currencies due to the inherent scalability 
challenges. You cannot buy a coffee using Bitcoin and wait for 
an hour for the transaction to settle. So, Bitcoins are being used 
as an asset class for investers to invest in. A Bitcoin blockchain 
network is not capable of accommodating as many transactions 
as that of Visa or MasterCard, as of today. 

Recollect the consensus protocols we have studied so far, 
such as PoW of Bitcoins or Ethereum, or PoS and other BFT 
consensus of some other blockchain flavors such as Multichain, 
Hyperledger, Ripple, or Tendermint. All of these consensus 
algorithms’ primary objective is Byzantine fault tolerance. By 
design, every node (at least the full nodes) in a blockchain 
network maintains its own copy of the entire blockchain, 
validates all transactions and blocks, serves requests from 
other nodes in the network, etc. to achieve decentralization, 
which becomes a bottleneck for scalability. Look at the irony 
here—we add more servers in a centralized system for 
scalability, but the same does not apply in a decentralized 
system because with more number of nodes, the latency only 
increases. While the level of decentralization could increase 
with a greater number of nodes in a decentralized network, the 


number of transactions in the network also increases, which 
leads to increased requirements of computing and storage 
resources. Keep in mind that this situation is applicable more 
on public blockchains and less so for private blockchains. 
Private blockchains could easily scale compared with the public 
ones because the controlling entities could define and set node 
specifications with high computation power and more 
bandwidth. Also, there could be certain tasks offloaded from 
blockchain and computed off-chain that could help the system 
scale well. 

In this chapter, we will learn some of the generic scaling 
techniques, and discuss Bitcoin- and Ethereum-specific scaling 
techniques in their respective chapters. Please keep in mind 
that all scaling techniques may not apply to all kinds of 
blockchain flavors or use cases. The best way is to understand 
the techniques technically and use the best possible one in a 
given situation. 


OFF-CHAIN COMPUTATION 


Off-chain computation is one of the most promising techniques 
to scale blockchain solutions. The idea is to limit the usage of 
blockchain and do the heavy lifting outside of it, and only store 
the outcomes on blockchain. Keep in mind that there is no 
standard definition of how the off-chain computation should 
happen. It is heavily dependent on the situation and the people 
trying to address it. Also, different blockchain flavors may 
require different approaches for off-chain computation. At a 
high level, it is like another layer on top of blockchain that does 
heavy, compute-intensive work and wisely uses the blockchain. 
Obviously, you may not be able to retain all the characteristics 
of blockchain by doing computations off-chain, but it is also 
true that you may not need blockchain for all kinds of 
computing requirements and may use it only for specific pain 
points. 

The off-chain computations could be on a sidechain, could 
be distributed among a random group of nodes, or could be 
centralized as well. The side chains are independent of the 
main blockchain. It not only helps scale the blockchain well, it 


also isolates damages to the sidechain and prevents the main 
blockchain from any damages from a sidechain. One such 
example sidechain is the “Lightning Network” for Bitcoins that 
should help in faster execution of transactions with minimal 
fee; that will support micropayments as well. Another example 
of a sidechain for Bitcoins is “Zerocash,” whose primary 
objective is not really scalability, but privacy. If you are using 
Zerocash for Bitcoin transactions, you cannot be tracked and 
your privacy is preserved. We will limit our discussion to the 
generic scalability techniques and not get into a detailed 
discussion of Bitcoin scalability in this book. 

One obvious question that might come up at the moment is 
how people would check the authenticity of the transactions if 
they are sent off-chain. First, to create a valid transaction, you 
do not need a blockchain. We learned in the “Cryptography” 
section in this chapter about the assymetric key cryptography 
that is used by the blockchain system. To make a transaction, 
you have to be the owner of a private key so you can sign the 
transaction. Once the transaction is created, there are 
advantages when it gets into the blockchain. Double-spend is 
not possible with Bitcoin blockchain, and there are other 
advantages, too. For now, the only objective is to get you on 
board with the fact that you can create a transaction as long as 
you own the private key for your account. 

Bitcoin blockchains are a stateless blockchain, in the sense 
that they do not maintain the state of an account. Everything in 
Bitcoin blockchain is present in the form of a transaction. To be 
able to make a transaction, you have to consume a previous 
transaction and there is no notion of “closing balance” for an 
account, as such. On the contrary, Ethereum blockchain is a 
“stateful” one! The blocks in Ethereum blockchain contain 
information regaring the state of the entire block where 
account balance is also a part. The state information takes up 
significant space when every node in the network maintains it. 
This situation is valid for other blockchains as well that are 
stateful. 

Let’s take an example to understand this better. Alice and 
Bob are two parties having multiple transactions between each 
other. Let’s say they usually have 50 monetary transactions in a 


month. In a stateful blockchain, all these individual 
transactions would have their state information, and that will 
be maintained by all the nodes. To address this challenge, the 
concept of “state channels” is introduced. The idea is to update 
the blockchain with the final outcome, say, at the end of the 
month or when a certain transaction threshold is reached, and 
not with each and every transaction. 

State channels are essentially a two-way communication 
channel between users, objects, or services. This is done with 
absolute security by using cryptographic techniques. Just to get 
a heads-up on how it works, take a look at Figure 2-28. 


re State Lock 
 é “rarsactlon) e =0) Ww 
oh _ Tarsactlon-2 é a ‘ _& 
, ‘2 / 


n 
G 


Settlement over Blockchain ) State Un Locked 


el 


eI! 
5 | 


. 
Transacticer- 9 
4 


el 


‘State Channel i 
*sJraneactions 


—~ 





Figure 2-28 State channels for off-chain computation 


Notice that the off-chain state channels are mostly private 
and confined among a group of participants. Keep in mind that 
the state of blockchain for the participants needs to be locked 
as the first step. Either it could be a MultiSig scheme or a smart 
contract-based locking. After locking, the participants make 
transactions among each other that are cryptographically 
secured. All transactions are cryptographically signed, which 
makes them verifiable and these transactions are not 
immediately submitted to the blockchain. As discussed, these 
state channels could have a predefined lifespan, or could be 
bound to the amount of transactions being carried out in terms 
of volume/quantity or any other quantifiable measure. So, the 


final outcome of the transactions gets settled on the blockchain 
and that unlocks the state as the final step. 

State channels could be very differently implemented in 
different use cases, and their implementations are actually left 
to the developers. It is certainly a way forward and is one of the 
most critical components for mainstream adoption of 
blockchain applications. For Bitcoin, the Lightning Network 
was designed for off-chain computation and to make the 
payments transaction faster. Similarly, the “Raiden Network” 
was designed for Ethereum blockchain. There are many other 
such developments to make micropayments faster and more 
feasible on blockchain networks. 


SHARDING BLOCKCHAIN STATE 


Sharding is one of the scalability techniques that has been there 
for ages and has been a more sought-after topic for databases. 
People used this technique differently in different use cases to 
address specific scalability challenges. Before we understand 
how it could be used in scaling blockchain as well, let us first 
understand what it means. 

Disk read/write has always been a bottleneck when dealing 
with huge data sets. When the data is partitioned across 
multiple disks, the read/write could be performed in parallel 
and latency decreases significantly. This technique is called 
sharding. Take a look at Figure 2-209. 





Figure 2-29 Database sharding example 


Notice in Figure 2-29 how horizontal partitioning is done to 
distribute a 300GB database table into three shards of 100GB 
each and stored on separate server instances. The same 
concept is also applicable for blockchain, where the overall 
blockchain state is divided into different shards that contain 
their own substates. Well, it is definitely not as easy as sharding 
a database with just doing horizontal partitioning. 

So, how does sharding really work in the context of 
blockchain? The idea is that the nodes wouln’t be required to 
download and keep a copy of the entire blockchain . Instead, 
they would download and keep the portions (shards) relevant 
to them. By doing so, they get to process only those 
transactions that are relevant to the data they store, and 
parallel execution of transactions is possible. So, when a 
transaction occurs, it is routed to only specific nodes depending 
on which shards they affect. If you look at it from a different 
lens, all the nodes are not required to do all sorts of 
calculations and verifications for each and every transaction. A 
mechanism or a protocol could be defined for communication 
between shards when more than one shard is required to 


process any specific transactions. Please keep in mind that 
different blockchains might have different variants of sharding. 

To give you an example, you might choose a specific 
sharding technique for a given situation. One example could be 
where shards are required to have multiple unique accounts in 
them. In other words, each unique account is in one shard 
(more applicable for Ethereum style blockchains that are 
stateful), and it is very easy for the accounts in one shard to 
transact among themselves. Obviously, one more level 
extraction at a shard level is required for sharding to work, and 
the nodes could keep only a subset of the information. 


Summary 


In this chapter, we took a deep dive into the core fundamentals 
of cryptography, game theory, and computer science 
engineering. The concepts learned would help you design your 
own blockchain solution that may have some specific needs. 
Blockchain is definitely not a silver bullet for all sorts of 
problems. However, for the ones where blockchain is required, 
it is highly likely that different flavors of blockchain solutions 
would be needed with different design constructs. 

We learned different cryptographic techniques to secure 
transactions and the usefulness of hash functions. We looked at 
how game theory could be used to design robust solutions. We 
also learned some of the core computer science fundamentals 
such as blockchain data structure and Merkle trees. Some of 
the concepts were supplimented with example code snippets to 
give you a jump start on your blockchain assignments. 

In the next chapter, we will learn about Bitcoin as a 
blockchain use case, and how exactly it works. 





References 


New Directions in Cryptography 
Diffie, Whitfield; Hellman, Martin E., “New Directions in 
Cryptography,” IEEE Transactions on Information Theory, Vol 


IT-22, No 6, 
https://ee.stanford.edu/~hellman/publications/ 
24.pdf , November, 1976. 

Kerckhoff’s Principle 

Crypto-IT Blog, “Kerckhoff’s Principle,” www. crypto- 
it.net/eng/theory/kerckhoffs.html. 

Block Cipher, Stream Cipher and Feistel Cipher 

http: //kodu.ut.ee/~peeter 1/teaching/kryptoi 
O5s/streamkil.pdf. 

www.cs.utexas.edu/~byoung/cs361/lecture45.pd 
ies 

www.cs.man.ac.uk/~banach/COMP61411.Info/Cour 
seSlides/Wk2.1.DES.pdf. 

https://engineering.purdue.edu/kak/compsec/N 
ewLectures/Lecture3.pdf. 

Digital Encryption Standard (DES) 

www.facweb.iitkgp.ernet.in/~sourav/DES.pdf. 

Advanced Encryption Standard (AES) 

www.facweb.iitkgp.ernet.in/~sourav/AES.pdf. 

AES Standard Reference 

National Institute of Standards and Technology (NIST), 
“Announcing the Advanced Encryption Standard (AES),” 
Federal Information Processing Standards Publication 197, 
heto:/ /mylpubs .nist.gov/nistoubs/PIPS/NIistT Pip 
S.197.pdf , November 26, 2001. 

Secured Hash Standard 

National Institute of Standards and Technology (NIST), 
“Announcing the Advanced Encryption Standard (AES),” 
Federal Information Processing Standards Publication 197, 
hike? /CSirc mist -oev/publications, fTips/itosl 30 
-4/fips-180-4.pd£ , November 26, 2001. 

SHA-3 Standard: Permutation-Based Hash and 
Extendable-Output Functions 

NIST, “Announcing DraftFederl Information Processing 
Standard (FIPS) 202, SHA-3 Standard: Permutation-Based 
Hash and Extendable-Output Functions, and Draft Revision of 
the Applicability Clause of FIPS 180-4, Secure Hash Standard, 


and Request for Comments,” 

hitos:/ /esrce.nist.cov/News;2014/Draftt-Firs- 
202, -SHA=3-Standard—and—Request—for—Com , May 
28, 2014. 

SHA-3 

Paar, Christof, Pelzl, Jan, “SHA-3 and the Hash Function 
Keccak,” Understanding Cryptography—A Textbook for 
Students and Practitioners, (Springer, 2010), 
hittps://pdts,semanticscholar.org/ 8450/0645 ortl 
32a406444fa85aa7b5636266a8d0.pdft. 

RSA Algorithm 

Kaliski, Burt, “The Mathematics of the RSA Public-Key 
Cyptosystem,” RSA Laboratories, 
www.mathaware.org/mam/06/Kaliski.pdf. 

Milanov, Evgeny, “The RSA Algorithm,” 
https://sites.math.washington.edu/~morrow/336 _ 
09/papers/Yevgeny.pdf .June 3, 2009. 

Game Theory 

Pinkasovitch, Arthur, “Why Is Game Theory Useful in 
Business?,” Investopedia, 
www. investopedia.com/ask/answers/09/game- 
theory-business.asp, December 19, 2017. 

Proof of Stake Algorithm 

Buterin, Vitalik, “A Proof of Stake Design Philosophy,” 
Medium, https://medium. com/@VitalikButerin/a- 
DLOOT=Of—-stake-desigqn—plilosophy—S0605c597 eda, 
December 30, 2016. 

Ray, James, “Proof of Stake FAQ,” Ethereum Wiki, 
https://qithub.com/ethereum/ wiki/wiki/ Proot— 
of-Stake-FAQ. 

Enabling blockchain Innovations with Pegged 
Sidechains 

Back, Adam, Corallo, Matt, Dash Jr, Luke, et al., “Enabling 
blockchain Innovations with Pegged Sidechains,” 
https://blockstream.com/sidechains.pdf. 


© Bikramaditya Singhal, Gautam Dhameja, Priyansu Sekhar Panda 2018 
Bikramaditya Singhal, Gautam Dhameja and Priyansu Sekhar Panda, Beginning 
Blockchain, https: //doi.org/10.1007/978-1-4842-3444-0_3 


3. How Bitcoin Works 


Bikramaditya Singhal: , Gautam Dhameja’ 
and Priyansu Sekhar Panda‘ 


(1) Bangalore, Karnataka, India 
(2) Berlin, Berlin, Germany 


Blockchain technology is all the rage these days, thanks to 
Bitcoin! blockchain as we know it is a gift of Bitcoin and its 
inventor, Satoshi Nakamoto, to the whole world. If you are 
wondering who Satoshi Nakamoto is, it is the name used by the 
unknown person or persons who originated Bitcoin. We 
suggest that you understand and appreciate the wonderful 
technology behind Bitcoin without searching for the inventor. 
Learning the technical fundamentals of Bitcoin will enable you 
to understand the other blockchain applications that are there 
in the market. 

Since Bitcoin testified to the robustness of blockchain 
technology for years, people now believe in it and have started 
exploring other possible ways to use it. In the previous chapter, 
we already got the hang of how blockchain works at a technical 
level, but learning Bitcoin can give you the real taste of 
blockchain. You may want to consider Bitcoin as a 
cryptocurrency use case of blockchain technology. So, this 
chapter will not only help you understand how Bitcoin works in 
particular, but also give you a perspective of how different use 


cases can be built using blockchain technology, the way Bitcoin 
is built. 

We will cover Bitcoin in greater detail throughout this 
chapter and while doing so, a lot of blockchain fundamentals 
will also be clarified with more practical insights. If you are 
already familiar with the Bitcoin fundamentals, you may skip 
this chapter. Otherwise, we advise you to follow through the 
concepts in the order presented. This chapter explains what 
Bitcoin is, how it is designed technically, and provides an 
analysis of some inherent strengths and weaknesses of Bitcoin. 


The History of Money 


Ever wonder what money is and why it even exists? Money is 
primarily the medium of exchange for exchanging value, that is 
anything of value. It has a history to it. We will quickly recap 
the history to be able to understand how money has eveolved to 
how we know it today, and how Bitcoin furthers it to the next 
level. 

Not everyone has everything. In the good old days when 
there were no notions of currency or money, people still figured 
out how they could exchange what they had in surplus for what 
they needed from someone else. Those were the days of the 
barter system. Wheat in exchange for peddy or oranges for 
lemons was the system. This was all good, but what if someone 
having wheat needs medicine that the other person does not 
have? Example: Alice has wheat and needs medicine, but Bob 
knows she has access to someone who has oranges, and Bob 
needs wheat. In this situation, the exchange is not working out. 
So, they have to find a third person, Charlie, who might need 
oranges and as well has surplus medicine. A pictorial 
representation of this scenario is shown in Figure 3-1. 





ra Carle 
{ oe 2 


a ay 


yt aay 


Figure 3-1 The primitive barter system 





It was always tough to find a person such as Charlie in the 
previous example who could fit in the puzzle so easily; this 
problem had to be solved. So, people started thinking of a 
commoditized system of value exchange. There were a few 
items that everyone would need, such as milk, salt, seeds, 
sheep, etc. This system almost worked out! Soon after, people 
realized that it was quite inconvenient and difficult to store 
such commodities. 

Eventually, better techniques were found to be used as 
financial instruments, such as metal pieces. People valued the 
rare metals more than the usual ones. Gold and silver metals 
topped the list as they wouldn’t corrode. Then countries started 
minting their own currency (metal coins with different weights) 
with their official seal in them. Though the metal pieces and 
coins were better than the previous system, as one could easily 
store and carry them, they were vulnerable to theft. Temples 
came into rescue as people trusted in them and had a strong 
belief that no one would steal from temples. The priests would 
give a receipt to the person depositing gold that would mention 
the amount of gold/silver received, as a promise to 
acknowledge their deposit and give back to the bearer of the 
receipt the same when they returned. The person bearing the 


receipt could circulate the receipt in the market to get what 
they wanted. This was the beginning of our banking system. 
The receipt worked, as the fiat currency and the temples played 
the role of centralized banks that people trusted. Refer to 
Figure 3-2 to understand how this system appeared back then. 


“oT Note 
——~ Eo 
a wi ae ie 


—— . 4 f 
\ Medic cine | Peaicrett Note 
a \ \ 
Gold Bar \ 


Credit 
Note 








J 


Gold Bar 





Se Temple 


Credit Note 
Figure 3-2 The beginning of the banking era 


In the system just mentioned, currency was always backed 
by some precious metal such as gold or silver. This system 
continued even after the goverenments and banks replaced the 
temples. This is how the commodity currency came up in the 
market to enable a universal medium of value exchange for the 
goods and services. Whatever currency was there in those days 
was all backed by gold/silver. 

Slowly, “fiat currency ” was introduced by the governments 
as legal tender, which was no longer backed by gold or silver. It 
was purely trust based, in the sense that people did not have a 
choice but to trust the government. Fiat currency does not have 
any intrinsic value, it is just backed by the government. Today, 
the money that we know of is all fiat currencies. So, the value of 


money today depends on the stability and performance of the 
governments in whose jurisdiction the currency is being issued 
and used. Those paper currencies were the money themselves 
and there was nothing more valubale in the banks. This was the 
state of banking systems and at the same time the digital world 
was just forming up. 

Around the 1990s, the Internet world was gaining 
momentum and the banking systems were getting digitized. 
Since some level of discomfort was still there with fiat 
currencies, since they were perishable and vulnerable to theft, 
banks assured that people could just go digital! This was the 
era when even the paper notes weren’t required to be printed. 
Money became the digital numbers in the computer systems of 
banks. Today, if every account holder went to their respectve 
bank and demanded the currency notes for the amount of 
money they hold in their accounts, the banks would be in big 
trouble! The total real money in circulation is extremely 
marginal compared with the amount of digital money 
worldwide. 


Dawn of Bitcoin 


In the first chapter we looked at the technology aspects of the 
Internet revolution, and in the previous section of this chapter 
we looked at the evolution of money. We should now look at 
them side by side to understand Satoshi Nakamoto’s 
perspective behind designing Bitcoin—a cryptocurrency. In this 
section and elsewhere in this text, we will try to elaborate on 
Satoshi’s statements in the paper he wrote on Bitcoin. 

We learned about temples and then governments and banks 
for the role they played in the currency systems that eveolved 
from barter systems. Even today, the situation is just the same. 
If you zoom in a bit on these systems, you will find that the one 
pivotal thing that makes these systems stable is the “trust” 
element. People trusted temples, and then they trusted 
governments and banks. The entire commerce on the Internet 
today relies on the centralized, trusted third parties to process 
payments. Though the Internet was designed to be peer-to- 


peer, people build centralized systems on it to reflect the same 
old practice. Well, technically building a peer-to-peer system 
back in the 2000s was quite tough considering the maturity of 
technology during that time. Consequently, the cost of 
transactions, time taken for a transaction to settle, and other 
issues due to centralization were obvious. This wasn’t the case 
with physical currencies, as transactions meant settlement. 

Could there be a digital currency backed by computing 
power, the same way gold was used to back the money in 
circulation? The answer is “Yes,” thanks to Satoshi’s Bitcoins. 
Bitcoins are designed to enable electronic payments between 
two parties based on cryptographic proof, and not based on 
trust due to intermediary third parties. It is possible today 
because of the technological advancements. In this chapter, we 
will see how Satoshi Nakamoto combined cryptography, game 
theory, and computer science engineering fundamentas to 
design the Bitcoin system in 2008. After it went live in 2009 
and till today, the system is quite stable and robust enough to 
sustain any kind of cyber attacks. It stood the test of time and 
positioned itself as a global currency. 


WHAT IS BITCOIN? 


Blockchain offers cryptocurrency: digital money! Just as we can 
transact with physical currency without banks or other 
centralized entities, Bitcoin is designed to facilitate peer-to- 
peer monetary transactions without trusted intermediaries. Let 
us look at what it is and then learn later in the chapter how it 
really works. Bitcoin is a decentralized cryptocurrency that is 
not limited to any nation and is a global currency. It is 
decentralized in every aspect—technical, logical, as well as 
political. As and when the transactions are validated, new 
Bitcoins get mined and a maximum of 21 million Bitcoins can 
ever be produced. Approximately, to reach 21 million Bitcoins, 
it would be take until the year 2140. Anyone with good 
computing power can participate in mining and generate new 
Bitcoins. After all the Bitcoins get generated, no new coins can 
be minted and only the ones in circulation would be used. Note 
that Bitcoins do not have fixed denominations such as the 


national fiat currencies. As per design, the Bitcoins can have 
any value with eight decimal places of precision. So, the 
smallest value in Bitcoin is O.00000001 BTC, which is called 1 
Satoshi. 

The miners mine the transactions to mint new coins and 
also consume the transaction fee that the person willing to 
make a transaction is ready to pay. When the total number of 
coins reaches 21 million, the miners would validate the 
transactions solely for the transaction fees. If someone tries to 
make a transaction without a transaction fee, it may still get 
mined because it is a valid transaction (if at all it is) and also 
the miner is more interested in the mining reward that lets him 
generate new coins. 

Are you wondering what decides the value of Bitcoins? 
When currency was backed by gold, it had great significance 
and was easy to assess the value based on gold standards. 
When we say Bitcoin is backed by the computing power that 
people use for mining, that is not enough to understand how it 
attains its value. Here is a litle bit of economics required to 
understand it. 

When fiat currency was launched for the first time, it was 
backed by gold. Since people believed in gold, they believed in 
currency as well. After a few decades, currency was no longer 
backed by gold and was totally dependent on the governments. 
People continued believing in it because they themselves form 
or contribute to the formation of their own government. Since 
the governments ensure its value, and people trust it, so it 
attains that value. In an international setting, the value of 
currency of specific countries depends on various factors and 
the most important of them is “supply and demand.” Please 
keep in mind that some countries that printed a lot of fiat 
currency notes went bankrupt; their economy went down! 
There has to be a balance and to understand this, more 
economics is needed, which is beyond the scope of this book. 
So, let us get back to Bitcoins for now. 

When Bitcoin was first launched, it did not have any official 
price or value that people would believe. If one would sell it for 
some US dollars (USD), I would never have bought those 
initially. Gradually when the exchange started taking place, it 


developed a price and one Bitcoin was not even one USD then. 
Since Bitcoins are generated by a competitive and decentralized 
process called “mining,” and they are generated at a fixed rate 
with an upper cap of 21 million Bitcoins in total that can ever 
exist, this makes Bitcoin a scarce resource. Now relating this 
context back to the game of “supply and demand,” the value of 
Bitcoin started inflating. Slowly, when the entire globe started 
believing in it, its price even skyrocketed from a few USDs to 
thousands of USDs. Bitcoin adoption among the users, 
merchants, start-ups, big businesses, and many others is 
growing like never before because they are being used in the 
form of money. So, the value of Bitcoin is highly influenced by 
“trust,” “adoption,” and “supply and demand” and its price is 
set by the market. 

Now, the question is why the value of Bitcoin is so volatile 
as of this writing and fluctuates quite a lot. One obvious reason 
is supply and demand. We learned that there can only be a 
limited number of Bitcoins in circulation, which is 21 million, 
and the rate at which they get generated is decreeasing with 
time. Because of this design, there is always a gap in supply and 
demand, which results in this volatility. Another reason is that 
Bitcoins are never traded in one place. There are so many 
exchanges in so many places across the globe, and all those 
exchanges have their own exchange prices. The indexes that 
you see gather Bitcoin exchange prices from several exchanges 
and then average them out. Again, since all these indexes do 
not collect data from the same set of exchanges, even they do 
not match. Similarly, the liquidity factor that implies the 
amount of Bitcoins flowing through the entire market at any 
given time also influences the volatility in Bitcoin price. As of 
now, it is definitely a high-risk asset but may get stabilized with 
time. Let us take a look at the following list of factors that may 
influence the supply and demand of Bitcoins, and hence their 
price: 


e Confidence of people in Bitcoin and fear of uncertainty 


e Press coverage with good and bad news on Bitcoin 


e Some people own Bitcoins and do not allow them to flow 


through the market and some people keep buying and 
selling to minimize risk. This is why the liquidity level of 
Bitcoin keeps on changing. 


e Acceptance of Bitcoins by big ecommerce giants 


e Banning of Bitcoins in specific countries 


If you are now wondering if there is any possibility of 
Bitcoin to crash completely, then the answer is “Yes.” There are 
many examples of countries whose currency systems have 
crashed. Well, there were political and economic reasons for 
them to crash such as hyperinflation, which is not the case with 
Bitcoins because one cannot generate as many Bitcoins as they 
want and the total number of Bitcoins is fixed. However, there 
is a possibility of technical or cryptographic failure of Bitcoins. 
Please note that Bitcoin has stood the test of time since its 
inception in 2008 and there is a possibility that it will grow 
much bigger with time, but it cannot be guaranteed! 


WORKING WITH BITCOINS 


In order to get started with Bitcoins, no technicality is needed. 
You just have to download a Bitcoin wallet and get started with 
it. When you download and install a wallet on your laptop or 
mobile, it generates your first Bitcoin address (public key). You 
can generate many more, however, and you should. It is a best 
practice to use the Bitcoin addresses only once. Address reuse 
is an unintended practice in Bitcoin, though it works. Address 
reuse can harm privacy and confidentiality. As an example, if 
you are reusing the same address, signing a transaction with 
the same private key, the recipient can easily and reliably 
determine that the address being reused is yours. If the same 
address is used with multiple transactions, they can all be 
tracked and finding who you are gets even easier. Remember 
that Bitcoin is not fully anonymous; it is said to be 
pseudonymous and there are ways to trace the transaction 
origins that can reveal the owners. 


You have to disclose your Bitcoin address to the person 
willing to transfer Bitcoins to you. This is very safe because the 
public key is public anyway. We know that there is no notion of 
a closing balance in Bitcoin and all records are there as 
transactions. Bitcoin wallets can easily calculate their 
spendable balance, as they have the private keys of the 
corresponding public keys on which transactions are received. 
There are a variety of Bitcoin wallets available from so many 
wallet providers. There are mobile wallets, desktop wallets, 
browser-based web wallets, hardware wallets, etc., with varying 
levels of security. You need to be extremely careful in the wallet 
security aspect while working with Bitcoins. The Bitcoin 
payments are irreversible. 

You must be wondering how secured are these wallets. 
Well, different wallet types have different leves of security and 
it depends on how you want to use it. Many online wallet 
services suffered from security breaches. It is always a good 
practice to enable two-factor authentication whenever 
applicable. If you are a regular user of Bitcoins, it may be a 
good idea to use small amounts in your wallets and keep the 
remainder separately in a safe environment. An offline wallet 
or cold wallet that is not connected to the network provides the 
highest level of security for savings. Also, there should be 
proper backup mechanisms for your wallet in case you lose 
your computer/mobile. Remember that if you lose your private 
key, you lose all the money associated with it. 

If you have not joined Bitcoin as a miner running a full 
node, then you can just be a user or a trader of Bitcoins. You 
will definitely need an exchange from where you can buy some 
Bitcoins with your US dollars or other currencies as accepted 
by the exchanges. You should prefer buying Bitcoins from a 
legitimate and secured exchange. There have been many 
examples of exchanges that suffered from security breaches. 


The Bitcoin Blockchain 


We already looked at the basic blockchain data structure in the 
previous chapter and also covered the basic building blocks of a 


blockchain data structure such as hashing techniques and 
asymmetric cryptography. We will learn the specifics of Bitcoin 
blockchain in this section. 

The Bitcoin blockchain, like any other blockchain, has a 
similar blockchain data structure. The Bitcoin Core client uses 
the LevelDB database of Google to store the blockchain 
datastructure internally. Each block is identified by its hash 
(Bitcoin uses the SHA256 hashing algorithm). Every block 
contains the hash of the previous block in its header section. 
Remember that this hash is not just the hash of the previous 
header but the entire block including header, and it continues 
all the way to the genesis block. The genesis block is the 
beginning of any blockchain. Typically, a Bitcoin blockchain 
looks as shown in Figure 3-3. 


Block 3 Block 1 Block $202 





a) Ho ock Header 





















f Y 
\ —++ Prev_Hash | \imastarnp | Prev, Hash | limes cap a je 
A { H{ | J 
[Mee foot | Nones | [Meee aot Root | | Noace 
Genesis \ / \ / 
Block | | steerer ae S| 0 | 


Trensactions 
} TXs 

\ 

\, / 


Tks 








e 
- 


Figure 3-3 The Bitcoin blockchain 


As you can see in this blockchain, there is a block header 
part that contains the header information and there is a body 
part where the transactions are bundled in every block. Every 
block’s header contains the hash of the previous block. So, any 
change in any block in the chain will not be so easy; all the 
subsequent blocks have to be changed accordingly. Example: If 
someone tries to change a previous transaction that was 
captured in, say, block number 441, after changing the 
transaction, the hash of this block that is in the header of block 
number 442 will not match, so it has to be changed as well. 
Changing the header with the new hash will then require you to 
update the hash in the block header of the next block in the 


sequence, which is block number 443, and this will go on till 
the current block and this is tough work to do. It beeccomes 
almost impossible when we know that every node has it’s own 
copy and hacking into all the nodes, or at least 51% of them, is 
infeasible. 

In the blockchain, there is only one true path to the genesis 
block. However, if you start from the genesis block, then there 
can be forks. When two blocks are proposed at the same time 
and both of them are valid, only one of them would become a 
part of the true chain and the other gets orphaned. Every node 
builds on the longest chain, and whichever it hears first and 
whichever becomes the longest chain will be the one to build 
on. Such a scenario can be represented as shown in Figure 3-4. 


Orphan Blocks 


SS Previews Block 


Tarsartans 





- Block 1 Block-2 Block-3 


ais Bluck-1265 
Alans 0 


Block Helght-» —— -1. Se 3. “4 -1265- [> 


Figure 3-4 Orphan blocks in true blockchain 


Observe in Figure 3-4 that at block height-3, two blocks are 
proposed to become block-3, but only one of them could make 
it to the final blockchain and the rest got orphaned out. It is 
evident that at a certain block height, there is a possibility of 
one or more blocks because there can as well be some 
orphaned blocks at this height, so block height is not the best 
way to uniquely identify a block and block hash is the right way 
to do so. 


BLOCK STRUCTURE 


The block structure of a Bitcoin blockchain is fixed for all 
blocks and has specific fields with their corresponding required 
data. Take a look at Figure 3-5, a birds-eye view of the entire 


block structure, and then we will learn more about the 
individual fields later in this chapter. 





* Version (4 Bytes) 


Magic Number (4 Bytes) if" Previous Block Hash (32 Bytes) 
Block Size (4 Bytes) 





Merkle Root (32 Bytes) 
Block Header (80 Bytes) 
Timestamp (4 Bytes) 
Transaction Counter (1-9 Bytes) 


Difficulty Target (4 Bytes) 


Trunsaction List 





Block Structure ‘ Nonce (4 Bytes) 


Header Structure 


Figure 3-5 Block structure of Bitcoin blockchain 


A typical block structure appears as shown in Table 3-1. 


Table 3-1 Block Structure 


Field Size Description 


It has a fixed value oxD9B4BEF9, which indicates 


ay 4 bytes the start of the block and also that the block is from 
Numbe ‘ ; 
. the mainnet or the production network. 


This indicates the size of the block. The original 
Bitcoin blocks are of 1MB and there is a newer 


Block 4 bytes version of Bitcoin called “Bitcoin Cash” whose block 


se size is 2MB. 
Block 80 It comprises much information such as Previous 
bytes Block’s hash, Nonce, Merkle Root, and many more. 


Header 


Field 


Transac 
tion 
Counte 
r 


Transac 
tion 
List 


Size 


1-9 
bytes 
(variabl 
e 
length) 


Variable 
in 
number 
but 
fixed in 
size 


Description 


It indicates total number of transactions that are 
included within the block. Not every transaction is 
of the same size, and there is a variable number of 
transactions in every block. 


It lists all the transactions that are taking place in a 
given block. Depending on block size (whether 1MB 
or 2MB), this field occupies the remaining space in a 
block. 


Let us now zoom in (Table 3-2) to the “Block Header” 
section of the blocks and learn the various different fields that 
it maintains. 


Table 3-2 Block Header Components 


Fie S$ 
Id iz 
e 


rsi 
on 


< 
@ 
Aor oP 


Description 


It indicates the version number of Bitcoin protocol. Ideally each 
node running Bitcoin protocol should have the same version 


number. 


Fie 
Id 


ev 
io 

us 
Bl 
oc 


as 


“Smog: 


Ti 


es 
ta 


no r< O7NW 


AO rt< TNL 


nOor<s OD 


Description 


It contains the hash of the block header of the previous block in 
the chain. When all the fields in the previous block header are 
combined and hashed with SHA256 algorithm, it produces a 256- 
bit result, which is 32 bytes. 


Hashes of the transactions in a block form a Merkle tree by 
design, and Merkle root is the root hash of this Merkle tree. If a 
transaction is modified in the block, then it won’t match with the 
Merkle root when computed. This way it ensures that keeping the 
hash of the previous block’s header is enough to maintain the 
secured blockchain. Also, Merkle trees help determine if a 
transaction was a part of the block in O(n) time, and are quite 
fast! 


There is no notion of a global time in the Bitcoin network. So, this 
field indicates an approximate time of block creation in Unix time 
format. 


Fie S_ Description 


Id iz 
e 
Di 4 
ffi b 
cu. y_ The proof-of-work (PoW) difficulty level that was set for this 
Ity t block when it was mined 
Ta ie 
rg s 
et 
4 
b 
N y  Thisis the random number that satisfied the PoW puzzle during 
on t_ mining. 
ce e 
S 


The block fields and their corresponding explanations as 
presented in the previous tables are good enough to start with, 
and we will explore more of only a few fields that require a 
more detailed explanation. 


Merkle Tree 


We have covered the concept of Merkle trees in the previous 
chapter. In this section, we will just take a look at how Bitcoin 
uses Merkle trees. Each block in a Bitcoin blockchain contains 
the hash of all the transactions, and the Merkle root of all these 
transactions is included in the header of that block. In a true 
sense, when we say that each block header contains the hash of 
the entire previous block, the trust is that it just contains the 
hash of the previous block’s header. Nonetheless, it is enough, 
because the header already contains the Merkle root. If a 
transaction in the block is altered, the Merkle root will not 
match anymore and such a design still preserves the integrity 
of the blockchain. 


The Merkle tree is a tree data structure of the hash of the 
transactions. The “Leaf Nodes” in the Merkle tree actually 
represent the hash of the transactions, whereas the root of the 
tree is the Merkle root. Refer to Figure 3-6. 


Merkle Root 
r 


H ineco ers} 
H(HIABCD) + HIEFGG)) 






H{H(A8) + H(CD}) 














H (H(A) 1 K(B)) H (H(C}+ HiD)) H (HIG) +HIG)) | 


a H(B} = 4 ls H(E) HIF) aise : HG) | 
= Se ' ! 
a w) Ix-B — ¢ Ix-E iF 1 TG | 


Figure 3-6 Merkle-tree representation 


H al HDD | 








Notice that the hash of the seven transactions A, B, C, D, E, 
F, and G form the leaf of the tree. Since there are seven 
transactions but the total leaf nodes should be even in a binary 
tree, the last leaf node gets repeated. Each transaction hash of 
32 bytes (1.e., 256 bits) is calculated by applying SHA256 twice 
to the transactions. Similarly, the hash of two transactions are 
concatenated (62 bytes) and then hashed twice with SHA256 to 
get the parent hash of 32 bytes. 

Only the Merkle path to a transaction is enough to verify if a 
transaction was a part of any block and is quite efficient 
therefore. So, the actual blockchain can be represented as 
shown in Figure 3-7. 





Magic Number (4 Byles) Magic Number {4 Bytes] 


Block Size (4 Bytes} Block Size {4 Bytes) 





Block Header [80 Bytes} |" Block Header (80 Bytes) L_ 
Veron (4 Bytes) version (4 Bytns) 
Previous Block Hash (3? Bytes) Previous Rlack Hash [32 Rytes) 
atmoyeud Pine ewe ( siveavene meee ay ii 
Timestamp (4 Bytes) Tirnestarnp 14 Bytes) 
Difficulty Target (4 Bytes) Difficulty Target (4 Bytes} 
Nonce (4 Bytes) Nonce (4 Bytes) 
Transaction Counter (1-9 Bytes) Transaction Counter (1-9 Bytes) 
Transactions List Transactions List | 
Amz eee 


(em) [mm 


Figure 3-7 Merkle tree representation 


Difficulty Target 

The difficulty target is the one that drives the PoW in Bitcoin. 
The idea is that once a block is filled with valid transactions, 
the hash of that block’s header needs to be calculated to be less 
than the difficulty target in the same header. The nonce in the 
header starts from zero. The miner has to keep on 
incrementing this nonce and hashing the header till the hash 
value is less than the target. 

The difficulty bits of four bytes (32 bits) in the headers 
define what would be the target value (256 bits) for that block 
to be mined. The nonce should be found such that the hash of 
the entire header should be less than the target value. 
Remember that the lower the target value, the more difficult it 
would be to find a header hash that would be less than the 
target. Since Bitcoin uses SHA256, every time you hash a block 
header, the output is any number between 0 and 275°, which is 
quite a big number. If with your nonce the hash is less than the 
target, the block will be accepted by the entire network, else 
you have to try with a different nonce till it satisfies the 
condition. At this point, it is still not clear how the difficulty 
target is calculated with the difficulty bits in each header. 


The target can be derived from the four-byte (8 
hexadecimal numbers) difficulty bits in the header using a 
predefined formula that every node has by default, as it came 
along with the binaries during installation. Following is the 
formula to compute the difficulty: 


EAS be CoOe Miia nin — 0) ene ee 


Notice that there is a “coefficient” and there is also an 
“exponent” term in this formula, which are present as a part of 
the four-byte difficulty bits. Let us take an example to explain 
this better. If the four-byte difficulty bits in hex form are 
0x1bo0404cb, then the first two hex digits form the exponent 
term, which is (Oxib), and the remaining form the coefficient 
term, which is (0x0404cb) in this case. Solving for the target 
formula with these values: 


Targets "Ox 0A dich. 7 ee 

iByouial@ leat ee 
OxO0000000000404CBO000000000000000000000000000 
OOQODD000000000000000 


Bitcoin is designed such that every 2,016 blocks should take 
two weeks to be generated and if you do the math, it would be 
around ten minutes for every block. In this asynchronous 
network, it is difficult to program like this where every block 
takes exactly ten minutes with the kind of POW mechanism in 
place. In reality, it is the average time for a block, and there is a 
possibility that a Bitcoin block gets generated within a minute 
or it may very well take 15 minutes to be generated. So, the 
difficulty is designed to increase or decrease depending on 
whether it took less or more than two weeks to find 2,016 
blocks. This time taken for 2,016 blocks can be found using the 
time present in the timestamp fields of every block header. If it 
took, say, T amount of time for 2,016 blocks, which is never 
exactly two weeks, the difficulty target in every block is 
multiplied by(T / 2 weeks). So, the result of [difficulty 


target x (I / 2 weeks)] will be increased if T was less and 
decreased otherwise. 

It is evident by now that the difficulty target is adjustable; it 
could be set more difficult or easier depending on the situation 
we explained before. You must be wondering, who adjusts this 
difficulty when the system is decentralized? One rule of thumb 
that you must always keep in mind is that whatever happens in 
such a decentralized design has to happen individually at every 
node. After every 2,016 blocks, all the nodes individually 
compute the new difficulty target value and they all conclude 
on the same one because there is already a formula defined for 
it. To have this formula handy, here it is once again: 


New Target= Old Target * (T / 2 weeks) 
[> New Target= Old Target * (Time taken for 
2OLG- Bilocks ian. Seconds 7 12509,600 seconds) 


Note The parameters such as 2,016 blocks and 
TargetTimespan of two weeks (12,09,600 seconds) are 
defined in chainparams.cpp as shown following: 


consensus.nPowTargetTimespan = 14 * 24 * 60 
* 60; // two weeks 
consensus.nPowTargetSpacing = 10 * 60; 
consensus.nMinerConfirmationWindow = 2016; 
// nPowTargetTimespan / nPowTargetSpacing 





Note here that it is (T / 2 weeks) and not (2 weeks / T). The 
idea is to decrease the difficulty target when it is required to 
increase the complexity, so it takes more time. The lesser the 
target hash, the more difficult it gets to find a hash that is less 
than this target hash. Example: If it took ten days to mine 2,016 
blocks, then (T / 2 weeks) would be a fraction, which when 
multiplied by “Old Target” further reduces it and “New Target” 
would be a value less than the old one. This would make it 
difficult to find a hash and would require more time. This is 
how the time between blocks is maintained at ten minutes on 


average. Imagine that the difficulty target was fixed and not 
adjustable; what do you think the problem would be? 
Remember that the computation power of the hardware 
increases with time as more powerful computers are 
introduced for block mining. A situation where 10s or 100s or 
even 1,000s of blocks are proposed at the same time is not 
desirable for the network to function properly. So, the idea is 
that, even when more and more powerful computing nodes 
enter into the Bitcoin network, avrage time required to propose 
a block should still be ten minutes by adjusting the difficulty 
target. Also, a miner’s chances of proposing a block depends on 
how much hash power they have compared with the global 
hash power of all miners included. 

Are you thinking why ten minutes, and why not 12 minutes? 
Or why not six minutes? Just keep in mind that there has to be 
some time gap for all the nodes in a decentralized 
asynchronous system to agree on it. If there was no time gap, 
so many blocks would arrive with just fractional delays and 
there wouldn’t be any optimization benefit of blockchain as 
compared with transaction chain. Every transaction is a 
broadcast and every new block is also a broadcast. Also, the 
orderliness that a blockchain brings to the system is quite 
infeasible by the transaction chain. With the concept of blocks, 
it is possible to include the unrelated transactions from any 
sender to any receiver in blocks, which is not easy to maintain 
with the transaction chain. One valid block broadcast is more 
efficient compared with individual transaction broadcast after 
validation. Now, coming back to the discussion of ten minutes, 
it can very well be a little less or a little more but there should 
certainly be some gap between two consecutive blocks. Imagine 
that you are a miner and mining block number 4567, but some 
other miner got lucky and proposed block number 4567, which 
you just received while solving the cryptographic puzzle. What 
you would do now is validate this block and if it is valid, add it 
to your local copy of the blockchain and immediately start on 
mining the 4568. You wouldn’t want someone else to propose 
4568 already while you just finished validating block 4567, 
which you received a little later compared with other miners 
due to network latency. Now the question is: is this 10 minutes 


the best possible option? Well, it is difficult to explain this in 
one word, but a ten-minute gap addresses a lot of issues due to 
an asynchronous network, time delays, packet drops, system 
capacity, and more. There is a possibility that it could be 
optimized further to, say, five minutes or so, which you can see 
in many new cryptocurrencies and other blockchain use cases. 


THE GENESIS BLOCK 


The very first block as you can see in the following code, the 
block-o, is called the genesis block. Remember that the genesis 
block has to be hardcoded into the blockchain applications and 
so is the case with Bitcoin. You can consider it as a special 
block because it does not contain any reference to the previous 
blocks. The Bitcoin’s genesis block was created in 2009 when it 
was launched. If you open the Bitcoin Core, specifically the file 
chainparams.cpp , you will see how the genesis block is 
statically encoded. Using a command line reference to Bitcoin 
Core, you can get the same information by querying with the 
hash of the genesis block as shown below: 


Slt Come lmieugGehiolock 
000000000019d6689c085ae165831e934FF£763ae46a2a6 
Cli AZostlbolasceZce 


1 

Worstevan’ 
"QO00000000019d6689c085ae165831e934FF£763ae46a2a 
Cel ZbstloelacceZonr 

YCOMrtemaevons. = s0G32 10 

Tez ee 2s, 

Mienegiiie e270), 

"Vvyersion” <: 1, 

"merkleroot" 
"Zad5ele4baab89F3a32518a88c3lbc8/F618£F7667/3e2cc 
Tia Ayo vakdedas 3b” y 

ret 
["4a5ele4baab89F3a32518a88c3lbcB/ES618F76673e2c 


Cy iabZiziejardedas sb |, 
YEame = Us U06 S05, 
“nonce” + 20837236693, 
iat Yess ale O One tate, 
Nel Samal ouey lee are LE OOK TO NOON GOLF 
"next plockhash”™ 
"0000000083 9a8e6886ab5951d76£411475428aFc90947 
ee32016l1lbbf18eb6048" 
} 


Output of the preceding command: 


If you convert the Unix time stamp as shown in the previous 
output, you will find this date-time information: Saturday 3rd 
January 2009 11: 45:05 PM. You can as well get the same 
information from the website https: //blockchain.info. 
Just navigate to this site and paste the hash value in the right 
top search box and hit “Enter.” Here is what you will find 
(Table 3-3) 


Table 3-3 Transaction Information 


Summary 
Number Of Transactions 1 
Output Total 50 BTC 
Estimated Transaction o BTC 
Volume 


Transaction Fees o BTC 


Summary 


Height oO (Main Chain) 
Timestamp 2009-01-03 18:15:05 
Received 

Time 


2009-01-03 18:15:05 


Relayed By aren 
Difficulty 1 

Bits 486604799 
Size 0.285 kB 
Weight 0.896 kWU 


Version 1 


Summary 


Nonce 2083236893 


Block Reward 50 BTC 


Table 3-4 Hash Information 


Hashes 


Hash 


Previous 
Block 


Next Block(s) 


000000000019d6689c085ae165831e934ff763ae46a2a6 
c172b3fib60a8ce26f 


OOODDODODODODODDOODOOOOOOOOOOOO0O00000000000000 
OOOOOODDOOOOO0O00000000000 


00000000839a8e6886ab5951d76f411475428afc90947e 
e€320161bbf18eb6048 


Hashes 


Merkle 


Root 4a5e1e4baab80f3a32518a88c31bc87f618f76673e2cc77ab 
“2 2127b7afdeda33b 


In this Block-o, there is just one transaction, which is a 
coinbase transaction. Coinbase transactions are the ones that 
the miners get. There are no inputs to such transactions and 
they can only generate new Bitcoins. If you explored the 
transactions associated in this block, here is how it would look 
(Figure 3-8). 


Transactions 


Aaa olbach243290) 1Ba2Bes bea Eb Tdeaec Taber 2 brad sda 2009-01-03 18:1 05 


No Inputs (Newly Generated Coins) rm) LAL LeP SQGeFiZDNPLFILSSLmv/DiviNa OTC 


HO BTC 


Figure 3-8 Coinbase transaction in Block-0 


The Bitcoin Network 


The Bitcoin network is a peer-to-peer network, as discussed 
already. There is no centralized server in such a system and 
every node is treated equally. There are no master-slave 
phenomena and no hierarchy as well in such a system. Since 
this runs on the Internet itself, it uses the same TCP/IP 
protocol stack as shown in Figure 3-9. 


The Bitcoin 
i Layer Layer 4 


| Transport Lever 
| Internet Layer 





4PEIS [090301 di/dd 


TCP/IP Protocol Stack 








___. internet_/-—~** 


Figure 3-9 The Bitcoin blockchain network on the Internet 


The above diagram shows how Bitcoin networks coexist on 
the same Internet stack. The Bitcoin network is quite dynamic 
in the sense that nodes can join and leave the netwrk at will 
and the system still works. Also, despite being asynchronous in 
nature and with network delays and packet drops, the system is 
very robust—thanks to the design of Bitcoin! 

The Bitcoin network is a decentralized network with no 
central point of failure and as well no central authority. With 
such a design, how would you assess how big the Bitcoin 
network is? There is no proper way of estimating this as the 
nodes can join and leave at will. However, there are some 
attempts at researching the Bitcoin network, and some claim 
that there are close to 10,000 nodes that are mostly connected 
to the network all the time and there can be millions of nodes 
at a time. 

Every node in the Bitcoin network is equal in terms of 
authority and has a flat structure, but the nodes can be full 
nodes or lightweight nodes. The full nodes can do almost every 
permissible activity in the Bitcoin system, such as mining 
transactions and broadcasting transactions, and can provide 
wallet services. The full nodes also provide the routing function 
to participate in and maintain the Bitcoin network. To become 


a full node, you have to download the entire blockchain 
database that containss the entire transactions taken place till 
now. Also, the node must stay permanently connected to the 
Bitcoin network and hear all transactions taking place. It is 
important that you have a good network connection, good 
storage (at least 200GB), and at least 2GB RAM dedicated to it. 
This requirement may further change and require more 
resources with time. 

On the other hand, lightweight nodes cannot mine new 
blocks but can verify transactions by using Simplified Payment 
Verification (SPV) . They are otherwse termed “thin clients.” A 
vast majority of nodes in the Bitcoin network are SPVs. They 
can as well participate in pool mining where there are many 
nodes trying to mine new blocks together. Lightweight nodes 
can help verify the transactions for the full nodes. A good 
example of an SPV is a wallet (the client). If you are running a 
wallet and someone sends money to you, you can act as a node 
in the Bitcoin network and download the relevant transactions 
to the one made to you so you can check if the person sending 
you Bitcoins actually owned them. 

It is important to note that an SPV is not as secured as a 
fully validating node because it usually contains the block 
headers and not the entire blocks. As a result, SPVs cannot 
validate transactions since they don’t have them for a block and 
also because they do not have all the unspent transaction 
outputs (UTXOs) except for their own. 


NETWORK DISCOVERY FOR A NEW 
NODE 


Now think about, when a new node wants to join the network, 
how would it contact the network? It is not an intranet with a 
192.168.1.X network where you can broadcast to the IP 
192.168.1.255 so that whichever computer is a part of the 
192.168.1.X network gets the broadcast message. The network 
switches are designed to allow such broadcast packets. 
However, remember that we are talking about the Internet, 
which Bitcoin is sitting on. If you are running a node in 
London, there is a possibility that there are other nodes in 


London, Russia, Ireland, the United States, and India and all of 
them are connected through the Internet with some public 
facing IP address. 

The question here is that when a fresh node joins the 
network, how does it figure out the peer nodes? There is no 
central server somewhere to respond to their request the way a 
typical Internet-based web application works. Blockchain is 
decentralized, remember? When started for the first time, a 
Bitcoin Core or BitcoinJ program does not have the IP address 
of any full node. So, they are equipped with several methods to 
find the peers. One of them is DNS seeds. Several DNS seeds 
are hardcoded in them. Also, several host names are 
maintained in the DNS system that resolve to a list of IP 
addresses that are running the Bitcoin nodes. DNS seeds are 
maintained by Bitcoin community members. Some community 
members provide static DNS seeds by manually entering the IP 
addresses and port numbers. Also, some community members 
provide dynamic DNS seed servers that can automatically get 
the IP addresses of active Bitcoin nodes that are running on 
default Bitcoin ports (8333 for mainnet and 18333 for testnet). 
If you perform NSLOOKUPs on the DNS seeds, you will get a 
bunch of IP addresses running Bitcoin nodes. 

The clients (Bitcoin Core or BitcoinJ) also maintain a 
hardcoded list of IP addresses that point to some (not one!) 
stable Bitcoin nodes. Such nodes can be called bootstrap nodes 
whose endpoints are already available with the source code 
itself. Every time one downloads the binaries, a fresh list of 
active nodes get downloaded along with the binaries. Once a 
Bitcoin node connection is established, it is very easy to pull the 
list of other Bitcoin nodes active at that point in time. A 
pictorial representation of how a new node becomes a part of 
the network can be found in the following figures. 

Step-1: 

Imagine that there were six nodes active at some point in 
time in the Bitcoin network. Refer to Figure 3-10. 


(1) 


om : @ 


a 


ws 





° 


4 
(4) (5) 


Figure 3-10 Bitcoin network in general 


Step-2: 

There is a new node, say, a seventh node that just showed 
up and is trying to join the existing Bitcoin network, but does 
not have any connection yet. Refer to Figure 3-11. 


(1) 


aS : re 


(4) PS 
Figure 3-11 A new node trying to join the network 


Step-3: 


The seventh node will try to reach out to as many nodes as it 
can either using DNS seeds or using the list of stable Bitcoin 
nodes in the list that it has—as shown in Figure 3-12. 


oe 
me — —" = Stable 
DS | 


(4) DNS Resolved 


(1) 











(5) 


Figure 3-12 New Bitcoin node contacts some peers 


In the diagram, we have skipped the DNS resolution part. It 
is the same as when you browse any website with its name and 
post DNS resolution the IP address is retrieved, which is then 
used as the destination webserver’s address to send TCP 
packets to. To connect to a new peer, the node establishes a 
TCP connection on port 8333 (port 8333 is well known for 
Bitcoins but could be different). Then the two nodes handshake 
with information such as version number, time, IP addresses, 
height of blockchain, etc. The actual Bitcoin code for “Version” 
message defined in net.cpp is as shown in the following: 


PushMessage( “version”, PROTOCOL VERSION, 
nLocalServices, nTime, addrYou, addrMe, 
nlhocallostNonce, 
FormatSubVersion (CLIENT NAME, CLIENT VERSION, 
Sid: : vector <siEring- (i), 
nBestHeight, true ); 


Through this Version message, the compatibility between 
the two nodes is checked as the first step toward further 
communication. 

Step-4: 

In the fourth step, the requested nodes will respond with 
the list of IP addresses and corresponding port numbers of the 
other active Bitcoin nodes that they are aware of. Please note 
that it is possible for some of active nodes to not be aware of 
each and every Bitcoin node in the network at any time. The 
port number is important because once the TCP packets reach 
the destination node, it is the port number that is used by the 
operating system to direct the message to the correct 
application/process running on the system. Please refer to 
Figure 3-13. 


(1) 
° ww 


4 4 
iP, Port 


ee (6) stable 
(7) reanenee Ss 
". | | UP Port 
o 3 (ae 
‘= 


“= 





(4) DNS Resolved 


(5) 


Figure 3-13 Peer Bitcoin nodes respond to the network request by a 
new node 


Note that, only one peer may be enough to bootstrap the 
connection of a node to the Bitcoin network; the node must 
continue to discover and connect to new peers. This is because 
nodes come and go at will and no connection is reliable. 

Step-5: 


In the fifth step, the new seventh node establishes 
connection with all the reachable Bitcoin nodes, depending on 
the list it received from the nodes contacted in the previous 
step. Figure 3-14 represents this. 


(1) 





ws 


(4) 





Figure 3-14 A new node becomes a part of the Bitcoin network 


BITCOIN TRANSACTIONS 


Bitcoin transactions are the fundamental building blocks of the 
Bitcoin system. There are basically two broader categories of 
Bitcoin transactions: 


¢ Coinbase transaction : Every block in Bitcoin 


blockchain contains one coinbase transaction included by 
the miners themselves to be able to mine new coins. They 
do not have control of how many coins they can mine in 
every block because it is controlled by the network itself. It 
started with 50 BTC in the beginning and keeps halving till 
it reaches 21 Million Bitcoins in total. 


e Regular transactions : The regular transactions are 
very similar to currency exchanges in general, where one is 
trying to transact some amount of money that they own 
with another. Typically, in Bitcoin, everything is present as 


transactions. To spend some amount, one has to consume 
previous transaction(s) where they received that amount— 
these are regular transactions in Bitcoin. Our main focus 
in this chapter will be on these regular transactions. 


Each owner of a Bitcoin can transfer the coin to someone 
else by digitally signing a hash of the previous transaction 
where they had received the Bitcoin along with the public key 
of the recipient. The payee or the recipient already has the 
public key of the payer so they can verify the transaction. The 
following figure (Figure 3-15) is from the white paper of Satoshi 
Nakamoto that pictorially demonstrates how it works. 


Owner-2 


Transaction Transaction Transaction 


Owner 2's 


Public Key 


sak 
=~ 


= 4 - 


‘ 
‘ 
<4— 


9 Owner I's 
Signature 
a 











Owner 2's 


Private Key 


Figure 3-15 Bitcoin transaction 


Notice only the highlighted Owner-2 section in the diagram. 
Since Owner-1 is initiating this transaction, he is using his 
private key for signing the hash of two items: one is the the 
previous transaction where he himself received the amount and 
the second is Owner-2’s public key. This signature can be easily 


verified using the public key of Owner-1 to ensure that it is a 
legitimate transaction. Similarly, when Owner-2 will initiate a 
transfer to Owner-3, he will use his private key to sign the hash 
of the previous transaction (the one he received from Owner-1) 
along with the public key of Owner-3. Such a transaction can 
be, and will be, verified by anyone who is a part of the network. 
Obviously because every transaction is broadcast, most of the 
nodes will have the entire history of transactions to be able to 
prevent double-spend attempts. 

There is no principle of closing balance in a Bitcoin 
network, and the total amount one holds is the summation of 
all incoming transactions to the public addresses you own. You 
can create as many public addresses as you want. If you have 
ten public addresses, then whatever transactions were made to 
that public address, you can spend those transactions (unspent 
transactions or UTXOs) using your private key. If you have to 
spend, say, five Bitcoins, you have a coupe of choices: 


e Use one of the previous transactions where you received 


five or more Bitcoins. Transfer five Bitcoins to the 
recepient, some amount as transaction fee and the 
remainder to yourself. Refer to Figure 3-16. 


Tratsaclion, 855789 


a ‘\ 5 BTC 
f \ Output.) -——————— = 
7 A Ae 7 
Ssencefine: tated (nics CODELSIOMA.04421870 R er 
You onsaction: 2 | ecipient 


Input-1 : 
Output-2 fe G2gIC 
Mining, lee 








Your Public Address 
JABA23EBES... CONES 


Recipient Pub'ie Address 
CB2E133694...84421270 





Output-3 





=>, Remaining \ } 
J) LABTC te - 
~  vaurse! 


S yourse! 
LABALIEHO9_CCA1ESS 





Figure 3-16 Bitcoin transaction with one transaction input 


e Use multiple previous transactions that you had received 
that would sum up to more than five Bitcoins. Transfer five 
Bitcoins to the recepient, some amount as transaction fee 
and the remainder to yourself. Refer to Figure 3-17. 


Transaction: 4559876 







pall 
CBJELSZOIA.,.BAS218/0 


/ \ 
/ \, ‘Transaction: 23234 (UTXO} Output-L 
Lec ak 


You 


Your Pualic Address 
TARA? SFRAG (CATES 


Recipient 
U2 BIC 


Mining few Recialent Public Address 
CB2EL 33604. 8442 1870 


Trantaction, 54214 (UTMO) Input-2 Output-2 
3 BTC 

Transaciion, 45786 (UT) 

\ P 1.2 BIC 


~ 





Input3 Output-3 > Remaining \ } 


2} 08 MC ta ws 4 





Ss yoursel! 
AABAI3ES69...CCALEAS 


Figure 3-17 Bitcoin transaction with multiple transactions 
input 


As you can see, every transaction takes as input the previous 
transaction(s). There is no account maintained that says you 
have eight BTC, and you can spend anything below this 
amount; if you spend five BTC, the remaining balance would be 
three BTC. In Bitcoin, everything is a transaction where there 
are inputs and outputs. If the outputs are not spent yet, they 
are the UTXOs. 

We are aware that every transaction in the network is 
broadcast to the entire network. Whether someone is 
maintaining a node or not, they can still make a transaction 
and that transaction is published to all the accessible Bitcoin 
nodes. The receiver Bitcoin nodes then further broadcast the 
transactions to other nodes and the entire network is usually 
flodded with transactions. This is sometimes referred to as the 
gossip protocol and plays an important role in preventing 
double-spend attacks. Recollect from Chapter 2 that the only 
way to prevent double-spend is to be aware of all transactions. 

Each node maintains a set of all the transactions that they 
hear about and broadcasts only the new ones, which were not a 
part of the list already. Nodes maintain the transactions in the 
list till the time the transaction gets into a block and is a part of 
the blockchain. This is because there is a chance that even if a 
block has all valid transactions and is proposed as a valid block, 
it can still get orphaned by not being a part of the longest chain. 
Once it is confirmed that the block is now a part of the longest 
chain, the transactions that are there in that block are taken off 
from the list of transactions. Each full node in the Bitcoin 


network must maintain the entire list of unspent transactions 
(UTXOs) even though they are in the millions. If a transaction 
is in the list of UTXOs, then it may not be a double-spend 
attempt. Upon confirming a transaction is not a double-spend 
attack and also validating the transactions from other 
perspectives, a node broadcasts such transactions. If you are 
wondering how fast it would be to search millions of UTXOs to 
check for double-spend, you are on track. Since the transaction 
outputs are ordered by their hashes, searching for an item in an 
ordered hash list is quite fast. 

Let us now think and dig deeper into a double-spend 
scenario. It is very possible that Alice (A) tries to pay Bob (B) 
and Charlie (C) the same transaction (input to a transaction is a 
previous transaction and there is no concept of closing 
balance). Such a scenario would appear as shown in Figure 3- 
18. 


(1) 


ATx(1234) -» B sali’ " sf 
pteie** 
ie Ald1234) > B 
ATx(1234} ~> € 
ATx(1234) —> B 2 wo 
ATx(1234) --> C 


ATx|1234) -> 8 


(3) ATx(1234) > B 


f A Tx(2234) o> € 


(4) 


ATx1234) «> ¢ 


(5) 


Figure 3-18 A double-spend transaction scenario in Bitcoin network 
Notice in the figure the following scenarios: 
e A is trying to spend the same transaction to B and C. 


e Node-2 received the transaction A Tx(1234) --> B and 
Node-3 received the transaction A Tx(1234) --> C. 


e For Node-2 and Node-3, their respective transactions 
received were legitimate transactions. 


e When Node-3 tries to broadcast the transaction A 


Tx(1234) --> C to Node-2 (every node broadcasts new 
transactions), Node-2 would refuse this transaction 
because it already has a transaction A Tx(1234) --> B with 
the same input transaction Tx(1234). 


e Similar things happen with other nodes as well, and they 


may have either the transaction “A Tx(1234) --> B” or “A 
Tx(1234) --> C”, whichever reached them faster, but not 
both. 


e During mining, whichever node gets to propose the block 


will include the transaction it has. This transaction would 
be a part of the blockchain and the rest of the nodes that 
are holding the other transaction would simply drop the 
transaction with Tx(1234) because it will no longer be a 
UTXO. 


CONSENSUS AND BLOCK MINING 


In the previous section we looked at granular transactions. We 
will learn how the transactions are bundled together to form a 
block and a consensus is achieved among nodes, so the entire 
network accepts that block to extend the blockchain. Note that 
“block mining” refers to successfully creating a new block in the 
blockchain. In Bitcoin, it is the distributed PoW consensus 
algorithm that helps mine new blocks by maintaining 
decentralization. Achieving distributed consensus in such a 
network is very difficult. Though it has been around for 
decades for distributed systems such as Facebook, Google, 
Amazon, and many more because they have millions of servers 
that require consistency in the data they store, the term 
consensus is very much popularized because of Bitcoins. We 
will get into the nuts and bolts of consensus and mining in this 
chapter. 


First, just keep in mind that everything in a Bitcoin network 
is represented as transactions. If you want to make a 
transaction, you have to consume one or more previous 
transactions as input and make another transaction. We 
already know that one has to sign a transaction using their 
private key to ensure that the right person is making the 
transaction. Despite such cryptographic security, can’t that 
person sign a transaction that they already spent? Example: 
Alice received ten Bitcoins in a transaction with transaction 
number 1234. She can very well spend the same transaction 
1234 and give away those ten Bitcoins to Bob and Charlie. Since 
she will sign with her private key, which means it is an 
authentic transaction, what do you think can prevent her from 
double-spending? Please note that there is no way in Bitcoin 
that you can prevent her from attempting to make a double- 
spend, but the system is designed so that such an attempt will 
not be successful. The only way to prevent such attempts is to 
be aware of all the transactions that are taing place. This is why 
all transactions in Bitcoin are broadcast to the entire network. 
Once a transaction is spent, it is no longer a part of the UTXOs 
and a new transaction number is generated to be a part of the 
UTXO, which only the recipient can spend. This is the way 
nodes can validate transactions. 

Also, the only way you can prevent a double-spend attack is 
by knowing all the transactions. When you are aware of all 
transactions, you would know the spend and the UTXOs. When 
a new block is proposed by a miner, it is required that all the 
transactions in the block are valid. Does it mean that the node 
proposing a block cannot include a invalid transaction? The 
answer is “Yes.” They can certainly inject a fraudulent 
transaction but the rest of the nodes will reject it. The PoW that 
the node would have done (we will get into the details shortly) 
by spending computer resources and electricity would be in 
vain! So, a node would never want to propose an invalid block, 
thanks to the PoW consensus. Despite not having a notion of 
global time, observe that the transactions are clubbed together 
to form a block that becomes a part of blockchain, more blocks 
get added to the chain one by one, and there is an order! Note 
carefully that the order in which the transactions took place is 


preserved by the blockchain. This way, consensus happens at 
block level, which propagates all the way to granular 
transactions. 

Based on what we have understood so far, now we know 
that every node in the Bitcoin network has its own copy of 
blockchain, and there is no “global blockchain” as such; it is a 
decentralized network after all. Each node in all those copies of 
blockchains comprises many transactions. It is also true that 
every node maintains a list of UTXOs and when given a chance 
(A node is randomly selected—we will see how) to propose a 
block, they include as many transactions as possible up to the 
block limit of 1MB or 2MB. If the block successfully makes it to 
the blockchain, they are removed from the list of UTXOs. Note 
here that every node may have different outstanding 
transactions lists because there is a possibility that some 
transactions are not heard by some of the nodes. 

It’s time now to see how the PoW algorithm really works. 
We learned about the difficulty target field in the header of 
each block. Every mining node tries to solve the cryptographic 
puzzle with an expectation to get lucky and propose a block. 
The reason they are so desperate in proposing a block is 
because they get great benefits when their proposed block 
becomes a part of the blockchain. Every transaction that an 
individual makes, they can set aside some transaction fee for 
the miners. We know that all nodes maintain the list of 
transactions that are not yet a part of the blockchain and when 
they get a chance to propose a block, they take as many 
transactions as they can and form a block. It is obvious that 
they will take all those transactions that would give them the 
highest profit and leave the ones with minimum or no 
transaction fees. It may take some time for the transactions 
with low transaction fee to get into the blocks, and chances are 
less for the ones with no transaction fee at all. Apart from the 
transaction fee, the nodes that propose a new block are 
rewarded with new Bitcoins. With every successful block, new 
Bitcoins get generated and the miner who proposed the block 
gets all of those; this is the only way new Bitcoins get created in 
the Bitcoin system. This is called “block reward.” Technically, 
the node that proposes a block includes a special transaction 


called “coin creation” in the proposed block where the recipient 
address is the one that the miner owns. When the Bitcoin was 
first launched, the block reward was 50 Bitcoins (BTC). By 
design, there can only be 21,000,000 BTCs in total, so the 
block reward gets halved every 210,000 blocks. It started at 50, 
then it became 25, then 12.5, and it goes on this way till at some 
point in time (when it reaches 21,000,000 BTCs) it trends to 
zero. Following is the code snippet from Bitcoin Core 
(main.cpp) that shows this halving process: 


PVCO4 cb GerublockVealie (ime aniertgit, ImTe4 
nFees) 
{ 
BOC WSO Wa esash DN Choi sWolher tayo Cher S AGIOME\ 
int halvings = nHeight / 
Piaeams (yen olios wohy Hemi ya ricer testa Wai 


// Force block reward to zero when right 
shift is undefined. 
if (halvings >= 64) 
return nFees; 


j7 Subsidy Lescur In helt every 7.00,000 
blocks which will occur approximately every 4 
years. 

nSubsidy >>= halvings; 


return nSubsidy + nFees; 


Notice in the previous code snippet how the block reward 
gets halved. The following explanation gives a better picture of 
this design: 


//Block reward reduced by half, remains at 50% 
BlockReward = BlockReward >> 1; 





//Block reward further reduced by half, 
remains at 25% 

BlockReward = BlockReward- 
(BlockReward>>2) ; 





//Block reward further reduced by half, 
remains at 12.5% 
BlockReward = BlockReward - (BlockReward>>3) ; 


Even though the rewards look lucrative, it is not so easy to 
get lucky and be the node that gets to propose a block. If you 
are not lucky enough, all the work you did would be in vain; 
that’s a disadvantage! So, what is it that the nodes do as a 
PoW? Let’s get back to the difficulty puzzle now. Every mining 
node at all times is working to propose a block, but only one 
succeeds at a given point in time. Assume that a block is 
proposed already, and now all mining nodes are working to 
propose a new block. Let us go through the process step by step 
and understand the whole flow: 

Step-1: 

The miners use a software to keep track of the transactions, 
eliminate the ones that already made it to a successful block in 
blockchain, reject the fraudulent transactions, and solve the 
cryptographic puzzle to propose a new block and relay that to 
the entire network. The best software to mine is the official 
Bitcoin Core but there have been many other variants that 
people have come up with. If you log into this link ( 
https://bitcoin.org/en/download ) you will find that 
the official Bitcoin Core is supported in Windows, Linux, Mac 
OS, Ubuntu, and ARM Linux. So, when we say that the mining 
node selects all the transactions (maybe the ones that give the 
miner the highest profit) till the block limit of 1MB (2MB for 
Bitcoin Cash), they also hash those transactions and generate 
the Merkle root that would become a part of this new block’s 
header. This Merkle root represents all the transactions. 

Step-2: 

They prepare the block header. Apart from the nonce, the 
rest is all available at this step. It is the work of the mining 


node to find the nonce by hashing the block header twice and 
comparing it against the difficulty target to see if it is less than 
that. They keep changing the nonce till it satisfies this 
condition, and there is no shortcut to find a nonce quickly; one 
must try out every possible option. We already looked at how to 
compute the difficult target using the four bytes of data present 
in the header itself, and we learned how it changes every two 
weeks. See the following for how this process looks: 


H [ H (Version | Previous Block Hash | Merkle 
ROO |) eLume sis aii.) Dacre iy haat 
| Nonce) ] 


<—( biriacniiy larger 7] 


Step-3: 

The miner keeps on changing the nonce field in step-2, by 
incrementing it by “1” till it satisfies the condition—it is a 
recursive phenomenon. The difficulty target for every node is 
the same and all of them are trying to solve the same problem, 
but remember that they may have different variants of 
transaction pools and hence the Merkle root for them would be 
different. Since every node is trying to extend the longest and 
main blockchain, so the previous block hash would be the 
same. 

So, ultimately the Sha256 hash twice for the block header 
should be less than the target to be able to propose the block to 
the entire network. See the following example for a better 
understanding: 


Ubchiaetoue: 
OODDD00000000074cd0000000000000000000000000000 
OODQDDD0000000000000 


Hash : 
OO00000000000074cc447J1ldeff052ced7£f07347e4eda86 
Cod savrcrUosoed + fU 


Notice that the hash value and the target value have the 
same number of leading zeros (i.e., 14) and “74cc” is less than 
“7acd,” so it satisfies the condition and this block can now be 
proposed. In many places, you would find that this explanation 
is simplified with ballpark values of both the target and the 
hash, and counting only the leading zeros. If the hash has more 
leading zeros than the target, then it satisfies the condition. 
Remember again that the more zeros in the target, the more 
difficult it gets in finding the hash that can satisfy the 
condition. 

Let us connect this learning so far with the real Bitcoin 
implementation. We know that block creation time is set to ten 
minutes—it is coded up in Bitcoin binaries for 2,016 blocks in 
two weeks, as we discussed already, and does not change till a 
hard fork happens. You can browse blocks proposed and see 
the hashes that satisfied the difficulty target at the website 
https://blockchain. info and see for yourself that the 
hashes for different blocks would have different leading zeros, 
just to set the block creation time to ten minutes on average. In 
the initial days, the number of leading zeros was around nine 
or ten, and today it has increased to around 18 to 20 zeros. It 
may increase even further as and when more powerful 
computing nodes capable of more hash rates join the network. 

Step-4: 

Once a miner finds the valid block, they immediately 
publish the block to the entire network. Every node that 
receives this block individually checks again if the miner who 
proposed the block actually solved the mining puzzle. For these 
nodes to validate this, it is just one step, as shown below: 


H [H (Version| PreviousBlock Hash | Merkle 
Root | Time Stamp | Difficulty Target | Found 
Nonce) ] 


<— [> Diriicwley larger. | 


Notice that they just use the block header that includes the 
nonce found by the proposing miner to see if the hash is less 
than the target and is valid. If it was a valid nonce and the 


condition satisfied, then they check for individual transactions 
proposed in the block with its Merkle root in the block header. 
If all transactions are valid, then they add this block to the local 
copy of their blockchain. This new block has the coinbase 
transaction that generates new coins (it started with 50 BTC, 
then 25, then 12.5, and keeps halving as discussed) as an award 
for the miner who proposed the valid block. 

Note here that block mining is not an easy job, thanks to the 
PoW mining algorithm. For a node to propose an invalid block, 
it has to burn a lot of electricity and CPU cycles to find the 
nonce and propose the block that would ultimately get rejected 
by nodes in the network. Had it been an easy task, many nodes 
would just keep trying for it and flood the network with bad 
blocks. You must understand and appreciate by now how 
Bitcoin prevents such situations in a game theoretic way! It is 
always profitable for the miners to play by the rules and they do 
not gain any extra benefits by not following the rules. 

In the previous steps, we learned the PoW mining 
procedure that is implemented in Bitcoins. One of the best 
things in this design is the random selection of a mining node 
that gets to propose a block. No one knows who would get lucky 
to find the right nonce and propose a block, it is purely a 
random phenomenon. We already know that generating a true 
random number is quite difficult and this is something that is 
the most vulnerable surface of attack for most cryptographic 
implementations. With such a design as Bitcoin’s, random 
selection of a node to propose a block is truly random. 

The next best thing in Bitcoin mining is the block reward. It 
is something that a miner who successfully proposes a new 
block gets, using the coinbase transaction in the same block. 
The miners also get the transaction fees associated with all the 
transactions they have included in the block. So, mining reward 
for a block is a combination of block reward and transaction fee 
as shown below: 


Mining Reward = Block Reward + Total 
Eransacticom Lees of all transactions on, the 
Bitecic 


We know that mining is the only way new Bitcoins are 
created in the Bitcoin system, but is that the purpose of 
mining? No! The purpose of mining is to mine new blocks, and 
generation of new Bitcoins and also the transaction fee is to 
incentivize the miners so that more and more miners are 
interested in mining. Obviously though, why would you mine if 
you are not making good money? This is again game theory. A 
proper incentivization mechanism is the key to make a sytem 
decentralized and self-sustainable. Notice that the Bitcoin 
system does not have a way to penalize nodes that do not play 
honestly, it only rewards honest behavior. Actors in the Bitcoin 
blockchain network such as individuals who just use Bitcoin or 
the miners are all identified using their public keys. It is 
possible for them to generate as many key pairs as possible and 
this makes it a psydonemous system. A node cannot be 
uniquely identified with its public key that it has used in the 
coinbase transaction, as in the very next moment it can create a 
new key pair and expose itself with a new network address. So, 
proper incentivization stands to be the best way to ensure the 
actors in the system play honestly—again the beauty of game 
theory! 

Here is a question for you now. After a block was broadcast, 
let’s say a node verified it, found the nonce and transactions 
and everything else to be valid, and included it in its local copy 
of blockchain. Does this mean that the transactions that were 
there in the block are all settled and confirmed now? Well, not 
really! There is a chance that two blocks came in at the same 
time and while one node started extending one of them, there 
is a chance that a majority of the nodes are extending on the 
other block. Eventually, the longest blockchain becomes the 
original chain. This is a scenario when a block that is absolutely 
valid, with all legitimate transactions and a proper nonce value 
that satisfied the mining puzzle, can still get abandoned by the 
Bitcoin network. Such blocks that do not become a part of the 
final blockchain are called orphaned blocks. Now, this 
explanation indicates that there is a certain possibility of one or 
more blocks getting orphaned out at any time. So, the best 
strategy would be to wait untill many blocks are added to the 
chain. In other words, when a transaction receives multiple 


confirmations, it is safe to think that it is a part of the final 
consensus chain and will not get orphaned out. As any number 
of blocks get added after a certain block, that many number of 
confirmations are received by the transactions in that block. 
Though there are no rules as such that define how many 
confirmations one should get before accepting a transaction, 
six confirmations has been the best practice. Even with four 
confirmations, it is quite safe to assume a transaction has been 
confirmed, but six is the best practice because with more 
confirmations, the chances of a block getting orphaned out 
decreases exponentially. 


BLOCK PROPAGATION 


Bitcoin uses PoW mining to randomly select a node that can 
propose a valid block. Once the miner finds a valid block, they 
broadcast that block to the entire network. Block propagation 
in the network happens the same way as transactions. Every 
node that receives the new block further broadcasts it so that 
eventually the block reaches every node in the network. Please 
note that a node does not broadcast a block unless it is a part of 
the longest chain from its perspective. Once the nodes receive 
the new block that is proposed, they not only verify the header 
and check the hash value in acceptable range, but also validate 
each and every transaction that was included in that block. It is 
clear by now that for a node in the Bitcoin network, validating a 
block is a little more complex compared with validating 
transactions. Similar to transactions, there is a possibility that 
two valid blocks are proposed at the same time. In such a 
scenario, the node will keep both the blocks and start building 
on the one that comes from the longest chain. 

We must understand that there is always a latency involved 
for a block to propagate through the entire network and reach 
every node. The relation between the block size and the time 
taken is linearly proportional, in the sense that for each kB 
added to the block size, the latency increases linearly. It is 
obvious that such network latency would impact the rate of 
growth of the blockchain. A measurement study that was 
conducted by Decker and Wattenhofer addresses this situation. 


Refer to Figure 3-19, which shows the relation between block 
size and the time it took to reach 25% (Line-1), 50% (Line-2), 
and 75% (Line-3) of monitored nodes. 


Block Propagation Times 





50; 
“y tT 75 of 
e 0 
40} a 
~ gal? 
35} — oA 
ine- 
= 30} oo 
rT) ee ae ‘ 
‘© 25} Pag 2, 90% 
™ 205 ae Line-2 °. 
wee a ae i 
15} a _ 25 % 
10; Fag si a r 
a 


oo 
0 
0 50 100 150 200 250 300 350 
Block size (KB) 


Courtesy: Yonatan Sompolinsky and Aviv Zohar- Accelerating Bitcoin’s Transaction Processing 


Figure 3-19 Block propagation time with respect to block size 


The network bandwidth is the primary reason for such 
network latencies and it is never consistent in all areas of the 
globe. On top of this, we know that the broadcast packets of 
blocks go through many hops to finally reach all nodes. A 
typical Bitcoin block is of 1MB and the new variant of Bitcoin 
with a hard fork that has come up (Bitcoin Cash) is of 2MB 
block size; you can imagine the inherent limitations due to 
latency. As per the network research, there are more than a 
million Bitcoin nodes that are connected to the Bitcoin network 
in a month and there are thousands of full nodes that are 
almost always connected to the network permanently. 


PUTTING IT ALL TOGETHER 


At a high level, if we just put down the events in the order they 
take place, then here is how it may look: 


e All new transactions are broadcast to all nodes. 


e Each node that hears the new transactions collects them 
into a block. 


e Each mining node works on finding a difficult PoW for its 
block to be able to propose it to the network. 


e When a node gets lucky and finds a correct nonce to the 
PoW puzzle, it broadcasts the block to all nodes. 


e Nodes accept the proposed block only if the nonce and all 
transactions in it are valid and not already spent. 


e Bitcoin network nodes express their acceptance of the 
block by working on creating the next block in the chain, 
using the hash of the accepted block as the previous hash 
for the new block they would be mining. 


Bitcoin Scripts 


We learned about Bitcoin transactions in previous sections at a 
high level. In this section we will delve deep into the actual 
programming constructs that make the transactions happen. 
Every Bitcoin transactions’ input and output are embedded 
with scripts. Bitcoin scripts are stack based, which we will see 
shortly, and are evaluated from left to right. Remember that 
Bitcoin scripts are not Turing-complete, so you cannot really do 
anything and everything that is possible through other Turing- 
complete languages such as C, C++, or Java, etc. There are no 
concepts of loops in Bitcoin script, hence the execution time for 
scripts is not variable and is proportional to the number of 
instructions. This means that the scripts execute in a limited 
amount of time and there is no possibility for them to get stuck 
inside a loop. Also, most importantly, the scripts definitely 


terminate. Now that we know a little about the scripts, where 
do they run? Whenever transactions are made, whether 
programmatically, or through a wallet software or any other 
program, the scripts are injected inside the transactions and it 
is the work of the miners to run those scripts while mining. The 
purpose of Bitcoin scripts is to enable the network nodes to 
ensure the available funds are claimed and spent only by the 
entitled parties that really own them. 


BITCOIN TRANSACTIONS REVISITED 


A transaction in the Bitcoin network is a tranfer of value, which 
is a broadcast to the entire network and ends up in some block 
in the blockchain. Typically, it appears that Bitcoins get 
transferred from one account or wallet to another, but in 
reality, it is from one transaction to another. Well, before 
getting into further details, keep in mind that the Bitcoin 
addresses are basically the double-hashed output of the public 
key of the participants. The public key is first hashed using 
SHA256 and then by RIPEMD160 hashing algorithms, 
respectively, to generate 160-bit Bitcoin addresses. We have 
already covered these hashing techniques in the previous 
chapter. Let us zoom in a bit more into the transactions now. 
Take a look at the following transaction tree (Figure 3-20), the 
way it happens in Bitcoin. 


Transaction 0 
100,000 (TX 0) 
(100k) 
satoshis 





Figure 3-20 A typical Bitcoin transaction structure 


Observe that the output of previous transactions become 
input to new transactions and this process continues forever. In 
the previous figure, if it was you who got the 100K from some 
previous output, it became the spendable input to a new 
transaction. Notice that in Tx 0, you spent 40K and 50K and 
paid up those amounts, and the remaining amount (10K) 
became the fee to the miner. By default, the remaining amount 
is paid to the miner, so you need to be careful not to ignore 
such situations, which are always the case. In this same 
situation, out of the remaining 10K amount, you could transfer 
say 9K to your own address and leave aside 1K for the mining 
fee. When an amount is not spent, in the sense that a 
transaction is not used as an input to a new transaction, it 
remains a UTXO, which can be spent later. Obviously, the ones 
previous to it are already spent. So, all the UTXOs combined 


for all the accounts (public keys) that you hold are your wallet 
balance. 

Pause for a moment here, and think about how it must have 
been programmed. Remember that both the inputs and outputs 
of transactions are equipped with relevant scripts to make it 
possible. It is only through the scripts that it can be ensured 
that you are the authorized user to make a transaction and you 
have the necessary amount that you have received from a 
previous transaction. This means that both the inputs and 
outputs are equally important. Here is how the transaction’s 
contents look: 


Lraicac thon Ome it — AMOUINE Ot, Bust Godiies fo 
Praneter, Outen Serie tc 
Transaction Input = Reference to previous 


Ee SaAOt Ol “Ollb DUES tae vie mCi Ok 


Whether to look into the output script first or the input 
script first is actually an egg-chicken problem. But we will see 
the output script first because it is the one that is being 
consumed by the input script of the next transaction. Let us 
repeat and get this right, that while making a transaction, the 
output script of the current transaction is there just to enable 
the future transaction that can consume this as input, but for 
this current transaction, it is the previous transaction’s output 
script that lets you spend it. This is why the output scripts have 
the public key of the recipient and the value (amount of 
Bitcoins) being transferred. When the output scripts are being 
used as inputs, their primary purpose is to check the signature 
against the public key. The output scripts are also called 
ScriptPubKey . Unless this output is spent, it remains a UTXO 
waiting to be spent. 

The input script in the transaction input data structure has 
the mechanism of how to consume the previous transaction 
that you are trying to spend. So, it has to have the reference to 
that previous transaction. The hash of the previous transaction 
and the index number {hash, index} pinpoints the exact place 
where you had received the amount that you are now spending. 
The purpose of the “index” is to identify the intended output in 


the previous transaction. If you were the recipient of the 
previous transaction, you have to provide your signature to 
claim that you are the rightful owner of the public key to which 
the transaction was made. This will let you spend that 
transaction. Also, you have to provide your public key, which 
will hash to the one used as destination address in previous 
transaction. Input scripts are also known as ScriptSigs. The 
ultimate objective of the script is to push the signatures and 
keys onto the stack. 

A typical Bitcoin transaction has the following fields (Table 
3-5). 


Table 3-5 Bitcoin Transaction Fields 


Field Si Description 
ze 


4 
Versi b Currently 1. It tells Bitcoin peers and miners which set of 
on = rules to use to validate this transaction. 
no _ 
1 
In- Positive integer (VI = VarInt). It indicates total number of 
coun inputs. 
ter s 
Ss 
V 
a 
ri 
list 
of : It lists all the inputs for a transaction. 
input 
gt 
h 


Field 


Out- 
coun 
ter 


list 
of 
outp 
uts 


lock_ 
time 


Si 


ely Sai tere) 0 = 


<< 


ri 
bl 


le 


mo 5 


nox ot 


Description 


Positive integer (VI = VarInt). It indicates total number of 
outputs. 


It lists all the outputs for a transaction. 


Not being used currently. It indicates if the transaction 
should be included in the blockchain block immediately after 
it is validated by the miner or there should be some lock time 
before it gets included in the block. 


Let us now take a look at a different representation of the 
same transaction structure that we discussed in the previous 
section. This is to see a more detailed view of the transaction 
structure and the various components of it. Now refer to Figure 


3-21, 








(i, Versior \o - Prev. Tn 13 [Hash) 
[oe 4 





(ij}  IneCountesn c Prey, Tan Output |ndex : 
‘Urlocking’ Scrip: Ler | 


nput: 1 ae ‘Unlocking’ Script 





"| PUSHDAIA Spender’s Signature with the Private Key 
PLUISHDATA <Spenddee’s Putwic Kry> 





nput: 0 






(Mi! : Scrlotsig 








Input: {v4} 
fiv/|  Qut-Cownter: m 
Outputs0 | 





OP DUP 


; OP_HASHL6D 








Arnot nt of Biteolns 














‘Locking’ Script Len PUSHDATA «Receiver’s Sitcoin Address 
unpre: (m1) “Lecking’ Seript gp rouaweriry 
(vi) Lock Time ey: OF CHECGIS 
Serial PulaKey 


Figure 3-21 Granular components of a Bitcoin transaction 


As you can see in the previous figure, the data items such as 
signatures or public keys are all embedded inside the scripts 
and are a part of the transaction. Just by looking at the 
granular components of Bitcoin transactions, many of your 
queries would be answered up front. The instructions in the 
script get pushed onto the stack and executed, which we wil 
explore in detail shortly. 

When Bitcoin nodes receive the transaction broadcasts, 
they all validate those transactions individually, by combining 
the output script of the previous transaction with the input 
script of the current transaction following the steps mentioned 
as follows: 


e Find the previous transaction whose output is being used 
as input to make this transaction. The “Prev. Txn ID 
(Hash)” field contains the hash of that previous 
transaction. 


e In the previous transaction output, find the exact index 


where the amount was received. There could be multiple 
receivers in a transaction, so the index is used to identify 
the initiator of this current transaction whose address was 
used as recipient in the previous transaction. 


e Consume the output script used in the previous 


transaction using the Unlocking Script called “ ScriptSig .” 
Notice in Figure 3-21 that there is a field before it that 
specifies the length of this Unlocking Script. 


e Join this output script with the input script by just 


appending it to form the validation script and execute this 
validation script (remember this is a stack-based scripting 
language). 


¢ The amount value is actually present in the Output Script, 
1e., the “ScriptPubKey.” It is the locking script that locks 
the transaction output with the spending conditions and 
ensures that only the rightful owner of the Bitcoin address 
to which this transaction has been made can later claim it. 
Observe that it also has the Locking Script Length field 
right before it. For the current transaction, this output 
script is only for information, and plays its role in the 
future when the owner tries to spend it. 


e It is the validation script that decides if the current 


transaction input has the right to spend the previous 
UTXO by validating the signatures. If the validation script 
runs successfully, it is confirmed that the transaction is 
valid and the transaction went through. 


Let us explore the previous explanation through a 
diagramatic representation to get a better understanding. 
Assume that Alice is paying Bob, say, five BTC. This means that 
Alice had received 5BTC in one of the previous transactions 
that was locked using ScriptPubKey . Alice can claim that she is 
the rightful owner of that transaction by unlocking it with 
ScriptSig and can spend it to Bob. Similarly, now if Bob tries to 
spend three BTC to Charlie and two BTC to himself, then here 
is how it would look (Figure 3-22). 


Versiun No 


In-Counter; 2 
tt Input: 0 
. Out-Counter: 1 
Output: 0 
Lock_Time 





Transaction from Alice 


(i) Version No 
{ii) 


(iii) input: 0 





In-Counter; 1 


fi] Out-Counter:2. >” 


{y) Oulgul 0 i . 
fui) Ounpurs 1 i. 
| Lack_Time ‘ if 


Transaction from Bob ‘ 


‘ 










Prev. Twn 1D (Hach) 





Prev. Tar Oulpul index 
‘Unlocking’ Seript Len 


‘Unloelding’ Seript 







‘Locking’ Scriat Len 
‘Lacking’ Scriot 










Prev. Tes (D [Ibash} 


‘Undocking’ Script Ler 





‘Unlocking’ Script 


‘Locking’ Scr pt Len 


‘Locking’ Sen pt 





‘Locking’ Scr pt Len 





‘Locking’ Senpt 





,] PUSHDATA <Bob’s Signature with her Private Keys 
Prev, Tart Outpul index: 0 : 


SeriprPubwey 





‘| PUSH DATA <Alice’s Signature with her Private dey> 





PUSHMATA <Alien’s Public Key> 


 ScripiSig 










OP_HASH 150 









PUSHDATA <Bob's Bitcoin Address (16D bits\z oo * 
OP EQUALVERIFY a | 


OP_CHICOKSIG 








: SeriptPubKkey (Locked to Bob! 





PUSHOATA <f0h's Public Key> 
~ Seriptsig (Bab can unlock) 





OF_DUP 
OF _HASHISO 
PUSHDATA <Charlle’s Bitcaln Address [180 ofts}> 
OP_EQUALVERIFY 
OP_CHECKSIG 


— OF_DUP : 
OF_HASHID) 
PUSHDATA <Bab's Bitcoln Address (160 bits|> 
OP_EQUALVERIFY 


OP_CHECK SIG 











ScelarPubKey 


Figure 3-22 A practical example of Bitcoin scripts 


When the Bitcoin network, more precisely the miners, 
receive the transaction from Alice, they check and confirm that 
it is a valid transaction and approve it by including it in their 
blocks (well, the one who proposes a block does it). When that 
happens, the output of this transaction becomes a part of the 
UTXO in the name of Bob, who could later spend it. And this is 
what happens in our example—that Bob also spends it to 
Charlie. Bob did so by consuming the previous transaction, 
unlocking it with his signature and public key, to prove that he 
is the owner of the Bitcoin address that Alice had used. Observe 
that there are two outputs in Bob’s transaction. Since he had 
received five BTC from Alice and is paying three BTC to 
Charlie, he must transfer the remainder to himself so that it 


becomes two BTC of UTXO bound to Bob himself and he could 
spend it in future. In Bob’s transaction, the three BTC to 
Charlie is locked using the locking script for only Charlie to 
spend later. 

Are you now thinking about how the scripts are combined 
and executed together? Remember that the unlocking script of 
current transaction is run along with the locking script of the 
previous transaction. As discussed already, running the scripts 
is a miner’s job and they do not happen at the wallet software. 
In the previous example, when Bob makes the transactions, 
miners execute the ScriptSig unlocking script from Bob’s 
transaction, and then immediately execute the ScriptPubKey 
locking script from Alice’s transaction in order. If the 
sequential execution in a stack-based fashion for the combined 
validation script runs successfully by returning TRUE, then 
Bob’s transaction is excepted by all the nodes validating it. We 
will take a look at Bitcoin scripts and how a Bitcoin-scripting 
virtual machine executes the stack during the execution of the 
combined script commands in more detail in the following 
section. In this section, however, take a look at the following 
example that represents the transaction from a developer’s 
standpoint: 


{ 


"hash": 
"a320ba8bbel163£26cafb2092306c153£87c1c2609b25d 
b0c13664aelafca78ce", 


"yer: “1, 
PVLASZ 5, 
YVOUEDSZ Si, 


"lock time": 0, 
VS Zee: “51 


ETA : L 
{ 


Sae = neiial shen Sri) 


"hash": "83cd5e9b704c0a4cb6066e3al6 
42 DAS Sa0Ccor (Salo glesZaysdtraselZevds2n™, 
he 
ap 
UIer Epo ld CO soe SOO Cea sole ICU ade ob 
8a926675def0045c397d3df55b0ael 45ef80db7849599b 
SSU2ZVablsbd2ddateavasveZzescdZsUS0bbeD i bsdcacet 
176652dac82fe9d5873f3409661281d32f6d35b46906cd 
PoZbrebtgrargs scOmipecbDAy dob US>eUraS cole lsd gs 


ac telly iss re OLN ole 
Pec ior UOige ys 2Ob DUE OF sha S Te) 
bsaZc0ds4ec’82Z cre [Ss ZbscsZ23lso/ald4san4c/s 
OP FOUR VER EnY OP CHC h one! 
} 
] 


Example code with just one input and one output 


Note that Bitcoin transactions are not encrypted, so it is 
possible to browse and view every transaction ever collected 
into blocks. 


SCRIPTS 


A script is actually a list of instructions recorded with each 
transaction that describes how the next person can gain access 
to those Bitcoins received and spend them. Bitcoin uses stack- 
based, non- Turing-complete scripting language where the 
instructions get processed from left to right. Keep in mind that 
it is non—Turing-complete by design! 


We looked at the input and output scripts in the previous 
section. We are now aware that the input script ScriptSig is the 
unlocking script and has two components, the public key and 
the signature. The public key is used because it hashes to the 
Bitcoin address that the transaction was spent to, in the 
previous transaction. The ECDSA digital signature’s purpose is 
to prove the ownership of the public key, hence the Bitcoin 
address to be able to spend it further. Similarly, the output 
script ScriptPubKey in the previous transaction was to lock the 
transaction to the rightful owner of the Bitcoin address. These 
two scripts, ScriptSig of current transaction and ScriptPubKey 
of previous transaction, are combined and run. Take a look at 
its appearance after they are combined (Figure 3-23). 


(| ‘Write He 





I erotic 
jj a ed oF Me ; 
PUSHDATA <Bob’s Signature with her Private Key> | 














Previous Transaction 
is 
} 
H 
od 
| 
} 























1 

WSN) 

H_ Samed bis WUSHDATA Bt Bacon Aca (160th | 

M4} tative Veg rt lee SAF ~ PUSHDATA <Bob’s Public Key: i 

Trarsiction: Wine Bog, sty! Soi or tt ; 

" 1 

SerigePubitny (Noched te haa) 0? DUP ! 

1 

— 1 

Prox fon (Hash PWD Reis Sgr are with bee Pvt Me OP_HASHI60 ' 

LT I amt tenn i 

roe Ten Owiad de® | AUSHDATA Batis Pall Keye i 

& A Weionty Velacig’ Sarge Let Seaitg (Bed Ca» veloc! PUSKDATA <Bcb's Bitcoin Address (160 bits}> | 

6 oo) Contec! ‘sig Sot _ oo i 

Dag) pet OP EQUALVERIFY 

4 4 1 

£ ft) OxtGewmen | ' ' 

5 i Otant OP_CHECKSIG 

gy ous LSE PETES ESSESEparT 
Vv Nw 


el Combined Validation Script 


Figure 3-23 Formation of combined validation script 


As we learned already, it is important to note that the 
Bitcoin script either runs successfully or it fails. When the 
transactions are valid, it runs successfully without any errors. 
Bitcoin scripting language is a very simplified version of 
programming languages and is quite small, with just 256 
instructions in total. Out of these 256, 15 are disabled and 75 
are kept reserved maybe for later usage. These basic 


instructions comprise mathematical, logical (f/then), error 
reporting, and just return statements. Apart from these, there 
are some additional cryptographic instructions such as 
hashing, signature verification, etc. We will not get into all the 
available instruction sets, and focus only on the ones we will 
use in this chapter. Following are a few: 


e OP_DUP: It just duplicates the top item in the stack. 


e OP_HASH160: It hashes twice, first with SHA256 and 
then RIPEMD160. 


¢ OP_EQUALVERIFY: It returns TRUE if the inputs are 


matched, and FALSE otherwise and marks the transaction 
invalid. 


e OP_CHECKSIG: Checks if the input signature is a valid 


signature using the input Public Key itself for the hash of 
the current transaction. 


To execute these instructions, we just have to push these 
instructions on to the stack and then execute. Apart from the 
memory that the stack takes, there is no extra memory required 
and this makes the Bitcoin scripts efficient. As you have seen, 
there are two kinds of instructions in the script, one is data 
instruction and the other is opcodes. The previous bullet list 
entries are all opcodes, and the combined validation script that 
we saw before has both of these kinds of instructions. Data 
instructions are just to push data onto the stack and not really 
to perform any function, and the sole purpose of opcodes is to 
execute some functions on the data in the stack and pop out as 
applicable. Let us discuss how Bob’s transaction would get 
executed with such a stack-based implementation. Recollect 
the combined script where Bob is trying to spend a previously 
received transaction in the current transaction to Charlie 
(Figure 3-24). 


PUSHDATA <Bob’s Signature with her Private Key> 


PUSHDATA <Bob’s Public Key> 


OP_DUP 


Combined Validation Script 





Figure 3-24 Combined script of ScriptPubKey and CheckSig 


The corresponding stack-based implemention would be as 
follows (Figure 3-25). 


é | Bob's Signature | 


yf Pa Bob’s Public Key 
PUSHDATA <Buob’'s Sigmuture with his Private Key> pee Goalie Sinnatine 
av cs 
o ? 
Pri cd 


¢ 


Pa fiob’s Public Key 
PUSHIDATA <Bob’s Public Key> as ,. Bob's Public Key 








Bob's Signature 





oP OUP ae a Hash of Bob’s Public Key 
+ i fob’s Public Key 


Bob's Aircain Address (160 bits) 


OP_HASH1G0 = 


Hash of Rob’s Public Key (160 bits) 
Bob's Public Key 


Bob's Signature 


PUSHDAIA <Bob’s Bitcoin Address (160 bits)> 


“- 





Bob's Public Key 
Baeato’s Sipgeieat cares 
= TRUE 


STACK 


_ s 
2+. 
OP_EQUALVERIFY ai 
OP_CHECKSIG oe 


Figure 3-25 Example of stack-based implementation of Bitcoin 
script 


Though the previous stack-based implementation is self 
explanatory, we will quickly run through what happened here. 


e First was Bob’s signature—a data instruction and so was 
pushed onto the stack 


¢ Then was his public key—again a data instruction and was 
pushed on to the stack 


e Then it was OP_DUP, an opcode. It duplicates the first 


item in the stack, so the public key of Bob was duplicated 
and became the third item on the stack. 


e Next was OP_HASH160, an Opcode, which hashed Bob’s 


public key twice, once with SHA256 and then with 
RIPEMD160, and the final 160 bits output replaced Bob’s 
public key and became the top of the stack. 


e Then it was Bob’s Bitcoin address (160 bits)—a data 
instruction, which was pushed to the stack. 


e Next was an opcode, OP_EQUALVERIFY, which checks 


the top two items in the stack and if they match, it pops 
them both else an error is thrown and the script would 
terminate. 


e Then was again an opcode OP_CHECKSIG, which checks 
the public key against the signature to validate the 
authenticity of the owner. This opcode is also capable of 
consuming both inputs and popping them off the stack. 


You must be wondering what if someone tries to inject some 
fraudulent scripts or tries to misuse them. Please note that 
Bitcoin scripts are standardized and the miners are aware of 
them. Anything that does not follow the standard gets dropped 
by the miners, as they wouldn’t waste their time executing such 
transactions. 


Full Nodes vs. SPVs 


We already got a heads-up on the full nodes and SPVs in this 
chapter. It is obvious that the notion of full node and 
lightweight node is implemented to ease out the usage of 
Bitcoins and make them more adaptable. In this section, we 
will zoom in to the technicalities for these variants and 
understand their purpose. 


FULL NODES 


The full nodes are the most integral components in a Bitcoin 
network. They are the ones that maintain and run Bitcoin from 
various places across the globe. As discussed already, download 
the entire blockchain with all transactions, starting all the way 
from the genesis block to the latest discovered block. The latest 
block defines the height of the blockchain. 

The full nodes are extremely secure because they have the 
entire chain. For an adversary to be successful in cheating a 


node, an alternative blockchain needs to be presented, which is 
practically impossible. The true chain is the most cumulative 
PoW chain, and it gets computationally infeasible to propose a 
new fraudulent block. If all transactions are not valid in a 
block, PoW mining performed by the adversary will be in vain, 
because other miners will not mine on top of it. Such a block 
gets orphaned out soon enough. Full nodes build and maintain 
their own copy of blockchain locally. They do not rely on the 
network for transaction validation because they are self- 
sufficient. They are just interested in knowing the new blocks 
that get proposed by other nodes so that they can update their 
local copy after validating blocks. So, we learned that each full 
node must process all transactions; they must store the entire 
database, every transaction that is currently being brioadcast, 
every transaction that is ever spent, and the list of UTXOs; 
participate in maintaining the entire Bitcoin network; and they 
also have to serve the SPV clients. 

Note that there are so many varities of Bitcoin software that 
the full nodes use that are quite different in software 
architecture and programmed in different language constructs. 
However, the most widely used one is the “Bitcoin Core” 
software; more than three fourths of the network uses it. 


SPVS 


Bitcoin design has this nice concept of Simple Payment 
Verification(SPV) nodes that can be used to verify transactions 
without running full nodes. The way SPVs work is that they 
download only the header of all the blocks during the initial 
syncing to the Bitcoin network. In Bitcoin, the block headers 
are of 80 bytes each, and downloading all the headers is not 
much and ranges to a few MBs in total. 

The purpose of SPVs is to provide a mechanism to verify 
that a particular transaction was in a block in a blockchain 
without requiring the entire blockchain data. Every block 
header has the Merkle root, which is the block hash. We know 
that every transaction has a hash and that transaction hash can 
be linked to the block hash using the Merkle tree proof which 
we discussed in the previous chapter. All the transactions in a 


block form the Merkle leafs and the block hash forms the 
Merkle root. The beauty of the Merkle tree is that only a small 
part of the block is needed to prove that a transaction was 
actually a part of the block. So, to confirm a transaction an SPV 
does two things. First, it checks the Merkle tree proof for a 
transaction to accertain it is a part of the block and second, if 
that block is a part of the main chain or not; and there should 
be at least six more blocks created after it to confirm it is a part 
of the longest chain. Figure 3-26 depicts this process. 


fr) ock 201 Block 202 - : Block 303 
- 1 Block Heaver mt F ‘Block Header 


ff Block easter : ‘ 
| Prey_Hash | Timestamp Prey_Hash Z _ Times stamp -— Prey_Hash Frew Hash | Timestamp | 
werk & Root | # Root eae) | Notice 


| Merk ¥ou: | Nonoe | 
/ 














Figure 3-26 Merkle root in block header of SPV 


Let us dig deeper into the technicality of how SPVs really 
work in verifying transactions. At a high level, it takes the 
following steps: 


e To the peers an SPV is connected to, it establishes Bloom 


filters with many of them and ideally not just to one peer, 
because there could be a chance for that peer to perform 
denial of service or cheat. The purpose of Bloom filters is 
to match only the transactions an SPV is interested in, and 
not the rest in a block without revealing which addresses 
or keys the SPV is interested in. 


e Peers send back the relevant transactions in a merkleblock 
message that contains the Merkle root and the Merkle path 
to the transaction of interest as shown in the figure above. 
The merkleblock message sze is in a few kB and quite 
efficient. 


e It is then easy for the SPVs to verify if a transaction truly 
belongs to a block in the blockchain. 


e Once the transaction is verified, the next step is to check if 
that Block is actually a part of the true longest blockchain. 


The following (Figure 3-27) represents this SPV 
communication steps with its peers. 


(1) 


F wil Node 
ee eee Pl i | ‘ ; 


TCP Connection Establishment 7 


di 


a eS ._- 6 
“a 7 is . ‘ 
“2 fuse | | | 
ae: "p> P ‘ , 


™~ 


on B ve 
Merkleblock Message ™ 


\y 
| a 
A nope Tsp ime Uk Sm ' AS t ; 
™ 








Hond Shake 









Sioom Filter Establishment 











s 
Full Node (5) 
Bitcoin Network 
Figure 3-27 SPV communication mechanism with the Bitcoin 
network 
Bitcoin Wallets 


Bitcoin wallets are very similar to the wallet you use in your 
daily life, in the sense you have access to it and you can spend 
when you want. Bitcoin wallets, however, are a digital 
phenomenon. Recollect the example we used in the previous 
section, where Alice paid some amount to Bob. How would she 
do it if Bob did not have an account? In the Bitcoin setting, the 
accounts or wallets are represented by the Bitcoin address. Bob 
must first generate a key pair (private/public keys). Bitcoin 
uses the ECDSA algorithm with secp256k1 curve (don’t worry, 
it is just the curve type—a standard recommendation). First a 
random bit string is generated to serve as private key, which is 


then deterministically transformed to public key. As we learned 
before in Chapter 2, the private/public keys are mathematically 
related and the public key can be generated from the private 
key any time (deterministic). So, it is not really a requirement 
to save the public keys. as such. True randomness is not 
possible through software implementations, so many servers or 
applications use hardware security modules (HSMs) to 
generate true random bits and also to protect the private keys. 
Unlike public keys, private keys definitely require saving them 
with maximum security. If you lose them, you cannot generate 
a signature that would justify the ownership of the public key 
(or Bitcoin address) that received some amount in any 
transaction. The public keys are hashed twice to generate the 
Bitcoin adress, first with SHA256 and then with RIPEMD160. 
This is also deterministic, so given a public key, it is just a 
matter of a couple of hashes to generate the Bitcoin address. 

Note carefully that the Bitcoin address does not really reveal 
the public key. This is because the addresses are double-hashed 
public keys and it’s quite infeasible to find the public key given 
the Bitcoin address. However, for someone with a public key, it 
is easy to claim the ownership of a Bitcoin address. The hashing 
technique in Bitcoin shortens and obfuscates the public key. 
While it makes the manual transcription easier, it also provides 
security against unanticipated problems that might allow 
reconstruction of private keys from public keys. This is possibly 
the safest implementation! Public keys are revealed only when 
the transaction output is being claimed by the owner, not when 
it was transacted to them, as you can see in Figure 3-28. 


Signature Scnipt Bob's Computer 


Ht fae 
Full Public Key Full Public Key 


Pubkey Script 
Public Key Hash Public Key Hash 


Spending A P2PKH Output 





Figure 3-28 Revealing public key to claim a transaction 


Bitcoin wallets are nothing but the SPVs and are served by 
the full nodes. We already looked at the functioning of SPVs, so 
in this section we will take a look at some wallet-specific 
activities. We all understand that to make a transaction, or to 
receive a transaction, you need not be running a full node. All 
you want is a wallet to be able to save your private/public key 
pair, to be able to make and receive transactions (actually view 
and verify the ones made to you). We already learned the 
verification part while going through the SPVs section. Let us 
take a look at how to initiate a transaction using a wallet. 

It is advisible that you run your own full node and connect 
your wallet to it, as it would be the most secured way of 
working on Bitcoin. However, it is not a mandate and you can 
still work without maintaining your own node. Keep in mind 
that when you query a node, you have to mention your public 
address to get the list of UTXOs, and the full node is becoming 
aware of your public address, which is a privacy leak! All a 
wallet has to do is get the list of UTXOs so it can spend a 
transaction by signing it with its private key and publish that 


transaction into the Bitcoin network. This can be done by 
creating your own wallet software or by using a third-party 
wallet service. However, be careful with the wallet service 
providers because you are allowing them to take control of your 
private key. Whether they deliberately take your Bitcoins or 
they themselves are hacked, which has been the case with many 
wallet services, you lose your Bitcoins. At the end of the day, all 
wallet-service providers are centralized, though the Bitcoin 
network is decentralized. A typical pictorial representation of 
initiating a Bitcoin transaction through the wallet software can 
be represented as shown in the following (Figure 3-29). 


wwe 


 lentientiestiatientindiedtiedtietiatiedtt it 
~ 
s\ 
a 
N 
— 
& 
‘ 
‘ 
~ 
,_/-> 
q ’ 
‘4 
s 
€ 
~~ 
~ 
4 
7 
- 
- 


a 
- 
a 
4 
-_ 
~ 
a 
’ 
, 
’ 
& 
~~ 
~ 
~ 
ee ee ee ee ee 


(4) 
. Bitcoin Network 30 


ee ee ee ee ee ee ee ee ee ee ee ee ewe es ee es es we es we we we ee es ae 


Get UTXOs Push Tx 


“ 


Create Tx 








Figure 3-29 A wallet application interacting with the Bitcoin 
network 


An example of an SPV client that can serve as a Bitcoin 
wallet is “BitcoinJ.” BitcoinJ is actually a library to work with 
the Bitcoin protocol, maintain a wallet, and initiate/validate 


transactions. It does not require a full node such as a Bitcoin 
Core node locally and can function as a thin client node. 
Though it is implemented in Java, it can be used from any 
JVM-compatible language such as JavaScript and Python. 


Summary 


In this chapter, we learned how blockchain concepts we 
discussed in the previous chapter were put together to build 
Bitcoin as a cryptocurrency use case of blockchain technology. 
We covered the evolution of Bitcoin, the history of it, what it is, 
the design benefits, and why it is so important. We got to know 
about granular details on the Bitcoin network, transactions, 
blocks, the blockchain, consensus, and how all these are 
stitched together. Then we learned about the requirement of a 
wallet solution to interact with the Bitcoin blockchain system. 

In the 1990s, mass adoption of the Internet changed the 
way people did business. It removed friction from creation and 
distribution of information. This paved the way for new 
markets, more opportunities, and possibilities. Similarly, 
blockchain is here today to take the Internet to a whole new 
level. Bitcoin is just one cryptocurrency application of 
blockchain, and the possibilities are limitless. In the next 
chapter, we will learn about how Ethereum works and how it 
has become a defacto standard for various decentralized 
applications on one public blockchain network. 





References 


Bitcoin: A Peer-to-Peer Electronic Cash System 

Nakamoto, Satoshi, “Bitcoin: A Peer-to-Peer Electronic 
Cash System,” https: //bitcoin.org/bitcoin, pdt . 

All about Bitcoin Network and Transactions 

Bitcom wiki, https: //ém.bitcoin.it/ . 

Blockchain Technology 

Crosby, Michael, Nachiappan; Pattanayak, Pradhan, Verma, 
Sanjeev, Kalyanaraman, Vignesh, “BlockChain Technology: 


Beyond Bitcoin,” Sutardja Center for Entrepreneurship & 
Technology, University of California, Berkeley, 
http://scet.berkeley.edu/wp- 
content/uploads/BlockchainPaper. pdf , October 16, 
2015. 

Accelerating Bitcoin’s Transaction Processing 

Sompolinsky, Yonatan, Zohar, Aviv, “Secure High-Rate 
Transaction Processing inBitcoin,” Hebrew University of 
Jerusalem, Israel, School of Engineering and Computer 
science, https: //eprine 1acr.org/ 20137881. pdt. 


© Bikramaditya Singhal, Gautam Dhameja, Priyansu Sekhar Panda 2018 
Bikramaditya Singhal, Gautam Dhameja and Priyansu Sekhar Panda, Beginning 
Blockchain, https://doi.org/10.1007/978-1-4842-3444-0_4 


4. How Ethereum Works 


Bikramaditya Singhal: , Gautam Dhameja’ 
and Priyansu Sekhar Panda‘ 


(1) Bangalore, Karnataka, India 
(2) Berlin, Berlin, Germany 


The era of blockchain applications has just begun. 
Ethereum is here to be the defacto blockchain platform for 
building decentralized applications. We already learned in the 
previous chapters that public blockchain use cases are not just 
limited to cryptocurrencies, and the possibilities are only 
limited by your imagination! Ethereum has already made 
inroads in many business sectors and works best not only for 
public blockchain use cases, but also for the private ones. 
Ethereum has already set a benchmark for blockchain 
platforms and must be studied well to be able to envision how 
usable decentralized applications can be built with or without 
using Ethereum. Today, it is possible to build blockchain 
applications with minimal knowledge of cryptography, game 
theory, mathematics or complex coding, and computer science 
fundamentals, thanks to Ethereum. 

In Chapter 3, we learned how Bitcoin works by taking a 
deep dive into the protocol as well as the Bitcoin application. 
We witnessed how the cryptocurrency aspect is so much 
interwoven into the Bitcoin protocol. We learned that Bitcoin is 
not Bitcoin on blockchain, rather a Bitcoin blockchain. In this 


chapter, we will learn how Ethereum has successfully built an 
abstract foundation layer that is capable of empowering various 
different blockchain use cases on the same blockchain 
platform. 


From Bitcoin to Ethereum 


Obviously, blockchain technology came along with Bitcoin back 
in 2009. After Bitcoin stood the test of time, people believed in 
the potential of blockchain. The use cases now have gone 
beyond banking and finance sectors and have enveloped other 
industries such as supply chain, retail, e-commerce, healthcare, 
energy, and government sectors as well. This is because 
different flavors of blockchain have come up and address 
specific business problems. Nonetheless, there are public 
blockchain platforms such as Ethereum that allow different 
decentralized use cases to be built on the same public 
Ethereum platform. 

With Bitcoins, decentralized peer-to-peer transaction of 
cryptocurrency was possible. People realized that blockchain 
could be used to transact and keep track of anything of value, 
not just cryptocurrency. People started exploring if the same 
Bitcoin network could be used for any other use case. To give 
you an example, “proof of existence” is one such use case where 
the hash of a document was injected in the Bitcoin blockchain 
network so that anyone could later verify that such a ducument 
was existant in so and so point in time. Vitalik Buterin 
introduced the Ethereum blockchain platform that could 
facilitate transactions of not just money, but also shares, lands, 
digital content, vehicles, and many others that have some 
intrinsic value. Take a look at Figure 4-1. 





Figure 4-1 Multiple decentralized applications on one Ethereum 
platform 


Like Bitcoin, Ethereum is a public blockchain platform with 
a different design philosophy. The most innovative approach 
was to build an abstraction layer so that transactions from 
different applications are generalized to the program code that 
can run on all the Ethereum nodes. Even in Ethereum, the 
miners generate Ether, a tradeable cryptocurrency because of 
which the public blockchain network is self-sustainable. Any 
application that is running on Ethereum has to pay transaction 
fees that eventually the miners get for running the nodes and 
sustaining the whole network. 


ETHEREUM AS A NEXT-GEN 
BLOCKCHAIN 


With the Bitcoin blockchain, the developer community tried 
building different decentralized applications with a completely 
new blockchain, or were trying to modify Bitcoin Core to 
increase the set of functionalities. Either way, it was 
complicated as well as time consuming. A different design with 
an alternative protocol was probably the need of the hour then, 
which is why the Ethereum blockchain platform! The purpose 
was to facilitate development of many blockchain applications 
on one Ethereum platform rather than building dedicated 
blockchains for each application separately. Ethereum enabled 
rapid development of decentralized applications that could 
interact among themselves, ensuring adequate security. As 
mentioned in the previous section, Ethereum does this by 
building an abstract foundation layer. Unlike Bitcoin, 
Ethereum supported Turing-complete language so anyone 
could write smart contracts that could virtually do anything 
and everything on a programming perspective. Also, Ethereum 
is stateful by design and keeps track of the acount states, which 
is very different from Bitcoin where everything remains as a 
transaction and there is no internal persistent memory for 
scripts. With the help of an abstract foundation layer, the 
underlying complexities are hidden from the developers and 
not just that; the developers get the flexibility of designing their 
own state transition functions for direct transfer of value and 
information, and transaction formats. 

In an effort to meet the objective, the core innovation of 
Ethereum was the Ethereum Virtual Machine (EVM). The 
support for Turing-complete languages through the EVM 
makes it easy for the developers to create blockchain 
applications. Just the way a Java Virtual Machine (JVM) is 
required to run Java code, EVM is required to run the smart 
contracts. For now, just keep in mind that smart contracts are 
the Ethereum scripts written in a Turing-complete language 
that automatically gets executed in case a predefined event 
occurs. The “ScriptSig” and “ScriptPubKey” in Bitcoins are the 
basic versions of smart contracts so to speak. We learned in the 
previous chapter that in Bitcoins, the instruction set was very 
limited. In Ethereum, however, one could code almost any 
program that would run on the EVM on each and every node in 


the Ethereum blockchain network. The decentralized 
applications in Ethereum are called DApps. Ethereum being a 
global decentralized computer system with no centralized 
server, DApps are the applications that run without downtime, 
fraud, or any sort of regulations. A peer-to-peer electronic cash 
system such as Bitcoin is very easy to build on Ethereum as a 
DApp. Similarly, any other asset with some intrinsic value, 
such as land, cars, houses, votes, etc., could easily be transacted 
through their respective DAaps on Ethereum in the form of 
tokens. 

Unlike traditional software development and deployment, 
DApps do not need to be hosted on a back-end server. The 
“code” is embedded as payload in transactions, so to speak, 
that are then sent to the mining nodes in the Ethereum 
network. Such transactions would be considered by the mining 
ecosystem because of the ETH (Ether) paid as “gas Price.” Like 
in Bitcoin, these transactions get broadcast to other miners in 
the network that they are accessible to. The transaction then 
eventually gets into a block and becomes an eternal part of the 
blockchain when consensus is reached. Developers have the 
liberty to code up any solution and deploy that in the Ethereum 
network. The network executes that, all by itself, and validates 
and produces the outputs as well. Well, had it been without any 
cost, the network wouldn’t have been sustainable. There is a 
gas Price associated with each blockchain transaction, and 
writing some garbage code and deploying that into the 
Ethereum network could be an expensive affair! 


DESIGN PHILOSOPHY OF ETHEREUM 


Ethereum borrows many concepts from Bitcoin Core as it stood 
the test of time, but is designed with a different philosophy. 
Ethereum development has been done following certain 
principles as follows: 


¢ Simplistic design: The Ethereum blockchain is designed 
to be as simple as possible so that it is easy to understand 
and develop decentralized applications on. The 
complexities in the implementation are kept to a bare 


minimum at the consensus level and are managed at a 
level above it. As a result, high-level language compilation 
or serialization/deserialization of arguments, etc. are not a 
concern for the developers. 


¢ Freedom of development: The Ethereum platform is 


designed to encourage any sort of decentralization on its 
blockchain platform and does not discremenate or favor 
any specific kinds of use cases. This freedom is given to an 
extent that a developer can code up an infinite loop in a 
smart contract and deploy it. Obviously, the loop will run 
as long as they are paying the transaction fee (gas Price), 
and the loop eventually terminates when it runs out of gas. 


¢ No notion of features: In an effort to make the system 
more generalized, Ethereum does not have built-in 
features for the developers to use. Instead, Ethereum 
provides support for Turing-complete language and lets 
the users develop their own features the way they want to. 
Starting from basic features such as “locktime,” as in 
Bitcoin till full blown use cases, everything can be coded 
up in Ethereum. 


Enter the Ethereum Blockchain 


We learned about the objective behind Ethereum blockchain 
and its design philosophy. To be able to understand and 
appreciate this next-gen blockchain and build decentralized 
applications on it, we will learn about the core components of 
Ethereum in great detail in this section. 


ETHEREUM BLOCKCHAIN 


The Ethereum blockchain data structure is pretty similar to 
that of Bitcoin’s, except that there is a lot more information 
contained in the block header to make it more robust and help 
maintain the state properly. We will learn more about the 
Ethereum states in the following sections. Let us focus more on 
the blockchain data structure and the header in this section. In 


Bitcoins, there was only one Merkle root in the block header for 
all the transactions in a block. In Ethereum, there are two more 
Merkle roots, so there are three Merkle roots in total as follows: 


e stateRoot: It helps maintain the global state. 


¢ transactionsRoot: It is to track and ensure integrity of 


all the transactions in a block, similar to Bitcoin’s Merkle 
root. 


e receiptsRoot: It is the root hash of the receipts trie 
corresponding to the transactions in a block 
We will take a look at these Merkle roots in their respective 


sections of block header information. For better 
comprehension, take a look at Figure 4-2. 


Block 201. Block 202 Block 203 


a= Se _ i Block Header 





Abed [nina | eo azaec aosLimit re mixHach = “3 ( Nurnber | past 


ea SE es ay 


ee ee ee ee ee ee. Ty 


Figure 4-2 The blockchain data structure of Ethereum 


Every block usually comprises block header, transactions 
list, uncles list, and optional extraData. Let us now take a look 
at the header fields to understand what they mean and their 
purpose for being in the header. While you do so, keep in mind 
that there could be slight variants of these names in different 
places, or the order in which they are presenbted could be 
different in different places. We suggest that you build a proper 
understanding of these fields so that any different terminology 
that you might come across won’t bother you much. 

Section-1: Block metadata 


e parentHash: Keccak 256-bit hash of the parent block’s 
header, like that of Bitcoin’s style 


e timestamp: The Unix timestamp current block 
¢ number: Block number of the current block 


e Beneficiary: The 160-bit address of “author” account 
responsible for creating the current block to which all the 
fees from successfully mining a block are collected 


Section-2: Data references 


e transactionsRoot: The Keccak 256-bit root hash (Merkle 


root) of the transactions trie populated with all the 
transactions in this block 


e ommersHash: It is otherwise known as “uncleHash.” It is 
the hash of the uncles segment of the block, i.e., Keccak 
256-bit hash of the ommers list portion of this block 
(blocks that are known to have a parent equal to the 
present block’s parent’s parent). 


e extraData: Arbitrary byte array containing data relevant to 
this block. The size of this data is limited to 32 bytes (256- 
bits). As of this writing, there is a possibility that this field 
might become “extraDataHash”, which will point to the 
“extraData” contained inside the block. extraData could be 
raw data, charged at the same amount of gas as that of 
transaction data. 


Section-3: Transaction execution information 


e stateRoot: The Keccak 256-bit root hash (Merkle root) of 


the final state after validating and executing all 
transactions of this block 


e receiptsRoot: The Keccak 256-bit root hash (Merkle root) 


of the receipts trie populated with the recipients of each 
transaction in this block 


e logBloom: The accumulated Bloom filter for each of the 


transactions’ receipts’ Blooms, i.e., the “OR” of all of the 
Blooms for the transactions in the block 


e gasUsed: The total amount of gas used through each of the 
transactions in this block 


e gasLimit: The maximum amount of gas that this block 


may utilise (dynamic value depending on the activity in the 
network) 


Section-4: Consensus-subsystem information 


e difficulty: The difficulty limit for this block calculated from 
the previous block’s difficulty and timestamp 


e mixHash: The 256-bits mix hash combined with the 
‘nonce’ for the PoW of this block 


e nonce: The nonce is a 64-bit hash that is combined with 
mixHash and can be used as a PoW verification. 


ETHEREUM ACCOUNTS 


The Ethereum accounts, unlike Bitcoins, are not in the form of 
unspent transaction outputs (UTXOs). In the Bitcoin chapter, 
we learned that Bitcoins are actually present in the form of 
transactions that have an owner (owner’s public key, 20-byte 
address) and a value. The owner can spend the transaction if 
they have the valid private key for the transaction they are 
trying to spend. Bitcoin therefore is a state transition system 
where “state” refers to the collection of all UTXOs. Every time a 
block is mined, a state change happens because each block 
contains a bunch of transactions where each transaction 
cosumes UTXO(s) and produces UTXO(s). Note here that the 
state is not encoded inside the blocks. So, there is no notion of 
an account balance as such in Bitcoin’s design. Ethereum on 
the other hand is stateful, and its basic unit is the account. 
Each account has a state associated with it and also has a 20- 
byte (160 bits) address through which it gets identified and 


referenced. The purpose of blockchain in Ethereum is to keep 
track of the state changes. There are broadly two types of 
Ethereum accounts: 


e Externally Owned Accounts (EOAs) : These accounts 


are also known as “simple accounts” that are usually 
owned by users or devices who control these accounts 
using Private Keys. The EOAs can send transactions to 
other EOAs or Contract Accounts by signing with a private 
key. The transaction between two EOAs is usually to 
transfer any form of value. On the other hand, when an 
EOA makes a transaction to a Contract Account, the 
purpose is to activate the “code” inside the Contract 
Account. 


e Contract Accounts: These are controlled only by the 


code contained in them. This code inside the Contract 
Accounts is referred to as “smart contracts .” They are 
usually activated when a transaction is sent to the Contract 
Account by the EOAs or by other Contract Accounts. Even 
though the Contract Accounts are capable of executing 
complex business logics through the code they contain, 
they can’t initiate new transactions on their own and 
always depend on the EOAs. All they can do is respond to 
other transactions (obviously by making transactions) as 
per the logic coded in their “code.” 


Take a look at the following three scenarios (Figures 4-3 to 
4-5) to get a better understanding on the communication 
between the EOAs and Contract Accounts. 

EOA to EOA transaction: 


Externally Owned 
Account 





Externally Owned * 


. ee = 
Account oD ae \ I 
Né y oo 

— 





Figure 4-3 EQOA to EOA transaction 


EOA to Contract Account Transaction: 


ml 
Contract i= 
Account 





Externally Owned © 
Account 





Figure 4-4 EQOA to Contract Account transaction 


EOA to Contract Account to other Contract Account 
transaction: 


Contract 
Account 






~™> Contract 
Y=! Account 
[ 


Externally Owned 
Account 


Figure 4-5 EQOA to Contract Account to Contract Account 
transaction 


Just so the previous representations are not confusing, 
please be aware that the Contract Accounts are internal and the 
communications between them, too. Unlike EOA accounts 
where EOAs make a transaction that gets injected in the 
blockchain, Contract Accounts and the transactions between 
them are internal phenomena. 


Advantages of UTXOs 


We must understand that Bitcoin’s design perspective was to 
maintain anonymity to an extent possible. When we compare it 
with Ethereum, the following advantages of UTXOs seem to 
have a lot of significance: 


¢ Better privacy: In Bitcoins, it is advisible to use a new 


address while receiving transactions, which helps reinforce 
anonymity. Even with sophisticated statistical or machine 


learning techniques, it is difficult to link the accounts 
together, though not impossible. 


¢ Potentially more scalable: The discussion pertaining 


to scalability is usually very subjective and depends on the 
context, use case at hand, and many other factors. The 
intention here is to just mention UTXO’s inherent 
potential to scale. It is very easy to execute the transactions 
in parallel. Also, when an owner or other nodes 
maintaining the Merkle proof of ownership data for some 
coins lose this data, only the owner is impacted. On the 
contrary, when Merkle tree data for some account is lost, 
then any operation on that account would not be feasible, 
even sending to it. 


Advantages of Accounts 


Even though Ethereum in a way is an extention to Bitcoin, it is 
imagined with a whole new design with its own set of pros— 
cons tradeoff. Let us take a look at the following advantages of 
Ethereum accounts compared with Bitcoin design: 


¢ Significant space saving: In Bitcoins, when multiple 


transactions are clubbed together to make one transaction 
(e.g., if you have to make a 5BTC transaction and you 
never received one transaction with at least 5BTC that you 
could use in this case, then you have to bundle multiple 
transactions so the total exceeds 5BTC), that many 
references to those individual transactions must be made. 
Also, all those transactions must have different addresses, 
so as many transactions, that many addresses also! In 
Ethereum accounts, however, just one reference to an 
account is good enough. Even though Ethereum uses 
Merkle Patricia tree (MPT) , which is a bit more space 
intensive than Merkle tree, you end up saving a significant 
amount of space for complex transactions. 


e Simple to code: Along with UTXOs and scripts that are 


not Turing-complete, it is difficult to design complex 
systems. UTXOs can either be spent or unspent; there is 


no other state possible in between. Which makes it 
difficult to code up complex business logics. Even if the 
scripts are empowered to do more, it gets more 
complicated as compared with just using accounts. Since 
the objective of Ethereum is to go beyond cryptocurrency 
and accommodate different kinds of use cases (through 
DApps), an accounts-based system is almost inevitable. 


¢ Lightweight client reference: Unlike Bitcoin clients, 


Ethereum client applications can easily and quickly access 
all the data related to an account by scanning down the 
state tree in a specific direction. In the UTXO model, there 
are usually multiple references to multiple transactions 
associated to any specific transaction under consideration. 


Account State 


We learned that every account has a state associated with it. 
We also looked at the two kinds of accounts that exist with 
Ethereum, one is a Contract Account and the other is an 
Externally Owned Account or EOA. Regardless of the account 
type, they are tracked by the “stateRoot” Merkle root in the 
block header and may appear as shown in Figure 4-6. 


Block 202 


~ 





Black Header 
(__ Nurser} gaslirvit || gasUsad mikash | 


staleRool [IransactionsRoot [ReceiptsRoot] 





(Suge) 


a se ea 


—— —_—__ ” 
Nonce || Balance || CodeHash 
oe 





saawodamae” \, 


I 
os iy | 
\ 


‘ 
' 
! 
' 
' 
' 
' mT 
Ta. IV oes iy 
ss ee 
rat 
; ~~ 


Sm ee ee ee ee ee a ee 


Figure 4-6 Zooming in to account state representation 


As you can see in the figure, irrespective of whether the 
account is an EOA or or a Contract Account, it has the 
following four components: 


¢ Account balance: Total “Ether” balance in the account. 


More precisely, number of Wei owned by the address 
(1ETH = 10!° Wei) 


e CodeHash: This is the hash of the “code.” Every Contract 


Account has “code” in it that gets executed on the EVM. 
The hash of this code is stored in this CodeHash field. For 
the EOA accounts, however, there is no “code,” so the 
CodeHash field contains the hash of empty string. 


e StorageRoot: It is the 256-bit root hash of Merkle tree 


that encodes the storage contents of an account. The MPT 
encodes the hash of the storage content. Keeping the root 
hash of this tree in the StorageRoot field helps track the 
content of an account and also helps ensure its integrity. 


e Nonce: It is a counter that ensures each transaction is 


processed only once. For EOAs, this number represents 
the number of transactions from the account’s address. 
For Contract Accounts, it represents the number of 
contracts created by this account. 


So, it is the “state” trie that is responsible to keep track of 
the state changes of Ethereum blockchain. However, what is a 
bit tricky is that the state is not directly stored in each block, 
rather in the form of Recursive Length Prefix (RLP)-encoded 
state data in MPT at every Ethereum node. So, to maintain the 
global state, the Ethereum blockchain includes “state roots” in 
each and every block that store the root hash of the hash tree 
(Merkle root) representing the system state at the time the 
block was created. 

As per the Ethereum Yellow Paper, the “World State” is a 
mapping between addresses (160-bit identifiers) and account 
states. So, the World State has the information of all the 


accounts in blockchain, but is not stored in each block. Each 
block only modifies parts of the state. In a way, the World State 
is generated processing each block since the genesis block. 
Certain Ethereum nodes can choose to maintain all historical 
states by keeping all the historical transactions, that is, state 
transitions and their outputs. This allows clients to query the 
state of the blockchain at any time, even for the historic ones, 
without having to recalculate everything from the beginning. 
Retrieving the state information is similar to an aggregate 
query in SQL where data is readily available; just aggregation is 
required. So, old state data can easily be discarded (this is 
known as “pruning”) because they can be computed back when 
required. Well, the state data by design is implicit dada, which 
means state information should only be calculated. 


TRIE USAGE 


We learned the three types of tries that have their roots in the 
block header. These roots are basically the pointers to those 
three tries. Though we looked at the one-liner explanations of 
these tries in previous sections, let us just revisit them with a 
slightly different choice of words 


e State trie: It represents the entire state (the global state) 
after accessing the block. 


e Transaction trie: It represents all the transactions in a 


block keyed by index (i.e., key:o for the first transaction to 
execute, key:1 for the second transaction, etc.). Recollect 
the MPT fundamentals we covered earlier and try to 
correlate. 


e Receipt trie: It represents the "receipts" corresponding to 


each transaction. A receipt for a transaction is an RLP- 
encoded data structure as shown following: 


[»medstare,, gas used, ‘logbitoom,, kogs | 


Let’s now dig deeper into the Receipt trie as we havn’t 
covered the basics yet on this. Take a look at all the fields in the 


Receipt trie’s RLP-encoded data structure and follow through 
the following descriptions for those fields: 


e medstate: It is the State trie root after processing the 


transaction. A successful transaction updates the 
Ethereum state. 


e gas_used: It is the total amount of gas used for processing 
the transaction. 


e logs: It is a list of items of the form- 
[address, [topic1, topic2...], data] 


e These list items are produced by the LOGo, LOG1... 


opcodes during the execution of the transaction. The 
“address” field is the address of the contract that produced 
the log, the “topic” fields are up to four 32-byte values, and 
the “data” field is an arbitrarily sized byte array. 


¢ Logbloom: It is a Bloom filter made up of the addresses 


and topics of all logs in the transaction. This is different 
from the one present in the block header. 


MERKLE PATRICIA TREE 


In Ethereum, the accounts are mapped with their respective 
states. The mapping between all the Ethereum accounts, 
including EOAs and Contract Accounts with their states, is 
collectively referred to as World States. To store this mapping 
data, the datastructure used in Ethereum is the MPT. So, MPT 
is the principal data structure used in Ethereum which is 
otherwise known as Merkle Patricia trie. We learned about the 
Merkle trees in the Bitcoin chapter, which already takes us half 
way through in understanding MPT. MPT is actually derived by 
taking elements from both Merkle tree and Patricia tree. 
Recollect from the Bitcoin chapter that Merkle trees are the 
binary hash trees where the leaf nodes contain the hash of the 
data blocks and every nonleaf node contains the hashes of their 
child nodes. When such a data structure is implemented, it 
becomes easy to check if a certain transaction was a part of a 


block. Only by using very little information from the entire 
block, that is, by using just the Merkle branch instead of the 
entire tree, providing proof of membership was quite easy. 
Merkle trees facilitate efficient and secure verification of the 
contents in decentralized systems. Instead of downloading 
every transaction and every block, the light clients can only 
download the chain of block headers, that is, 80-byte chunks of 
data for each block that contain only five things: hash of the 
previous block header, timestamp, mining difficulty, nonce 
value that satisfied PoW, and the root hash of the Merkle tree 
containing all the transactions for that block. While it is quite 
useful and interesting, note here that apart from validating the 
proof of membership for a transaction in a block, there is 
nothing much you could do. One particular limitation is that no 
information can be proved about the current state (e.g., total 
digital asset holdings, name registrations, status of financial 
contracts). Even to check how many Bitcoins you hold, quite a 
lot of querying and validating is involved. 

Patricia trees on the other hand are a form of Radix trees. 
The name PATRICIA stands for “Practical Algorithm to 
Retrieve Information Coded In Alphanumeric.” A Patricia tree 
facilitates efficient insert/delete operations. The key-value 
lookups in the Patricia tree are very efficient. Keys are always 
encoded in the path. So, “key” is the path that you take from 
the root till the leaf node where the “value” is stored. Keys are 
usually the strings that help descend down the path where each 
character indicates which child node to follow to reach the leaf 
node and find the value stored in it. 

So, the MPTs provide a cryptographically authenticated 
data structure used to store all (key, value) bindings in 
Ethereum. They are fully deterministic, meaning that a Patricia 
tree with the same (key, value) bindings will surely be the same 
down to the last byte. The insert, lookup, and delete operations 
are quite efficient with O(log(n)) complexity. Due to the Merkle 
part in MPT, hash of a node is used as the pointer to the node 
and the MPT is constructed accordingly, where 

Key == SHA3(RLP(value)) 

While the Merkle part provides a tamperproof and 
deterministic tree structure, the Patricia part provides an 


efficient information retrieval feature. So, if you notice 
carefully, the root node in MPT becomes a cryptographic 
fingerprint of the entire data structure. In the Ethereum P2P 
network, when transactions are broadcast over the wire, they 
are assembled by every mining node that received them. The 
nodes then form a Tree (a.k.a. trie) and compute the root hash 
to include in the Block header. While the transactions are 
stored locally in the tree, they are sent to other nodes or clients 
after they are serialized to lists. The receiving parties have to 
deserialize them back to form the transaction tree to verify 
against the root hash. Also note that in Ethereum, MPTs are a 
little modified for better fitment with Ethereum 
implementation. Instead of binary, hexadecimal is used—X 
characters from a 16 character “alphabet.” Hence nodes in the 
tree or trie have 16 child nodes (the 16 character hex alphabet) 
and a maximum depth of X. Just to let you know, a hex 
character is referred to as a “nibble” in many places. 

The basic idea of an MPT in Ethereum is that for a single 
operation, it will only modify the minimum amount of nodes to 
recalculate the root hash. This way the storage and 
complexities are kept minimal. 


RLP ENCODING 


You must have noticed that we mentioned RLP encoding in 
previous sections. We will give you a heads-up on what it is all 
about in this section. RLP stands for Recursive Length Prefix. It 
is a Serialization method used in Ethereum for blocks, 
transactions, and wire protocol messages while sending data 
over the wire and also for account state data while saving the 
state in Patricia tree. In general, when complex data structures 
need to be stored or transmitted and then get reconstructed at 
the receiving end for processing, object serialization is a good 
practice. RLP in that sense is similar to JSON and XML, but 
RLP is believed to be more minimalistic, space efficient, simple 
to implement, and guarantees absolute byte-perfect 
consistency. This is why RLP was chosen to be the main 
serialization technique for Ethereum. Its sole purpose is to 
store nested arrays of raw bytes. It does not try to define any 


specific data types either, such as Booleans, floats, doubles, 
integers, etc., and is only designed to store structure in the 
form of nested arrays. Key/value maps are not explicitly 
supported by RLP. So, it is advisible to represent such maps as 
[{k1, v1], [k2, v2], ...], where k1, k2... are in lexicographic order 
(sorted using the standard ordering for strings). Alternatively, 
use the higher-level Patricia tree encoding that has an inherent 
RLP encoding scheme. 

Please keep in mind that RLP is used only to encode the 
structure of the data and is completely unaware of the type of 
object being encoded. While it helps reduce the size of the 
encoding array of raw bytes, the decoding end must be aware of 
the type of object it is trying to decode. 


ETHEREUM TRANSACTION AND 
MESSAGE STRUCTURE 


In the previous section, we looked at the block structure and 
the different fields in the block’s header. For a transaction to be 
qualified by the miners or Ethereum nodes, it has to have a 
standardized structure. A typical Ethereum transaction (e.g., 
what you pass through sendRawTransaction()that we will see 
later in this book) consists of the following fields: 


e nonce: It is an integer, just a counter equal to the number 


of transactions sent by the sender account, 1.e., transaction 
sequence number. 


¢ gasPrice: Price you are willing to pay in terms of the 
number of Wei to be paid per unit of gas 


e gasLimit: The maximum amount of gas that should be 


used in executing this transaction, which also limits the 
maximum number of computational steps the transaction 
execution is allowed to take 


¢ To: Recipient’s 160-bits address or Contract’s address. For 


the transaction that is used to create a contract (it means 
contract’s address does not exist yet), it is kept empty. 


e Value: Total Ether (number of Wei) to be transferred to 
the recipient by the transaction sender 


e V,1r, s: values corresponding to the ECDSA signature of the 
transaction; also represent the sender of this transaction 


e init: This is not really an optional field, only used with 


transactions used for creating contracts. This field can 
contain an unlimited size byte array specifying the EVM- 
code for the account initialisation procedure. 

The opcode “init” is used only once for initializing the 
new Contract Account and gets discarded after that. It 
returns the body of the account code after associating it 
with the Contract Account. Keep in mind that this 
association is a permanent phenomenon and never 
changes. 


¢ Data: An optional field that can contain a message to be 


sent to a contract or simple account. It has no special 
function as such by default, but the EVM has an opcode — 
using which, a contract can access this data field and 
perform necessary computations and place them in 
storage. 


Note carefully that the aforementioned fields are supplied 
in the order specified and are all RLP encoded, except for the 
field names. So, an Ethereum transaction actually means a 
signed data package with these fields. The gasPrice and 
gasLimit fields are important to prevent denial of service 
attack. In order to prevent accidental or deliberate attempts of 
infinite loops or other computational wastage in code, each 
transaction is required to set a limit on how many 
computational steps for code execution it can use. 

Ethereum transactions are actually the "state transition 
functions" because a successful transaction changes the state. 
Also, the result of these transactions can be stored, as we 
already looked at in the “Account State” section previously. 

Ethereum messages on the other hand are like 
transactions, but are triggered only by Contract Accounts and 
not by EOAs. Also, messages are only meant to be between the 


Contract Accounts, due to which they are also referred to as 
"internal transactions." So, contracts have the ability to send 
messages to other contracts. 

Typically, a message is produced when a contract, while 
executing its code, encounters the “CALL” or 
“DELEGATECALL” opcodes. So, messages are more like 
function calls that exist in the Ethereum execution 
environment. It is also important to note that messages are 
always raw and never serialized or deserialized. A message 
contains the following fields: 


e Sender: The sender of the message as an implicit option 
e Recipient: The recipient contract address to send to 


e Value: The amount of Wei to transfer to the contract 
address along with the message 


¢ Data: Optional field, but can contain input data for the 
recipient contract provided by the sender 


¢ gasLimit: The value that limits the maximum amount of 


gas the code execution can consume when triggered by the 
message. It is also termed “startGas.” 


We looked at the transaction and messages. An Ethereum 
transaction can be from an EOA to an EOA, or from an EOA to 
a Contract Account. There exists another situation where a 
transaction from an EOA is initiated to create a Contract 
Account (recollect the “init” field that we just covered). Now, 
just think about what exactly a transaction is? It is definitely 
the bridge between the external world and the Ethereum 
blockchain, but what more? If you zoom in to a transaction, 
you will see that it is an instruction, initiated by the EOA by 
signing it, which gets serialized and submitted to the 
blockchain. Take a look at Figure 4-7. 





¥ | 
| ata Z ) , 
fs oes 1 —_ itl ’ ’ PY ' 5 4 
i ot Y 5} P —_— , ; — re ee A nt 4 4 f : . 
— ‘Rio eae erialization iii y Lot 
| EOA ‘ , a J 
fr-O| } , 
y 


‘, Digital Sig Py . 
Mii a Ethereum Blockchain 


Figure 4-7 Transaction initiation—-zoomed in 


Now what happens after a transaction is injected into the 
blockchain? Well, it starts executing at every Ethereum node if 
found valid. While this transaction is undergoing execution, 
Ethereum is designed to keep tabs on the “substate” to track 
the flow of execution. This is because, if a transaction does not 
complete due to “running out of gas,” then the entire execution 
so far has to be reverted. Also, information collected during the 
execution is required immediately after the transaction 
completion. So, the substate contains the following: 


¢ Self-destruct set: a set of accounts (if any) that will be 
discarded after the transaction completion 


¢ Log series: archived and indexable “checkpoints” of the 
EVM’s code execution to track the contract calls 


e Refund balance: It is the amount to be refunded to the 


sender account post transaction execution. Storage in 
Ethereum is quite expensive, so there is an SSTORE 
instruction in Ethereum that is used as a refund counter. 
The refund counter starts at zero (no refund state) and gets 
incremented every time the transaction or contract deletes 
something from the storage. Please note that this refund 
amount is different and in addition to the unused gas that 
gets refunded to the sender. 


In the earlier versions of Ethereum, whether a transaction 
or contract executes successfully or fails in between, the entire 
gas used to get consumed. This was not always making sense. 
If an execution stopped due to some authorization/permission 
issue or any other issue, the execution would stop and the 
remaining gas would still be consumed. The last Byzantium 
update introduced the “revert” code like an exception handling. 
In case a contract has to stop, “revert” could be used to revert 
state changes, return a reason for failure, and credit the 
remaining gas back to the sender. Post successful execution of 
the transactions or contracts, a state transition happens that we 
will dive deeper into in the followiung section. 

Just the way we looked at blockchaininfo to see a live 
Bitcoin transaction, if you take a look at 
https://etherscan. io for Ethereum you will find the 
following information: 


Transaction Information 


TxHash: 
TxReceipt Stalus: 
Block Height 
TimeStamp: 

From: 

To: 

Value 

Gas Limit: 

Gas Used By xn: 
Gas Price: 

Actual Tx CosFee 
Cumulative Ges Used; 
Nonce: 


Input Data: 


Ox67aach4c856be 1 ebe9a9e94a17894e77b16e42b2d11bdbc59alba90 13066 1a 
Success 

5017471 (3 block confirmations) 

1 min ago (Feb-02-2018 01:24:36 PM +UTC) 
Oxd307aa93e9bfhe5e757bSaetalhO706 1edo1dabt 

Contract Ox7b74e19124a9ca922614 1a2ed192130Ic279112 @ 
3.21373401 Ether ($2,950.75) 

23018 

23018 

0,000000055 Ether (55 Gwei) 

0,00126599 Ether ($1.16) 

986295 


1 


Ox 


ETHEREUM STATE TRANSACTION 
FUNCTION 


In the previous section, we learned about Ethereum 
transactions and messages. We are now aware that a state 
transition happens whenever a transaction is through— 
successfully. So, the state transition function in Ethereum is: 


APPLY (S,Tx) -—> S'! \\where S is old state 
and S' is the new state 


Take a look at Figure 4-8. 


State State' 
- 1024 eth Transaction 1014 eth 


bb75a980: From: 
- 5202 eth 


it !contract sterage(tx.data[O}): To 
Contract. storageltx.dataO]) = tx.datali) 


bb75a980; 

14c5f8ba +5212 eth 
; It topeitract, storageltx.datal Ol 
bb75a980 contract. storageltx data{O]] = pe datal2} 


{0, 235235, 0, ALICE en 4 (0, 235235, CHARLIE, ALICE 


892bf926: 
-Oeth 
Sendte.walue | 3, contract. moragelON 


2, 
senditx.valve / 3, contract storage(0}! CHARLIE 
senditx.value / 3, contract storagef1)) Live Sarit waluw / 3, contract.sterage| 3) 
senditx value / 3, Contract storage(?}) 19 


i sendtcvalue / 3, contract.storage|2}) 
{ALICE, BOB, CHARLIE } penne (ALICE, BOB, CHARLIE ] 





Figure 4-8 Ethereum state transition function 


So, the state transition function when Tx is applied to state 
S to result in changed state S’ can be defined as follows: 


e Validate the transaction to see if it is well formed. 
e Has the right number of values 
e The signature is valid. 


e The nonce matches the nonce in the sender’s account. 
If any of preceding points is not valid, return an error. 
e Calculate the fee and settle the accounts. 
e Compute the transaction fee as gasLimit * gasPrice. 
e Determine the sending address from the signature. 


e Subtract the fee from the sender’s account balance 
and increment the sender’s nonce. 


If there is not enough balance to spend, return an 
error. 


e Initialize GAS = gasLimit, and take off a certain quantity 
of gas per byte to pay for the bytes as a transaction fee. 


e Transfer the transaction value (could be anything of value) 


from the sender’s account to the receiving account. Note 
here that the transaction could be for anything of some 
intrinsic value such as land, vehicle, ERC20 tokens, etc., 
but the gas Price has to be in Ether so that the miners 
would accept the transaction. If the receiving account does 
not yet exist, create it. 

If the receiving account is a contract and not an EOA, 
then run the contract’s code either to completion or until 
the execution runs out of gas. Note here that the contract 
code gets executed on every node’s EVM as part of the 
block validation process so that the block, hence the 
contract’s output post execution, becomes a part of the 
main blockchain. 


e Ifthe value transfer failed because the sender did not have 


enough money, or the code execution ran out of gas, revert 
all state changes (thanks to MPT implementation) except 
the payment of the fees, and add the fees to the miner’s 
account. 


e Otherwise, refund the fees for all remaining gas back to 


the sender, and send the fees paid already for gas 
consumed to the miner. 


GAS AND TRANSACTION COST 


Transactions on Ethereum run on “gas,” the fundamental unit 
of computation in Ethereum. Every transaction, whether to an 
EOA or to a contract, must have the gasLimit and gasPrice to 
compute the fee. This fee is paid to the miners to compensate 
them for their resource contributions and work they perform. 
Obviously, miners have the choice of including the transaction 
and collecting the fee, similar to that of Bitcoin. 

Usually, a computational step costs just one gas, but some 
of the compute- or storage-intensive operations cost more. For 


every byte of transaction data, around five gas is required. Take 
a look at these sample examples: adding two numbers (with 
EVM opcode ADD) requires approximately three gas; 
multiplying two numbers (with EVM opcode MUL) requires 
approximately five gas; calculating a hash (SHA3) requires 
around 30 gas (compute-intensive, you see). Storage cost is 
also computed in similar fashion, but quite expensive for good 
reasons. As per the design, a transaction can include an 
unlimited amount of data. It costs 68 gas per byte of nonzero 
transaction data. To store a 256-bit word in a “Contract,” 
approximately 20,000 gas is required. You could find more 
opcodes and their corresponding prices in the Ethereum yellow 
paper. The cost then would be to just multiply the gas required 
with the gasPrice. Unlike Bitcoin, Ethereum cost computation 
is more complex. It takes into account the costs of bandwidth, 
storage, and computation. Having such a fee computation 
mechanism prevents the Ethereum network from an attacker 
who might just want to inject an infinite loop for computation 
(leading to denial-of-service attacks) or consume more and 
more space by storing meaningless data. 

The total Ether a transaction would cost actually depends 
on the amount of gas consumed by the transaction, multiplied 
by the price of one unit of gas specified in the transaction by 
the transaction initiator. Miners on the other hand have a 
strategy for calculating the gas Price to charge, which should be 
the least amount the sender of a transaction must specify so 
that the transaction does not get rejected by the miner. So, how 
do you calculate the total cost of a transaction? Not the 
approximate one, but the actual cost? The total “Ether” cost of 
a transaction is based on two factors: gasUsed and gasPrice. 
Total cost = gasUsed * gasPrice. The gasUsed component is 
the total gas consumed while excuting the EVM opcodes for the 
instructions, and gasPrice is the one specified by the user. 

If the total amount of gas used by the computational steps 
(including the transaction, the message, and any submessages 
that may be triggered) is less than or equal to the gasLimit, 
then the transaction is processed by the miner. However, if the 
total gas exceeds the gasLimit, then all changes are reverted 
(though it is a valid transaction), except that the fee can still be 


collected by the miner. So, what happens to the excess gas? All 
the unused gas after transaction execution is reimbursed to the 
sender as Ether. Senders do not need to worry about 
overspending, as they are only charged for the gas consumed. 
This definitely means that it is important as well as safe to send 
transactions with a gas limit well above the estimates. It is also 
recommended not to pay very high gas Price and use the 
average gas price from https: //ethgasstation.info/. 

Let us go through each and every step when a transaction is 
made in an Ethereun network to build a concrete 
understanding of the flow: 


e Every transaction must define a “gasLimit” that it is 


willing to spend (gasLimit is also termed “startGas”), and 
the fee that it is willing to pay per unit of gas (gasPrice). 
At the start of execution, Ether worth of gasLimit * 
gasPrice is removed from the transaction sender’s 
account. Remember that this is not really the total cost of a 
transaction (should be a bit more than that in an ideal 
case). Only after the transaction, its actual cost is 
concluded (gasUsed * gasPrice) that’s adjusted from this 
(gasLimit * gasPrice), which was initially deducted from 
sender’s account and the balance amount is credited back 
to the sender. In the beginning of a transaction itself, the 
amount (gasLimit * gasPrice) is deducted because there 
could be a possibility that the sender could go bankrupt 
while the transaction they initiated is midway through. 


e All operations during transaction execution, including 
database reads and writes, messages, and every 
computational step taken by the E VM such as addition, 
subtraction, hash, etc. consume a certain quantity of gas 
that is predefined. 


e A normal transaction is one that executes successfully 
without exceeding the gasLimit specified. For such 
transactions, there should be some gas remaining, say, 
“gas_rem”. After a successful transaction execution, the 
transaction sender receives a refund of “gas_rem * 


gasPrice” and the miner of the block receives a reward of 
“(gasLimit - gas_rem) * gasPrice”. 


e Ifa transaction runs out of gas before successful 


completion, then all executions revert, but the transaction 
is nevertheless valid. In such situations, the only outcome 
of the transaction is that the entire amount “gasLimit * 
gasPrice” is allocated to the miner. 


e In the case of Contract Accounts, when a contract sends a 


message to the other contract for subexecution, it also has 
the option to set a gasLimit. This option is specifically 
intended for the subexecution arising out of that message, 
because there is a possibility that the called contract has an 
infinite loop. If the subexecution runs out of gas, then the 
subexecution is reverted, which protects against such 
infinite loops or deliberate attempts of DoS attacks. The 
gas is consumed anyway and allocated to the miner. Also 
note that when a message is triggered by a contract, only 
the instructions cost gas, but data in a message do not cost 
any gas. This is because the data from the parent contract 
need not be copied again, and could be just referrenced 
through a pointer. 


The first Ethereum release (Frontier) had a default gas 
Price of 0.05e12 WEI (i.e., smallest denomination of Ether). In 
the second Ethereum release (Homestead), default gas Price 
was reduced to 0.02e12 WEI. You must be wondering why gas 
and Ether are decoupled from each other and not a single unit 
of measurement, which would have made it much simpler. 
Well, it is deliberately designed this way because units of gas 
align well with computation units having a natural cost (e.g., 
cost per computation), while the price of Ether generally 
fluctuates as a result of market forces. 

We already know that every Ethereum node participating in 
the network runs the EVM as part of the block verification 
protocol. This means that all the nodes execute the same set of 
transactions and contracts (redundantly parallel, but essential 
for consensus). While this redundency naturally makes it 


expensive, there is an incentive not to use the blockchain for 
computation that can be done offchain (Game Theory!). 

Typically, 21,000 gas is charged for any transaction as a 
"pase fee" to cover the cost of an elliptic curve operation to 
compute the sender address from the signature, and also for 
the disk space of storing the transaction. There are ways to 
estimate gas requirements for transactions and contracts. 
Example: “estimateGas” is a Web3 function to estimate gas 
requirement for a given function. Also, to estimate the total 
cost, gas price oracle is a helper function in “geth” client and 
“web3.eth.getGasPrice” is a Web3 native function to find an 
approximate gas Price. Following is an example code that can 
be used in “Truffle”: 


Vel My Cont Gach. — 
ack iractswrequarce’ ./MyNest soi"), 


// getGasPrice returns the gas price in Wei 
MyContract.web3.eth.getGasPrice (function (error 
7p ee Sale 


var gasPrice = Number (result); 
console, logi("Current ‘gasPrice. as. "+ 
GasPraice. + wei) 


i Got pie Oo Mmerace rn abanee 
MyContract.deployed().then (function (instan 
ce) f{ 


// Retrieve gas estimation for the 
function giveAwayDividend() 

he aren 
instance.giveAwayDividend.estimateGas (1); 


Pie then(tunctroeni(resuiitj 4 
var gas = Number (result); 


console og (Total gas estimation =." 
see Chere arc ie saehas 


Console wlocnG total. Deancact Pomme ost 
ash imak vom aim Wet a Gas. = "gasPruce) 
wei"); 

eonusolewloge Veta = Theansacwron (Cost 
estimation in Ether = " + 
MyContract.web3.fromWei((gas * gasPrice), 
Lebhen s) 42 4 Erie pits 

})e 
ele 


Example code for transaction cost estimation 


While writing smart contracts in Solidity, many prefer to 
use “constant” functions to compute certain things offchain or 
just make an RPC query to your local blockchain. Since such 
constant functions do not change the blockchain state, they are 
in a way free of cost as they do not consume gas. If the constant 
functions are used inside of any transaction, then it is highly 
likely that gas expense would be required. 

Let us now learn about the block’s gas limit. Recollect that 
Bitcoin had a predefined limit of 1MB block size and Bitcoin 
cash had a 2MB block size. Miners would accumulate as many 
transactions as could fit in those blocks. Ethereum, however, 
has a very different way of limiting the block size. In Ethereum, 
the block size is controlled by the block gas limit. Different 
transactions have different gas limits; so, depending on the 
block gas limit, a certain number of transactions are clubbed 
together so that total transactions gas limit is less than the 
block gas limit. Different miners can have different sets of 
transactions that they are willing to put in a block. The block 
gas limit is dynamically calculated. The Ethereum protocol 
allows the miner of a block to adjust the block gas limit by a 
factor of 1/1024 (0.0976%) in either direction. Miners on the 
Ethereum network use a mining program, such as “ethminer.” 
The ethminer is an Ethereum GPU mining worker, which 
connects to either geth or Parity Ethereum client node. Both 
geth and Parity have options that miners can change. 


Ethereum Smart Contracts 


Unlike Bitcoin, which is just a cryptocurrency, Ethereum is so 
much more-thanks to the smart contracts. We got a glimpse of 
what a smart contract might be in the previous sections while 
learning about Contract Accounts. While we will get into the 
development aspects of smart contracts in the following 
chapters, we will have a detailed exploration of what they really 
are in this section. 

Let us start with why it is named so? Please be aware that 
there is nothing “smart” in a smart contract that is out-of-the- 
box. It is smart when you code smart logic into it, and it is the 
beauty of Ethereum that enables you to do so. Let us just 
summarize our learning so far on the Ethereum smart 
contracts: 


e Smart contracts reside inside the Ethereum blockchain. 
e They have their own account, hence address and balance. 


e They are capable of sending messages and receiving 
transactions. 


e They get activated when they receive a transaction, and 
can be deactivated as well. 


e Like other transactions, an execution fee and storage fee 
are applicable for them as well. 


All the code in Ethereum, including the smart contracts, is 
compiled to a low level, stack-based bytecode language, 
referred to as EVM code, that runs on EVM. The popular high- 
level languages used to write smart contracts are Solidity, 
Serpent, and LLL, where their respective compilers convert the 
high-level code into the EVM byte code. We looked at how 
contracts could be added into the blockchain by any external 
agent such as EOA. Since computation and storage in 
Ethereum are very expensive, it is advisible that the logic 
should be written in as simple and optimized fashion as 


possible. When a smart contract is deployed to the Ethereum 
blockchain network, it is possible for anyone to call the 
functions of the smart contract. The functions usually have 
security features coded up that prevent unauthorized access; 
nevertheless, attempts can be made though they won’t succeed. 
If you try to imagine a smart contract inside of a block in an 
Ethereum blockchain, it might appear as in Figure 4-9. 























Seem em mm Rm Re me Re ee eK 


; | + Nianee \ 
i ' 1763679 
Block 592 i ‘Reroute 
Blank ender Hi 7" 196.0701 Ether 
[new =i = fecsuieaye |mernive ay ; fa LSB PCS ATL VR OY oy ae 
devetuie f byt | ctteas | omowmy i 4 ar 
cra a a contract Account { Code 
stateRoot | TrensartionsReat |Recelptsfiont H fe om H éeitiens Teal online? 
‘ 1 = [Peeeinstoe] } Nove ' PY Nee hae ek 
Ps / : > ' wari onblie nee = 1; 
ot ; Saks Se [ Ralanee | ' 
I was / =p. H firvetion bivtk Davy) { 
i = ONS rl _ Covetash H OE isk 
7 fribsite 8  cisesaat 1; ‘ Mi ictl dam. 
ey I) 
a V i 4 
,% i iN 
puss ty 4 
- | ry ce Be RAE RS ge ee ae eT 
\ Block ' stl 





Smart Contract 





Figure 4-9 Ethereum smart contract with respect to blocks 


Let us now take an example of a voting application. A smart 
contract is written that has an address (Contract Account 
address) and is a part of some block in the blockchain, 
depending on when it was created. The voters can make 
transactions to that address (votes). The contract code is 
written such that it will increment the vote count with every 
transaction received and terminates itself after some time, 
publishing the voting result (Ethereum state change). Take a 
look at Figure 4-10 to have a diagramatic representation for a 
high-level understanding. 


Tx-3 (Vote) 
Tx-2 (Vote) Tx-4 (Vote) 


Tet (Vote? ~ Tx-5 (Vote 
Tx-1 {Vote} aie cme: 


Fortes Cont Newos Proving Mon) 
Weresee ime arere oA Tosetoy 
x NN me ’ ‘ ain 


ene fe 
¢ \ 


/ \ 
| —_ —_ i —_ I 
| aa he ay “ 1 
1 = ——) |t =I 
| VoteCount() i 
Tl is be os I 
| + + =~, wie —- 
4 von Smart Contract : a | 
OE ee eed é 
r l 
| Voting | 
\ Application / State Change with 


on an ap ee oe oe 


ST “Total Vote Count 


Previous Block 





Transactkom 





‘ 
Mock-1 ‘ Block-2 
‘ : 


‘ - 
“=a 


F Block-3 Block-4 Block-1265 


Figure 4-10 An application with smart contract logic 


CONTRACT CREATION 


Recollect that we learned about the contract creation 
transaction, whose only purpose is to create a contract. It is a 
bit different kind of transaction compared with the other types. 
So, before the contract creation transaction is fired up to create 
a Contract Account, it must first initialize the four properties 
that all types of accounts have: 


e The “nonce” should be set to zero initially. 


e The “Account Balance” should be set with the value 
(amount of Ether) transferred by the sender, and the same 


amount must be deducted from the sender’s account. 


e The “StorageRoot” should be empty. 


e The contract’s “codeHash” should be set with the Keccak 
256-bit hash of an empty string. 


After initializing the account, the account can be created 
using the init code sent with the transaction that does the real 
work. There could be a whole bunch of actions defined in init 
code, and it’s execution can effect several events that are not 
internal to the execution state, such as: 


e The account’s ‘storage’ can be altered. 
e Further accounts can be created. 


e Further message calls can be triggered. 


Ethereum Virtual Machine and Code 


Execution 


Ethereum is a programmable blockchain that allows users to 
create their own operations of any arbitrary complexity 
through Turing-complete languages. The EVM is the execution 
engine of Ethereum that serves as the runtime environment for 
smart contracts. It is the primary innovation of Ethereum that 
makes it unique compared with other blockchain systems. It is 
the EVM on the basis of which the smart contract technology is 
supposed to get to the next level of innovation, and the game is 
on. EVM also plays a critical role in transaction execution, 
changing the state of Ethereum, and achieving consensus. The 
design goals of EVM are as follows: 


e Simplicity: The idea was to make EVM as simple as 
possible with the low-level constructs. This is why the 
number of low-level opcodes is kept to a minimum, and so 
are the data types to the extent that complex logics could 


still be written conveniently using these constructs. Total 
160 instructions, out of which 65 are logically distinct 


e Absolute determinism: Ensuring that the execution of 


instructions with the same set of inputs should produce 
the same set of outputs (deterministic!) helps maintain the 
integrity of the EVM without any ambiguity. Determinism 
along with the concept of “computational step” helps 
estimate gas expense with close approximation. 


e Space optimization: In decentralized systems, space saving 


is a biggest concern. This is why the EVM assembly is kept 
as compact as possible. 


e Tuned for native operations: EVM is tuned for some native 


operations such as the specific types of arithmatic 
operations used for cryptography (modular arithmatic), 
reading blocks or transaction data, interacting with 
“states,” etc. Another such example is: 256-bit (32 bytes) 
word length to store cryptographic hashes, where EVM 
operates on the same 256-bits integer. 


e Easy security: In a way, gas Price helps ensure that the 


EVM is nonexploitable. If there was no cost, attackers 
could just keep attacking the system in every possible way. 
While almost every operation on EVM requires some gas 
cost, it should be easy to come up with good gas cost 
model on EVM 


We learned that every participating node in the Ethereum 
network runs EVM locally, executes all transactions and smart 
contracts, and saves the final state locally. It is the EVM that 
writes code (smart contracts) and data to blockchain and 
executes instructions (opcodes) of transaction code and smart 
contract code written in a Turing-complete language. That is to 
say, EVM serves as a runtime environment (RTE) for Ethereum 
smart contracts and ensures secured execution of the code. 
Obviously, when the code or transactions are validated through 
their respective digital signatures, they are executed on EVM. 


So, only after successful execution of instructions through 
EVM, the Ethereum state can change. 

Unless one connects the EVM with the rest of the network 
to participate in the P2P network, it can be isolated from the 
main network. In an isolated and sandboxed environment, 
EVM could be used to test smart contracts. It facilitates in 
building better, robust, and production ready-smart contracts. 

To build a better understanding of how smart contracts 
work leveraging the EVM, we should understand how data is 
organized, stored, and manipulated in any EVM language such 
as Solidity, Serpent, and ones that might come in future. You 
might want to consider EVM more like a database engine. 
Though we will not get deeper into the Solidity programming 
fundamentals, we will see how it interacts with the EVM in this 
section. Take a look at Figure 4-11. 


e cs A * a 
f — Write a Smart Contract in any high level language such as 
Solidity, Serpant etc. 














/ | 
| Solidity Smart_- ! 
— Contract | 
SS _ e | 
Pa | 
c | ( 
com \  —) RR8Mi40 OO 21 bd 00 
~ | t ae 83 
y | Compile the Smart Contract into EVM Bytecode erssule $0 68 fe o> ~~ 
< ee ) eeami7e gw ee 11 | 
| Compile ByteCode = _ ! 
| ——_———— | 
a ! 
ca | 
es PE FAV Gai al Lae nT ET eS UN CES LCT, se f 
| NS Gereoes ~| Send a Contract Creation Transaction to the network with | °° Sy", } 
GEER: ~ the EVM Byte Code mie : 
SD Sooo eae a Be adda | 
gi \ 
5 A contract account is created for the ‘Smart Contract’ just deployed ! 
o 
- | | 
5 | The Contract Account is assigned an address, balance, nonce, and the Byte Code ! 
a 7” i a a a a a La cs | 
| | 
3 7 Invoke the methods inside Smart Contract through transactions ! 


Figure 4-11 Smart contract deployment and usage 


Let us now understand memory management with EVM. 
Take a look at the following three strategies that the EVM 


follows: 


e Storage (persistent) 


Key-value storage mapping (i.e., 256- bit to 256-bit 
word mapping). This means both keys and values are 
256 bits (.e., 32 bytes). 


From within a contract, it is not possible to enumarate 
storage. 


At any given point in time, the state of the contract 
can be determined by the contract level variables 
called “state variables” that are always in “storage,” 
and it cannot be updated at runtime. This means that 
the structure of the storage is set only once during the 
contract creation and cannot be altered. However, 
their content can be changed with “sendTransaction” 
calls. 


Read/update of storage is an expensive affair. 


Contracts cannot read, write, or update to any other 
storage that is not owned by them. 


SSTORE/SLOAD are the frequently used instructions. 
Example: SSTORE instruction pops the top two items 
off the stack, considers the first item as the index, and 
inserts the second item into the contract’s storage at 
that index location. 


e Memory (volatile) 


It is similar to RAM requirement in a general 


computer system for any code or application 
execution and used to store temporary values. 


A contract can use any amount of memory during 
execution by paying for it, and that memory space is 


cleaned up after execution completes. The outputs 
during execution could be pushed to the persistent 
storage that can be reused in future executions. 


e Memory is actually a byte-array that is contiguous, 


unlike storage. It is allocated in 256-bit (32 bytes) 
chunks. 


e Starts with no space and takes on space in the units of 
32-byte chunks. 


e Without the “memory” keyword, smart contract 


languages such as Solidity are expected to declare 
variables in storage for persistence. 


¢ Memory cannot be used at the smart contract level; it 
can only be used in methods. 


e Function arguments are almost always in memory. 


e MSTORE/MLOAD are the frequently used 
instructions. 


e Stack 


e EVM is stack based, hence follows LIFO (Last-in, 


First-Out), where stack is used to perform 
computations. 


e Stack entries are also 256-bit words used to mimic 


256-bit pseudo registers. They are used to hold local 
variables of “value” type and to pass parameters to 
instructions or functions, memory operations, and 
other algorithmic operations. 


e Allows a maximum of 1024 element and is almost free 
to use. 


e Most of the stack operations are limited to top of the 


stacks. The execution is pretty similar to the way 
Bitcoin script was executed. 


When EVM is running and the byte code is injected with a 
transaction for execution, its full computational state can be 
defined by the following tuple: [block_state, transaction, 
message, code, memory, stack, pc, gas]. 

You must be able to make out all these fields now. They 
have the three kinds of memory we discussed (the block_state 
field represents the global state and is for storage). The PC field 
is like a pointer for an instruction in the stack to be executed. 

In Ethereum, an Application Binary Interface (ABI) is an 
abstraction that is not part of the core Ethereum protocol, but 
is used to access the byte code in a smart contract as standard 
practice. Though it is possible for anyone to define their own 
ABI for their contracts and comply with it to get the desired 
output, it is easier to use Solidity. The purpose of ABI is as 
follows: 


e How and what functions inside smart contracts should be 
called 


¢ The Binary format in which information should be passed 
to smart contract functions as inputs 


e The Binary format in which you expect the output of 
function execution after calling that function 
With ABI specifications, it is easy (though may not be 


necessary) for two programs written in two different languages 
to interact with each other. 








Ethereum Ecosystem 


We learned the core components to understand how Ethereum 
really works. There are some inherent limitations to Ethereum 
such as the following: 


e The EVM is slow; it is not advisible to be used for large 
computations. 


e Computation and storage on the blockchain is expensive; it 
is advisible to use offchain computations and use 


IPFS/Swarm for storage. 


e Scalability is an issue; there are different techniques to 


address it, but they are subjective to the business case you 
are dealing with. 


e Private blockchains are more likely to flourish. 


Now let us take a look at the Ethereum tech stack to 
understand at a high-level the Ethereum ecosystem. 


SWARM 


It is not only a distributed storage platform of static files in a 
P2P fashion, but also a distribution service. Swarm ensures 
adequate decentralization and redundant storage of 
Ethereum’s blockchain data, DApp code, etc. Unlike WWW, the 
uploads to Swarm are not centralized to one web server. It is 
designed to have zero downtime and is DDOS resistant and 
fault tolerant. 


WHISPER 


It is acommunications protocol that allows DApps to 
communicate with each other. It provides a distributed yet 
private messaging functionality. It supports singlecast, 
multicast, and broadcast of messages. 


DAPP 


A DApp usually has two components, a front-end and a back- 
end component. The back-end code runs on the actual 
blockchain coded up in smart contracts. The front-end code 
and user interfaces could be written in any language such as 
HTML, CSS, and JavaScript, as long as it can make calls to its 
back end. Also, the front end can be hosted in a decentralized 
storage like SWARM or IPFS instead of a centralized web 
server. 

User interface components will be cached on some kind of 
decentralized BitTorrent-like cloud and pulled in by the DApp 
Browser as needed. Like any App store, it is possible to browse 


the distributed DApps catalog in the browser. The end user can 
install any DApp of interest in their browser. 


DEVELOPMENT COMPONENTS 


There are so many development components used to develop 
decentralized applications on Ethereum and interact with 
them. Following are a few popular ones, but there are many 
more such for you to explore. We will just take a look at what 
they are and dive deeper into these topics in the following 
chapters. 


Web3.§ 


This is a very important element in developing DApps. 


Truffle 


Truffle provides the building blocks to create, compile, deploy, 
and test blockchain applications. 


Mist Wallet 


We learned in the previous chapters that a wallet is required to 
interact with blockchain applications and the same applies to 
Ethereum as well. To store, accept, and send Ether, the users 
need a wallet. Mist Wallet is a UI-based solution that can be 
used to connect to the Ethereum blockchain. Using Mist wallet, 
one can create accounts, design and deploy contracts, transfer 
Ether across accounts, and view transaction details. 

Internally, Mist is dependent on the “geth” client (i.e., 
GoEthereum Client) to perform all the operations seamlessly. 


Summary 


In this chapter, we covered the core components of Ethereum 
blockchain and understood the design considerations. We were 
able to differentiate Ethereum design with that of the Bitcoin 
blockchain and understood how Ethereum blockchain 


facilitates development of different use cases on a single 
platform. We took a deep dive into the smart contracts and how 
the Ethereum Virtual Machine (EVM) executes it in a 
decentralized fashion. 

We will explore more into the development aspect of 
blockchain in general in Chapter 5 and then build a solid 
understanding of Ethereum development in Chapter 6. 


References 


Ethereum White Paper 

https://github.com/ethereum/wiki/wiki/White- 
Eopet. 

Ethereum Yellow Paper 

https://ethereum.github.io/yellowpaper/paper 
soa: 

How Ethereum Works 

https://medium.com/@preethikasireddy/how- 
does-ethereum-work-anyway-22d1d£506369. 

Patricia Tree 

https: //ol acm.org/ citation, cim? 1d—s21431 . 

Merkling in Ethereum 

https://blog.ethereum.org/2015/11/15/merkling-in- 
ethereum/. 

Gas and Transactions in Ethereum 

https fethdocs: org/en/ latest/ cont racts=and-— 
Lransactions/ account—types—cas—and— 
Eransacri ons. Html. 

Technical Introduction to Events and Logs in 
Ethereum 

https://media.consensys.net/technical- 
introduction-to-events-and-logs-in-ethereum- 
a0Q74de65ddole. 

Ethereum Internals 

https://github,com/ comacio/ porosity/wiki/ ech 
ereum-Internals. 


© Bikramaditya Singhal, Gautam Dhameja, Priyansu Sekhar Panda 2018 
Bikramaditya Singhal, Gautam Dhameja and Priyansu Sekhar Panda, Beginning 
Blockchain, https://doi.org/10.1007/978-1-4842-3444-0_5 


5. Blockchain Application 
Development 


Bikramaditya Singhal: , Gautam Dhameja’ 
and Priyansu Sekhar Panda‘ 


(1) Bangalore, Karnataka, India 
(2) Berlin, Berlin, Germany 


In the previous chapters we went into theoretical details about 
what blockchain is and how the Bitcoin and Ethereum 
blockchains work. We also looked at the different 
cryptographic and mathematical algorithms, theorems, and 
proofs that go into making the blockchain technology. 

In this chapter, we will start with how blockchain 
applications are different than the conventional applications, 
and then we will dive into how to build applications on 
blockchains. We will also look at setting up the necessary 
infrastructure needed to start developing decentralized 
applications. 


Decentralized Applications 


The popularity of blockchain technology is mostly driven by the 
fact that it can potentially solve various real-world problems 
because it provides more transparency and security (tamper- 


proof) than conventional technologies. There are a lot of 
blockchain use cases identified by several startups and 
community members aimed at solving these problems. To 
implement these use cases, we create applications that work on 
top of blockchains. In general, applications that interact with 
blockchains are referred to as “decentralized applications” or, 
in short, just DApps or dApps. 

To understand DApps better, let’s first revisit what a 
blockchain is. A blockchain or a distributed ledger is basically a 
special kind of database where the data is not stored at a 
centralized server, but it is copied at all the participating nodes 
in the network. Also, the data on blockchains is 
cryptographically signed, which proves the identity of the entity 
who wrote that data on the blockchain. To make use of this 
database to store and retrieve data, we create applications that 
are called DApps because these applications do not rely on a 
centralized database but on a blockchain-based decentralized 
data store. There is no single point of failure or control for 
these applications. 

Let’s take an example of a DApp. Let’s take a scenario of 
supply chain where several vendors and logistics partners are 
involved in the supply chain process of manufactured goods. To 
use blockchain technology for this supply chain use case, here’s 
what we would do: 


e We would need to set up blockchain nodes at each of these 


vendors so that they can participate in the consensus 
process on the data shared. 


e We would need an interface so that all the participants and 


users can store, retrieve, verify, and evaluate data on the 
blockchain. This interface would be used by the 
manufacturer to enter the information about the goods 
manufactured; by the logistics partner to enter 
information about the transfer of goods; by the 
warehousing vendor to verify if the goods manufactured 
and the goods transferred are in sync, etc., etc. This 
interface would be our supply chain DApp. 


Another example of a DApp would be a voting system based 
on blockchains. Using blockchain for voting, we would be able 
to make the whole process much more transparent and secure 
because each vote would be cryptographically signed. We 
would need to create an application that could get a list of 
candidates for whom voters could vote, and this application 
would also provide a simple interface to submit and record the 
votes. 


Blockchain Application Development 


Before we jump into code, let’s first understand some basic 
concepts around blockchain application development. 
Generally, we are used to concepts like objects, classes, 
functions, etc. when we develop conventional software 
applications. However, when it comes to blockchain 
applications, we need to understand a few more concepts like 
transactions, accounts and addresses, tokens and wallets, 
inputs, and outputs and balances. The handshake and 
request/response mechanism between a decentralized 
application and a blockchain are driven by these concepts. 

First, when developing an application based on blockchain, 
we need to identify how the application data would map to the 
blockchain data model. For example, when developing a DApp 
on the Ethereum blockchain, we need to understand how the 
application state can be represented in terms of Solidity data 
structures and how the application’s behavior can be expressed 
in terms of Ethereum smart contracts. As we know that all data 
on a blockchain is cryptographically signed by private keys of 
the users, we need to identify which entities in our application 
would have identities or addresses represented on the 
blockchain. In conventional applications this is generally not 
the case, because the data is not always signed. For blockchain 
application we need to define who would be the signers and 
what data they would sign. For example, in a voting DApp in 
which every voter cryptographically signs their vote, this is easy 
to identify. However, imagine a scenario where we need to 
migrate an existing conventional distributed systems 


application, having its data stored across multiple SQL tables 
and databases, to a DApp based on Ethereum blockchain. In 
this case we need to identify which entities in which table 
would have their identities and which entities would be 
attached to other identities. 

In the next few sections, we will explore Bitcoin and 
Ethereum application programming using simple code snippets 
to send some transactions. The purpose of this exercise is to 
become familiar with the blockchain APIs and common 
programming practices. For simplicity, we will be using public 
test networks for these blockchains and we will write code in 
JavaScript. The reason for selecting JavaScript is, at the time of 
this writing, we have stable JavaScript libraries available for 
both blockchains and it will be easier to understand the 
similarities and differences in the approaches we take while 
writing code. The code snippets are explained in detail after 
every logical step and can be understood even if the reader is 
not familiar with JavaScript programming. 


LIBRARIES AND TOOLS 


Recall from Chapter 2, that there are a lot of cryptographic 
algorithms and mathematics used in blockchain technology. 
Before we send our transactions to blockchains from an 
application, we need to prepare them. The transaction 
preparation includes defining accounts and addresses, adding 
required parameters and values to the transaction objects, and 
signing using private keys, among a few other things. When 
developing applications, it’s better to use verified and tested 
libraries for transaction preparation instead of writing code 
from scratch. Some of the stable libraries for both Bitcoin and 
Ethereum are available open source, which can be used to 
prepare and sign transactions and to send them to the 
blockchain nodes/network. For the purpose of our code 
exercises, we will be using the bitcoins JavaScript library for 
interacting with the Bitcoin blockchain and the web3. § 
JavaScript library for interacting with the Ethereum 
blockchain. Both these libraries are available as node.js 


packages and can be downloaded and integrated using the npm 
commands. 


Important Note The code exercises in this chapter are 
based on node. js applications. This is to make sure that the 
code we write as part of this exercise has a container in which it 
can run and interact with the other prepackaged libraries (node 
modules) mentioned. It is nice to have some knowledge about 
node.js application development, and the reader is encouraged 
to follow a getting started tutorial on node. § and npm. 


Figure 5-1 shows how a DApp interacts with a blockchain. 






Application | 4 Sey. 
Code Wemeaecis f Blockchain \/ 
7 Network 





Figure 5-1 Blockchain application interaction 


Interacting with the Bitcoin Blockchain 


In this section we will send a transaction to the Bitcoin public 
test network from one address to another. Consider this a 
“Hello World” application for the Bitcoin blockchain. As 
mentioned before, we will be using the bitcoins JavaScript 
library for preparing and signing transactions. And for 
simplicity, instead of hosting a local Bitcoin node, we will use a 
public Bitcoin test network node hosted by a third-party 


provider block-explorer. Note that you can use any provider for 
your application and you can also host a local node. All you 
need to do is to point your application code to connect to your 
preferred node. 

Recall from previous chapters that the Bitcoin blockchain is 
primarily for enabling peer to peer payments. A Bitcoin 
transaction is mostly just a transfer of Bitcoins from one 
address to another. Here’s how we do this programmatically. 

The following (Figure 5-2) shows how this code interacts 
with the Bitcoin blockchain. Note: The figure is just a rough 
sketch and does not show the Block Explorer service 
architecture in detail. 


Block 
Explorer 


Application 
Code 


Blockchain 


Network 





Figure 5-2 Application interacting with the Bitcoin blockchain using 
the Block Explorer API 


The following subheadings of this section are steps to 
follow, in that order, to send a transaction to the Bitcoin test 
network using JavaScript. 


SETUP AND INITIALIZE THE BITCOINJS 
LIBRARY IN A NODE. JS APPLICATION 


Before we call the library-specific code for Bitcoin transactions, 
we will install and initialize the bitcoins library. 

After initializing a node.js applicaion using the npm init 
command, let’s create an entry point for our application, 
index. $s, and custom JavaScript module to call the bitcoinjs 
library functions btc. s. Import btc. s in the index. $s. Now, we 
are ready to follow the next steps. 

First, let’s install the node module for bitcoin §: 


npm install --save bitcoinjs-1lib 

Then, in our Bitcoin module btc.js, we will initialize the 
bitcoinjs library using the require keyword: 
var btc = require('bitcoinjs-1ib') ; 

Now we can use this btc variable to call library functions on 


the bitcoinjs library. Also, as part of the initialization process, 
we are initializing a couple of more variables: 


¢ The network to target : We are using the Bitcoin test 


network. 


var network = btc.networks.testnet; 


e The public node API endpoint to get and post transactions 


: We are using the Block Explorer API for Bitcoin test 
network. Note that you can replace this API endpoint with 
your preferred one. 


var blockExplorerTestnetApiEndpoint = 
"https: //testnet.blockexplorer.com/api/' ; 


At this point, we are all set up to create a Bitcoin transaction 
using a node.js application. 


CREATE KEYPAIRS FOR THE SENDER 
AND RECEIVER 


The first thing that we will need are the keypairs for the sender 
and the receivers. These are like user accounts identifying the 
users on the blockchain. So, let’s first create two keypairs for 
Alice and Bob. 


var getKeys = function () { 
var aliceKeys = btc.ECPair.makeRandom ( { 
network: network 
ee 
var bobKeys = btc.ECPair.makeRandom ( { 
network: network 
}); 
var alicePublic = aliceKeys.getAddress() ; 
var alicePrivate = aliceKeys.towIF() ; 
var bobPublic = bobKeys.getAddress () ; 
var bobPrivate = bobKeys.towIF() ; 
console.log(alicePublic, alicePrivate, 
bobPublic, bobPrivate) ; 
}; 


What we did in the previous code snippet is, we used the 
ECPair class of the bitcoinjs library and called the 
makeRandom method on it to create random keypairs for the 
test network; note the parameter passed for network type. 

Now that we have created a couple of keypairs , let’s use 
them to send Bitcoins from one to the other. In almost all the 
cryptography examples, Alice and Bob have been the favorite 
characters, as seen in the preceding keypair variables. 
However, every time we see a cryptography example, generally 
Alice is the one who encrypts/signs something and sends to 
Bob. For that reason, we feel Bob is under a lot of debt from 
Alice, so in our case we will help Bob repay some of that debt. 
We will do this example Bitcoin transaction from Bob to Alice. 


GET TEST BITCOINS IN THE SENDER’S 
WALLET 


We have identified that Bob is going to be acting as the sender 
in this example Bitcoin transaction. Before he sends any 
Bitcoins to Alice, he needs to own them. As we know that this 
example transaction is targeting the Bitcoin test network, there 
is no real money involved but we still need some test Bitcoins 
in Bob’s wallet. A simple way to get test network Bitcoins is to 
ask on the Internet. There are a lot of websites on the Internet 
that host a simple web form to take the Bitcoin testnet 
addresses and then send test net Bitcoins to those. These 
services are called Bitcoin testnet faucets, and if you search 
online for that term you will get a lot of those in the search 
results. We are not listing or recommending any specific 
testnet faucet because they are generally not permanent. As 
soon as a faucet service provider has exhausted their test coins, 
or they don’t want to host the service anymore, they shut it 
down. But then new ones keep coming up all the time. A list of 
some of these faucet services is also available on the Bitcoin 
wiki testnet page. 

Another way of getting test net Bitcoins is to host a local 
Bitcoin node pointing to the test net and mine some. The block 
mining on the Bitcoin test network is not as difficult as that on 
the main network. This approach could well be the next level 
approach when you are building a production Bitcoin 
application and you need to test it frequently. Instead of asking 
for test coins every time you want to test your application, you 
can just mine them yourself. 


For the purposes of this simple example, we 
will just get some Bitcoins from a testnet 
faucet. In the previous code snippet, the 
value in the bobPublic variable is Bob’s 
Bitcoin testnet address. When we ran this 
Snippet, it generated 
“msDkUzzd69idLLGCkDFDjJVRz44jHcV3pW2” as Bob’ s 
address. It is also Bob’ s base 58 encoded 
public key. We will submit this value in one 
of the testnet faucet web forms and in return 
we will receive a transaction ID. If we look 


Up that transackron LD on tammy "of The Pxkcorn 
testnet explorers, we will see that some other 
address has sent some test Bitcoins to Bob’s 
address we submitted in the form. 


GET THE SENDER’S UNSPENT 
OUTPUTS 


Now that we know that we have some test Bitcoins in Bob’s 
wallet, we can spend them and give them to Alice through a 
Bitcoin transaction. Let’s recall from Chapter 3 how the Bitcoin 
transactions are made of inputs and outputs. You can spend 
your unspent outputs by adding them as inputs to the 
transactions where you want to spend them. To do that, first 
you need to query the network about the sender’s unspent 
outputs. Here’s how we will do that for Bob’s Bitcoin testnet 
address using the block explorer API. To get the unspent 
outputs, we will send an HTTP request to the UTXO endpoint 
with Bob’s address 
"msDkUzzd69idLLGCkDFDjVRz44jHcV3pW2". 


var getOutputs = function () { 
var url = blockExplorerTestnetApiEndpoint 
+ 'addr/' + msDkUzzd69idLLGCkDFDjVRz44jHcV3pw2 
+ '/utxo'; 
return new Promise(function (resolve, 
reject) { 
request.get(url, function (err, res, 
body) { 
if (err) { 
reject (err) ; 
} 
resolve (body) ; 
}); 
}); 
}; 


In the previous code snippet, we have used the node.js 
request module to send http requests using a node.js 
application. Feel free to use your favorite http library/module. 
This snippet is a JavaScript function that returns a promise 
that resolves into the response body from the API method. 
Here’s how the response looks: 


[ 
{ 


address: 
'msDkUzzd69idLLGCkDFDjJVRz44jHcV3pW2', 
txid: 
'db2e5966c5139c6e937203d567403867643482bbd9a66 
24752bbc583ca259958', 
WOU LCs Or 
scriptPubKey: 
'76a914806094191cbd4£cd8b4169a70588adc51dc02d6 
888ac', 
amount: 0.99992, 
satoshis: 99992000, 
height: 1258815, 
confirmations: 1011 
} y 
{ 


address: 

'msDkUzzd69idLLGCkDFDjJVRz44jHcV3pW2', 

txid: 
'5b88d5£c4675bb8 6b0a3a7 £c5a36d£9c425c3880a7453 
e3afeb4934e6d1d928e', 

vout: 1, 

scriptPubKey: 
'76a914806094191cbd4£cd8b4169a70588adc51dc02d6 
888ac', 

amount: 0.99998, 

satoshis: 99998000, 

height: 1258814, 


confirmations: 1012 


The response body returned by the call is a JSON array with 
two objects. Each of these objects represents an unspent output 
for Bob. Each output has txid, which is the transaction ID 
where this output is listed, the amount associated with output, 
and the vout, which means the sequence or index number of 
the output in that transaction. There is some other information 
in the JSON objects too, but that will not be used in the 
transaction preparation process. 

If we take the first object in the array, it basically says that 
the Bitcoin testnet address 
"msDkUzzd69idLLGCkDFDjJVRz44jHcV3pwW2" has 
~ 99992000 unspent satoshis coming from the transaction 
‘ db2e5966c5139c6e937203d567403867643482bbd9a66 
24752bbc583ca259958 at the index 0 . Similarly, the 
second object represents 99998000 unspent satoshis 
coming from the transaction 
* 5b88d5£c4675bb8 6b0a3a7 £c5a36d£9c425c3880a7453 
e3afeb4934e6d1d928e atthe index 1°. 

Don’t forget that 
"msDkUzzd69idLLGCkDFDjVRz44jHcV3pW2" is Bob’s 
Bitcoin testnet, which we created in step 2 earlier. Now we 
know that Bob has this many satoshis, which he can spend in a 
new transaction. 


PREPARE BITCOIN TRANSACTION 


The next step is to prepare a Bitcoin transaction in which Bob 
can send the test coins to Alice. Preparing the transaction is 
basically defining its inputs, outputs, and amount. 

As we know from the previous step that Bob has two 
unspent outputs under his Bitcoin testnet address, let’s spend 
the first element of the outputs array. Let’s add this as an input 
to our transaction. 


var utxo = JSON.parse (body.toString() ) ; 
var transaction = new 
btc.TransactionBuilder (network) ; 
transaction .addIinput (utxo[0].txid, 
utxo[0].vout) ; 


In the prceding code snippet, first we have parsed the 
response we received from the previous API call to get Bob’s 
unspent outputs. 

Then we have created a transaction builder object for the 
Bitcoin test network using the bitcoinjs library. 

In the last line, we have defined a transaction input. Note 
that this input is referring to the element at o index of the utxo 
array, which we received in the API call from the previous step. 
We have passed the transaction ID (txid) and vout from the 
unspent to the transaction.addInput method as input 
parameters. 

Basically, we are defining what we want to spend and where 
we got it from. 

Next, we add the transaction outputs. This is where we say 
how we want to spend what we added in the input. In the line 
following, we have added a transaction output by calling the 
addOutput method on the transaction builder object and 
passed in the target address and the amount. Bob wants to 
send 99990000 satoshis to Alice. Notice that we have used 
Alice’s Bitcoin testnet address as the function’s first parameter. 


transaction.addOutput(alicePublic, 99990000) ; 


While we have used only one input and one output in this 
example transaction, a transaction can have multiple inputs 
and outputs. An important thing to note is that the total 
amount in inputs should not be less than the total amount in 
outputs. Most of the time, the amount in inputs is slightly more 
than the amount in outputs, and the difference is the 
transaction fee offered to the miners to include this transaction 
when they mine the next block. 


In this transaction, we have 2,000 satoshis as the 
transaction fee, which is the difference between input amount 
(99992000) and the output amount (99990000). Note that we 
don’t have to create any outputs for the transaction fee; the 
difference between the input and output total amounts is 
automatically taken as the transaction fee. 

Also, note that we cannot spend partial unspent outputs. If 
an unspent output has x amount of Bitcoins associated with it 
then we must spend all of the x Bitcoins when adding this 
unspent output as an input in a transaction. So, in case Bob 
doesn’t want to give all the 99,990,000 satoshis associated with 
his unspent output to Alice, then we need to give it back to Bob 
by adding another output to the transaction with an amount 
equal to the difference of total unspent amount and the amount 
Bob wants to give to Alice. 


SIGN TRANSACTION INPUTS 


Now, that we have defined the inputs and outputs in the 
transaction, we need to sign the inputs using Bob’s keys. The 
following line of code calls the sign function on the 
transaction builder object to cryptographically sign the 
transaction using Bob’s private key, but it takes the whole key 
pair object as an input parameter. 


transaction.sign(0, bobKeys) ; 


Note that the transaction.sign function takes the index 
of the input and the full key pair as input parameters. In this 
transaction, because we have only one input, the index we have 
passed is O. 

At this stage, our transaction is prepared and signed. 


CREATE TRANSACTION HEX 
Now we will create a hex string from the transaction object. 


var transactionHex = 
transaction.build() . toHex() ; 


The output of this line of code is the following string, which 
represents our prepared transaction; this step is needed 
because the send transaction API accepts the raw transaction 
as a String. 


BROADCAST TRANSACTION TO 
THE NETWORK 


Finally, we use the hex string value we generated in the last 
step and send it to the block explorer public testnet node using 
the API, 


var txPushUrl = 
blockExplorerTestnetApiEndpoint + 'tx/send'; 
request.post ({ 
url: txPushUrl, 
json: { 
rawtx: transactionHex 
} 
}, function (err, res, body) { 
if (err) console.log(err) ; 


console.log(res) ; 
console.log (body) ; 
}); 


If the transaction is accepted by the block explorer public 
node, we will receive a transaction ID as the response of this 
API call, 


{ 

txid: 
"db2e5966c5139c6e937203d567403867643482bbd9a66 
24752bbc583ca259958" 


} 


Now that we have the transaction ID of our transaction, we 
can look it up on any of the online testnet explorers to see if 


and when it gets mined and how many confirmations it has. 

Putting it all together, here’s the complete code for sending 
a Bitcoin testnet transaction using JavaScript. The input 
parameters are the Bitcoin testnet keypairs we created in step 
Me 


var createTransaction = function (aliceKeys, 
bobKeys) { 
getOutputs (bobKeys .getAddress()) .then (func 
tion (res) { 
var utxo = JSON.parse(res.toString() ) ; 
var transaction = new 
btc.TransactionBuilder (network) ; 
transaction.addIinput (utxo[0].txid, 
utxo[0].vout) ; 
transaction. addOutput (alicekeys.getAdd 
ress(), 99990000) ; 
transaction.sign(0, bobKeys) ; 
var transactionHex = 
transaction.build() . toHex() ; 
var txPushUrl = 
blockExplorerTestnetApiEndpoint + 'tx/send'; 
request.post ({ 
url: txPushUrl, 
json: { 
rawtx: transactionHex 
} 
}, function (err, res, body) { 
if (err) console.log(err) ; 


console.log(res) ; 
console.log (body) ; 
oar 
yc 


In this section we learned how we can programmatically 
send a transaction to the Bitcoin test network. Similarly, we can 
send transactions to the Bitcoin main network by using the 
main network as the target in the library functions and in the 
API endpoints. We also used the query APIs to get unspent 
outputs of a Bitcoin address. These functions can be used to 
create a simple Bitcoin wallet application to query and manage 
Bitcoin addresses and transactions. 


Interacting Programmatically with 
Ethereum—Sending Transactions 


The Ethereum blockchain has much more to offer in terms of 
blockchain application development as compared with the 
Bitcoin blockchain. The ability to execute logic on the 
blockchain using smart contracts is the key feature of 
Ethereum blockchain that allows developers to create 
decentralized applications. In this section we will learn how to 
programmatically interact with the Ethereum blockchain using 
JavaScript. We will look at the main aspects of Ethereum 
application programming from simple transactions to creating 
and calling smart contracts. 

As we did for interacting with the Bitcoin blockchain in the 
previous section, we will be using a JavaScript library and test 
network for interacting with Ethereum as well. We will use the 
web3 JavaScript library for Ethereum. This library wraps a lot 
of Ethereum JSON RPC APIs and provides easy to use 
functions to create Ethereum DApps using JavaScript. At the 
time of this writing, we are using a version greater than and 
compatible with version 1.0.0-beta.28 of the web3 JavaScript 
library. 

For the test network, we will be using the Ropsten test 
network for Ethereum blockchain. 

For simplicity, we will again use a public-hosted test 
network node for Ethereum so that we don’t have to host a 
local node while running these code snippets. However, all 
snippets should work with a locally hosted node as well. We are 


using the Ethereum APIs provided by the Infura service. Infura 
is a service that provides public-hosted Ethereum nodes so that 
developers can easily test their Ethereum apps. There is a small 
and free registration step needed before we can use the Infura 
API, so we will go to https: //infura.ioanddoa 
registration. We will get an API key after registration. Using 
this API key, we can now call the Infura API. 

The following (Figure 5-3) shows how this code interacts 
with the Ethereum blockchain. Note: The figure is just a rough 
sketch and does not show the Infura service architecture in 
detail. 











Infura ™" CS 
i ~ 
Application / 
Code | : Blockchain \ 
i \ Network 
i \ iS 
\ 2 Node 
Pod 4 


Figure 5-3 Application interacting with Ethereum blockchain using 
Infura API service 


The following subsections of this section are steps to follow, 
in that order, to send a transaction to the Ethereum Ropsten 
test network using JavaScript. 


SET UP LIBRARY AND CONNECTION 


First, we install the web3 library in our node.js application. 
Note the specific version of library mentioned in the 
installation command. This is because version 1.0.0 of the 


library has some more APIs and functions available and they 
reduce dependency on other external packages. 


npm install web3@1.0.0-beta.28 


Then, we initialize the library in our nodejs Ethereum 
module using the require keyword, 


var Web3 = require('web3'); 


Now, we have a reference of the web3 library, but we need 
to instantiate it before we can use it. The following line of code 
creates a new instance of the Web3 object and it sets the 
Infura-hosted Ethereum Ropsten test network node as the 
provider for this Web3 instance. 


var web3 = new Web3 (new 
Webs providers HiipProvider ("hiips://ropsren. 1 
Mitrasio/<your Intra APT key>")); 


SET UP ETHEREUM ACCOUNTS 


Now that we are all set up, let’s send a transaction to the 
Ethereum blockchain. In this transaction, we will send some 
Ether from one account to another. Recall from Chapter 4 that 
Ethereum does not use the UTXO model but it uses an account 
and balances model. 

Basically, the Ethereum blockchain manages state and 
assets in terms of accounts and balances just like banks do. 
There are no inputs and outputs here. You can simply send 
Ether from one account to another and Ethereum will make 
sure that the states are updated for these accounts on all nodes. 

To send a transaction to Ethereum that transfers Ether 
from one account to others, we will first need a couple of 
Ethereum accounts. Let’s start with creating two accounts for 
Alice and Bob. 

The following code snippet calls the account creation 
function of web3 library and creates two accounts. 


var createAccounts = function () { 
var aliceKeys = 
web3.eth.accounts.create(); 
console.log(aliceKeys) ; 
var bobKeys = web3.eth.accounts.create(); 
console.log(bobKeys) ; 
}; 


And here’s the output that we get in the console window 
after running the previous snippet. 


{ 
address: 
"OxAfF9d328H8181an831Bc426347949RB7946A88DA', 
privateKey: 
POxOrp / iiks Zos Zeb QU9e 2h Sez bi brZa je ob Zag too oeac 
imo ecko lle Meee lo dg aul Ner enn ele nmamiar 


Se Mo iguisasdalswerehepbopeneem| (sa haveneumeyakr 
SUOMI ats ae RT Only, 
Sule fidues all aublghohoshorarmuacilce hella 
enerypr.. (RUbnCE@oOne “eneryp tr] 
} 
{ 
address: 
VOxeZOUSE Rr Osc? S00boReCOABDALI DS lier De salen, 
privateKey: 


"Oxc6676b7262dabla3a28a781c/7110b63ab8cd5eae2a 
DAoZ Oba soladZeelroa Gb” ; 


Soom Meat Sac toris lL PeiCm On: 
Seco peulbbershevcrvetmaboran iy, 

Spileigues I imonglenextene, ae cule owe |e 

encrypr: Function: -encrypr| 


As you can see, along with the addresses and private keys, 
the output for each account creation function call also includes 


a few functions. For now, we will focus on the address and 
private key of the returned objects. The address is the Keccak- 
256 hash of the ECDSA public key of the generated private key. 
This address and private key combination represents an 
account on the Ethereum blockchain. You can send Ether to the 
address and you can spend that Ether using the private key of 
the corresponding address. 


GETTES ERE RAIUN-SENDER.S 
ACCOUNT 


Now, to create an Ethereum transaction which transfers Ether 
from one account to another, we first need some Ether in one 
of the accounts. Recall from the Bitcoin programming section 
that we used testnet faucets to get some test Bitcoins on the 
address we generated. We will do the same for Ethereum also. 
Remember that we are targeting the Ropsten test network for 
Ethereum, so we will search for a Ropsten faucet on the 
Internet. For this example, we submitted Alice’s address that 
we generated in the previous code snippet to an Ethereum 
Ropsten test network faucet and we received three ethers on 
that address. 

After receiving Ether on Alice’s address, let’s check the 
balance of this address to confirm if we really have the Ether or 
not. Though we can check the balance of this address using any 
of the Ethereum explorers online, let’s do it using code. The 
following code snippet calls the getBalance function passing 
Alice’s address as input parameter. 


Var getBalance = function ©: { 
web3.eth.getBalance ('OxAf£9d328E8181aE831B 

042634794 9EB7946A88DA') .then(console.log) ; 

}e 


And we get the following output as the balance of Alice’s 
address. That’s a huge number but that’s actually the value of 
the balance in wei. Wei is the smallest unit of Ether. One Ether 


equals 10% 18 wei. So, the following value equals three Ether, 
which is what we received from the test network faucet. 


3000000000000000 000 


PREPARE ETHEREUM TRANSACTION 


Now that we have some test Ether with Alice, let’s create an 
Ethereum transaction to send some of this Ether to Bob. Recall 
that there are no inputs and outputs and UTXO queries to be 
done in the case of Ethereum because it uses an account and 
balances-based system. So, all that we need to do in the 
transaction is to specify the “from” address (the sender’s 
address), the “to” address (the recipient address), and the 
amount of Ether to be sent, among a few other things. 

Also, recall that in the case of a Bitcoin transaction we did 
not have to specify the transaction fee; however, in the case of 
an Ethereum transaction we need to specify two related fields. 
One is gas limit and the other is gas Price. Recall from Chapter 
4 that gas is the unit of transaction fee we need to pay to the 
Ethereum network to get our transactions confirmed and 
added to blocks. gas Price is the amount of Ether (in gwei) we 
want to pay per unit of gas. The maximum fee that we allow to 
be used for a transaction is the product of gas and gas Price. 

So, for this example transaction, we define a JSON object 
with the following fields. Here, “from” has Alice’s address and 
“to” has Bob’s address, and value is one Ether in wei. The gas 
Price we choose is 20 gwei and the maximum amount of gas we 
want to pay for this transaction is 42,000. 

Also, note that we have left the data field empty. We will 
come back to this later in the smart contract section. 


{ 

feo: 
"OxAf£9d328E8181aEn831Bc426347949EB7946A88DA", 

Gaserace= “20000000000, 

Gass, “4220007, 

1e1O he 
"Ox2Z0103f&£i98c2909bbFCedABbD4IIDS 71 S£&DB341eA"', 


Veruese. MOO OOOO UD OOOO OO Oe, 
Ceiwes. 3 


SIGN TRANSACTION 


Now that we have created a transaction object with the 
required fields and values, we need to sign it using the private 
key of the account that is sending the Ether. In this case, the 
sender is Alice, so we will use Alice’s private key to sign the 
transaction. This is to cryptographically prove that it is actually 
Alice who is spending the Ether in her account. 


Vaio CLG raAncsateh Lon = une r Lon. «(ye x 
Wich woo OY 

Paco my: 

"OxAff9d328K8181ar831Bc426347949RB/946A88DA", 
GasPraces "2000 OO CUOCO, 
Gases 7 4700077 
Es 

"O72 UUs hire OSGZ OID bE CCOABDA DL DS Ala rip oA ie 
value: "1LOOQOQOOOOQ0000000000", 
Caan to 


ae 


Webs.eUleacCoumrs .ougilLrancsaetvontix, 
LUE DTI VeZbsZ2cooUU SZ hI Se7 pba mob Aa ao Ope ac 
FS [0S 247 bP rUASe Ear 5.1) 

. then (function (signedTx) { 

console.log(signedTx.rawTransaction) ; 
1a) hy 
; 


The preceding code snippet calls the signTransaction 
function with the transaction object we created in the step 
before and Alice’s private key that we got when we generated 


Alice’s account. Following is the output we get when we run the 
preceding code snippet. 


{ 

messageHash: 
"0x91b345a38dc728dc06a43c49b92abacle0eb6d614c43 
Z2Za6dd37d809290a25aa6b', 

Wess SUC eles 

es 
LOxt4cZ UO laO08384 97 Pas 3Sdlpsadil ts eke? aA Sb 
66fbf567e37e963d64537', 

a 
"0x3d2a0a818633a11832a5c48708al 98af909eaF4884a 
TeS6CIacJedZ boas bu7Z oe | 

Caw Pransact con: 
rMOxXESOCOUUCSOAaeM 7 eoUO SZ aa NO 942 UIA ERIS Ce OOD 
fecdabb411d3715fdb34lea880de0b6b3a7640000802aa 
014¢20901a060834972a539d7b8ad1£23161c2144a2b66 
fb£567e37e963d64537a03d2a0a818633a11832a5c4870 
8al98af909eaf4884a785b6c9ac¥9ed216d9b029c' 
i 


In the output of the signTransaction function we 
receive a JSON object with a few properties. The important 
value for us is the rawTransaction value. This is the hex 
string representation of the signed transaction. This is very 
similar to how we created a hex string of the Bitcoin 
transaction in the Bitcoin section. 


SEND TRANSACTION TO 
THE ETHEREUM NETWORK 


The final step is to just send this signed raw transaction to the 
public-hosted Ethereum test network node, which we have set 
as the provider of our web3 object. 

The following code calls the sendSignedTransaction 
function to send the raw transaction to the Ethereum test 


network. The input parameter is the value of the 
rawTransaction String that we got in the previous step as 
part of signing the transaction. 


web3.eth.sendSignedTransaction (signedTx.rawTra 
Nsaction). then (console. log); 


Notice the use of “then” in the prceding code snippet. This 
is interesting because the webg library provides different levels 
of finality when working with Ethereum transactions, because 
an Ethereum transaction goes through several states after 
being submitted. In this function, call of sending a transaction 
to the network, then, is hit when the transaction receipt is 
created, and the transaction is complete. 

After a few seconds, when the JavaScript promise resolves, 
the following is what we get as an output. 


{ 

blockHash: 
"O0x26f1e1374d11d4524f692cdflce3aab6e085dcc18108 
4642293429eda3954d30e', 

blockNumber: 2514764, 

Gone becuAddress stun 

cumulativeGasUsed: 125030, 

hcom: 
"Oxaf£9d328e8181ae831bc426347949eb7946a88da', 

gasUsed: 21000, 

Loge: lie 

Logse loom: 
"Ox0000000000000000000000000000000000000000000 
OODDD000000000000000000000000000000000000000000 
OODDD000000000000000000000000000000000000000000 
OODDD000000000000000000000000000000000000000000 
OODD000000000000000000000000000000000000000000 
OODDD000000000000000000000000000000000000000000 
OODDD00000000000000000000000000000000000000000 
OODDD000000000000000000000000000000000000000000 


OODDD00000000000000000000000000000000000000000 
ODODODD00000000000000000000000000000000000000000 
OODODD00000000000000000000000000000000000000000 
OOOO 0C00"; 

States: Cae 

EO: 
LOxZZ UMS PREVSC? SOUbb recdabb4illds PlerdbsAélea™, 

Eraticac te rontaceh< 
"Oxd3£45394ac038c44c4febe0cdbh7021fdbd672eblaba 
a93eb6al828df5edb6253', 

Pralicadenrominicex: 3S 


The output has a lot of information, as we can see. The most 
important part is the transactionHash, which is the ID of 
the transaction on the network. It also gives us the 
blockHash, which is the ID of the block in which this 
transaction was included. Along with this, we also get 
information about how much gas was used for this transaction, 
among other details. If the gas used is less than the maximum 
gas we specified during transaction creation, the remaining gas 
is sent back to the sender’s address. 

In this section, we sent a simple transaction to the 
Ethereum blockchain using JavaScript. But this is just the 
beginning of Ethereum application programming. In the next 
section, we will also look at how to create and call smart 
contracts programmatically. 


Interacting Programmatically with 
Ethereum—Creating a Smart Contract 


In this section, we will continue our Ethereum programming 
exercise, and we will create a simple smart contract on the 
Ethereum blockchain using the same web3 JavaScript library 
and the Infura service API. 


Because, no computer programming beginners’ tutorial is 
complete without a “Hello World” program, the smart contract 
we are going to create will be a simple smart contract returning 
the string “Hello World” when called. 

The contract creation process will be a special kind of 
transaction sent to the Ethereum blockchain, and these types of 
transactions are called “contract creation transactions.” These 
transactions do not mention a “to” address and the owner of 
the smart contract is the “from” address mentioned in the 
transaction. 


PREREQUISITES 


In this code exercise to create a smart contract, we will 
continue with the assumption that the web3 JavaScript library 
is installed and instantiated in a node.js app and we have 
registered for the Infura service, just like we did in the previous 
section. 

Following are the steps to create a smart contract on 
Ethereum using JavaScript. 


PROGRAM THE SMART CONTRACT 


Recall from Chapter 4 that the Ethereum smart contracts are 
written in Solidity programming language. While the web3 
JavaScript library will help us deploy our contract on the 
Ethereum blockchain, we will still have to write and compile 
our smart contract in Solidity before we send it to the 
Ethereum network using web3. So, let’s first create a sample 
contract using Solidity. 

There are a variety of tools available to code in Solidity. 
Most of the major IDEs and code editors have Solidity plugins 
for editing and compiling smart contracts. There is also a web- 
based Solidity editor called Remix. It’s available for free to use 
athttps://remix.ethereum.org/ . Remix provides a very 
simple interface to code and compile smart contracts within 
your browser. In this exercise we will be using Remix to code 
and test our smart contract and then we will send the same 


contract to the Ethereum network using the web3 JavaScript 
library and the Infura API service. 

The following code snippet is written in the Solidity 
programming language and it is a simple smart contract that 
returns the string “Hello World” from its function Hello. It also 
has a constructor that sets the value of the message returned. 


pragma colin y 0470); 
Contract Helloworla { 
string message; 
ruMeCrLon Hel lowor lad (4 
message = "Hello World "; 


} 


hunetvoen Hello() comstant returns (string) 


EeruUrh message, 


Let’s head to Remix and paste this code in the editor 
window. The following images (Figures 5-4 and 5-5) show how 
our sample smart contract looks in the Remix editor and what 
the output looks like when we clickeded the Create button on 
the right-side menu, under the Run tab. Also, note that by 
default, the Remix editor targets a JavaScript VM environment 
for smart contract compilation and it uses a test account with 
some ETH balance, for testing purposes. When we click the 
Create button, this contract is created using the selected 
account in the JavaScript VM environment. 


+ 

* = browser/helloworld.sol * * 
1 pragta solidity 0.4.0; 
2+ contract HelLoWorld { 
3 string message; 


4 
& S> function HeLLotorld(){ 


6 message » "Hella World!"; 
? } 
a 
& %- function HeLlo() constant returns (string) { 
1¢ return message; 
11 } 
wz } 
¥% 2 — [2lonlyremixtransactions.script + = Q Search transactions ~ Listen on network 


Figure 5-4 Editing smart contracts in Remix IDE 





Figure 5-5 Smart contract creation output in Remix IDE 


Following is the output generated by the create operation, 
and it shows us that the contract has been created because it 


has a contract address. The “from” value is the account address 
that was used to create the contract. It also shows us the hash 
of the contract creation transaction. 


Status Oxl Transaction mined and execution 
succeed 

contractAddress Ox692a70d2e424a56d2cb6c2/aa9 
Tales 6395377 bse 





From Oxca35b7d915458ef 540ade6068dfe2f44e8fa7 
Se 


Lee. Hew LoOWwomr eh ACoOms traci ee) 
gas 3000000 gas 

Gbransactren -cCoOst 205547 gas 
execution cost ON Soares 


hash UxotseZ Vez VEZo30C4bUrTOUS Ie opehcasdsele4s 
edivelfd4d279le7sboldesail4l 

input 0x6060604052341561000f57600080fd5b60408 
OSL IOCLUTME CAV S23 0000 CeleZeUZ00IT TASS SoCece r20S5 
TOLT2Z6coO42100000000000000000000000000000000000 
DOCOOSTSZSUSGVOOS90S0STIV6OZ00L ID e100 Sa 9 79 190610 
VeOSs Go bsUoloUlosscabs760s4d50015 Leo0l lol Sol0 O00 
ZV 3NECUOZIO04 FOG OO0SZ60 20600020906 01015020900 
ae mlel OBC Vato Zn) Obl eia WO oa NNG [Ocul sige Choco lmne eC MG io} e510 ORLA isi ex) 
SOLOVci SG SeSZ C001 COU POIGS5oS6 ZS ol00er > 7 Ie 20 NS 
BS Zoli VooLlOeces G7 ole 75591607 OO Te 06000206 
LOCDSS esp 5ba090 S001 00det LIOGlOVeQ sca baU 20 S056 
KOROAS PIO SDS USAT ao hOUte> AGOOOS ko OOO OSs SUG00 
LOLGLOVeSSo5b5090S65b90565b6e Ol bce0eloll4o0003 
96000£300606060405260043610610041576000357c010 
DODDDD00000000000000000000000000000000000000000 
OOOQ0D0000900463f fF FLFFL168063bcdfe0d5146100465 
Alo oUUUSOT Ash s4 Veo LOUS Ea COOU SO rds belLUVS 26 LO0d 
4S 60D G04 0S T8008 0602001 S2381I0SS72528381TE1 S181 52602 
VOLIIS CS0S1 IG U ZOO LIU SUSSSe36000Sbo3eLl0ls61009 
Go1eOSZUL She keA Ol S760 206 OOO SUGTOO Tes oS 50505 
VS0Q0S 090 SIUC SOLE VesUlSolOveoS 7608203605 1600 




















HES602 00S CUO OO aS IO RG Silks 2 OO ORGIES O SiO 7.5 US 
OSUGO4USLECSLOS SUE SS bolLOUdeol Oly esGsboUUUS0S46 
OOLS L600 LNGLS6 LOL O002Z 03166002 9004 S060 LED TE OZUS 
0910402602001604051908101604052809291908181526 
0200182805460018160011615610100020316600290048 
OVS oO 7257 S06 Uk tO 6kOVa 7S 7 Ol OVO OS Ss 5404072335 
2 OC OAC Ui Oke MOI OSG obo UO LOG OU S260 AN COONS 
OS Sil54 357 SU CUOMO OG OA ODIs Ors SSG Ass. S56 729. 00) 
SoU TEI GS2Z0ISISbS050505 0509050905 65b6020 0040519 
OSLO ME CAG SZASUGCOOUCTSZ25 U9 US CUCEICS G27 afar 230582 
0d6796e48540eced3646ea52C632364666e64094479451 
066317789a712aef4da0029 

decoded input {} 

decoded output = 

logs al 

value O wei 











At this point, we have a simple “Hello World” smart 
contract ready, and now the next step is to deploy it 
programmatically to the Ethereum blockchain. 


COMPILE CONTRACT AND GET 
DETAILS 


Let’s first get some details about our smart contract from 
Remix, which will be needed to deploy the contract to the 
Ethereum network using the webg library. Click on the 
Compile tab in the right-side menu and then click the Details 
button. This pops up a new child window with details of the 
smart contract. What’s important for us are the ABI and the 
BYTECODE sections on the details popup window. 

Let’s copy the details in the ABI section using the copy 
value to clipboard button available next to the ABI header. 
Following is the value of the ABI data for our smart contract. 


[ 


WCOMoatait-.. sani, 
orltigy OW th res ae ml al ge 
Witenes ete ie Als, 
onblay Sain eee | 
{ 
Un eiiihesn a Ae 
MACACA acho als axel 


l, 

"payable": false, 
"stateMutability": "view", 
VEvoe = EV ruimetaorm! 


are Signe Oe ceese toe wal be (a 

"payable": false, 
"StateMutability" >: “nonoayable"; 
NC Oe 2 eCOneeeretor! 


This is a JSON array and if we closely look at it, we see that 
it has JSON objects for each function in our contract including 
its constructor. These JSON objects have details about a 
function and its input and output. This array describes the 
smart contract interface. 

When we call this smart contract after it is deployed to the 
network, we will need this information to find out what 
functions the contract is exposing and what do we need to pass 
as an input to the function we wish to call. 

Now let’s get the data in the BYTECODE section of the 
details popup. Following is the data we copied for our contract. 


{ 
"linkReferences": {}, 
“ObWJeECE: 
MOO SUS UALS S46 LOU S CUO SOmdsns 04050 Sots lo 


LEO eo oZ200600CSlS26072001 (Ta sosocecetZ0S ory 26c6 
4210000000000000000000000000000000000000000815 
ZOUVUGUDOL UCU SMI BGO 200 IO GL OO SaI Zo LOO GEOUGU SIG 555 
VolOLOs soo ber sO S4o00Te1oO0 Lek Selo LO00 7031-6600 
29004906000 S200Z7060002Z090601 £0 b60Z09004e1 01978 
ZCQAE MOG LOO Si Se OS CO tio Ss oOCdiy SaaS UOOo pS 
SoieZcOU POUO MUMS Sa o07 PooLO0e me le 70 aloo ols: 
DOUMUVCES) C75 Me Zp ps 7160710 CEI U COOOL OGIO Ss S65 
bobovGO SUE LUO dese Ves USGS DS OOS 6a bos O 7 O9 
OSsbeve7zillsol0o tes / oOO0sletu0 0S sS0eCO LULL ite 
bo CUbeUIO Se Sb IOSG ob SOLE SUC NOI ae OO S9 6000538 
0606060405260043610610041576000357c01000000000 
DODDD00000000000000000000000000000000000000000 
UIUUACSEPE RE PEE ME CUSCS bed reds lel O04 oo hobo U03 
O0fd5b341561005157600080fd5b6100596100d4565b6004 
OSA SUSUGUZUOLE ZS IOS SAS 483610 G1SLG 15 26070 011s 06 
DOL IV6COZA0OLIUSOSSS30000Sbess lor se 008357303820 
iS LOLA OS 250 Ao 0 LOU SU ClO PeacabeU SU SUS 090509 
OSE OG ONG Ss Odes 6 DOVeoS7.30s 2080s Ee UO NesoUZUD 
SO MORO VAST ING STS ZOU 2001 SOS S0 SZ SUSU 5060405 
LeOo Vos 90t s5bGlW0dece LUT eseoboUOn SOS seOOile Leo 
116156101000203166002900480601f016020809104026 
UZ OUEO4 OSU SITS OAOS 2S 0927S LIOCl ers 26072 C0ns26 
0546001816001161561010002031660029004801561017 
29 78060 lriOelOl4 7 S7orOLOOS 08354040783 529 160200 
LIE CROLI ASO SoA EOC OCOS ZOUA MOCO Oe COR Sise ia A3 
sy CHONG CUOMO INNES OZ) Oo Ohio bol GURS 5) ons Zac HOOKS xeieMinmib ens) 
ZOIO LS bS0 SUS 050509050905 CSD 602060405 L900 310 ke 04 
US2 SUCO0U STS ZDUPUS6OUaI oS oA alayZ 20582057 7a0de 
4f7e05c4ad9b45dd10fb6c133a523541led06db6dd31d59 
DsedSaTosas 0070), 























POC Odeg te EU Sil Oscs Oi eT O sca QM Sabor 

CALLVALDE oZEROs PUSCHZ scr UME R (Pls nde sec0 
DUP REVERT VUMPDEST PUSHI Ox40° DUCT MLOAD 
SWAP! DUPZ ADD PUSH 0x40 MSTORE DUPL PUSH 


Ox DUPZ MOTORE, PUSHY 0x20" ADD: PUSS 
Ox48656COCOF2Z0576F726C642100000000000000000000 
COUOCUCOOOCOCO0O 0000 DUPZ MSLZORE POP -PWUSHie 0x0 
SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAPI1 
PUSH2 Ox5A SWAP3 SWAP2 SWAP1 PUSH2 0x60 JUMP 
JUMP DES P SPOR SPUSHZ Wx LOS. JUMP SUMP Dio Dues 
DUES hOAD PUSHY tse DUP 2 Pi Stile Os AN De San Re 
PUSHZ (021-00 MU *sUBT AND? PUSH (02. SWAP Diny 
SWAP PUSH O00 (Ms TORE TPUSHINOs 70) PU SHE 0sc0 
KECCAKZ So. SWART PUSH Ux ADD PUSH i0s20 
SWAP DLyY DUPZ ADD SWAPS DUPS PUSH Oxi al 
PUSHZ, Os Ad. JUMP DUP) MEGA, PUSH \OxEE NOL AND 
DUES DUP ADDO DUPS SSUORE PUSH. UxGs (UMP 
JUMP DES Ebr S DU Pil ADD PUSH Oz AbD! DWRG 
SOUORT. DUES (SAR ROs PUSH OxGH WUMP i “SWAP? Dies 
ADDS SUMP DRS! PUPS BUPA “6 WSsAeROe PUSH Hx 
JUMPT DUES MLOAD DUPS SoOlORE SWAPZ, PUSHE 0x20 
ADD SWAP2 SWAP1 PUSH1 Oxl ADD SWAP1 PUSH2 O0xB3 
JUMP JUMP DEST GUMPDEST POP SWAPL POP PUSH2 
OsDC -SWAPZ SWAP PUSH? 10x80 (UMP DUMPDES L POP 
SWAP1 JUMP JUMPDEST PUSH2 0x102 SWAP2 SWAP1 
SUMP DES PbU Pi (PUPS ei San Ree Pu SH Oscub. chu Mba: 
PUSS Tile Os20. Die 2 PUSS Hin OscO) (SWAP So lOREserOr 
PUSH Osa SAPD PU SH2 (Oxo SUMP UMP DES i POP 
SWAP JUMP JUMPDEST, SWAPID OUME. JUMPDEST PUSH? 
(scEBC DUP EW She tO iia Seu tls OU COpie ere 

PULLS Eel O60 RECUR N eS Or SPU Se’ Osco Pee hee UscANG 
MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 
JUMPI PUSH1 0x0 CALLDATALOAD PUSH29 
OxLOQDDDDDONDDDDONDDDDNDONDDNDDNDDONDDND00000000000 
OO00000000000 SWAP1 DIV PUSH4 OXFFFFFFFF AND 
DUE PUSH Os CD ah DS: Gy ePWiS HA U4 Grp 

DUMP DES “PUSH Os 0) DUP RE YER UME Se 
CADLIVALUMS DSAERO PU SHA VOx25 ll wUMP I PUSH s0sa0 

D 

we 





UP RE WE UMP DES PUSH (0x5 9 PUSH? OxD4 
UMES WUE DHS SPS OA OMG Abst Ee DUI Se US ral 





Che ON ab BE IDIURS Ce BULS Zao ONss (BiUNe seuiSuuG ida mbiiier rb UerZ 
DUEZ. MLOAD DUPZ MSTORE: PUSH 0x20 ADD -SWAPZ 
POP DUP]. MLOAD SWAPT PUSHY Ox20 ADB SWAPL DUPI 
BUPA) BUPA) PUSHIELOOC OUMPDE ST “PUPA UP 2 El 
heAkhRO- PUSH2Z. 0x99 JUMPER (DUP DUP 3, ADD MLOAD 
DUEZ DUPS ADD MS TORE. PUSH "0x20 DUP2 ADD SWAP. 
POPTEUSHZ 0s. OUMP: UMP DHS POPP OP POP Iho 
SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 Ox1F AND 
DUE Sane Te Wists Oso UM Pie Pile eis Sue 
DYE MOA SEU SH Osh DUA PU SH Ox 7 Ol SUB Buse 
Ox 00 EXP SUB, NOT AND DUPA MSTORE PUSH! 0x20 
ADD SWAP? POP. UME DE SI> Por SNAPS oP OP PoP POP 
PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN 
JUMPDES P (PUSH. SOseDC) Purses 10sec UME pu ME Db Sak 
PUSS ral Osc) sb we de Sih Ae Pulio Hie sls BURP PMS Ht Io: 
AND ESAERRO-PUSH2 Ox1.00 MU SUB SAND: PUSHE (0x2 
SWAPS eve Duis SPU St Osc Ab PUSH 0s 2.0. RiP 
SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD 
SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 
SWAPZ SWAP] DUP2 DUP2 MSTORE PUSH] Ox20 ADD 
DUES, DUP SROADS PUSH. Os DWP PUSH Oxi AND 
LSAHRO: (PUSH, O00 (MUL SUB AND  PUSHW (0x2 -sWAPIL 
Biys (PUES Ree PES Osi Ss tUMP ae shi eth 
Osc i PUSH Osea no MPUSHAs sO shO Op Uae 
DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 
O20 ADDS SWAPZ PUSHZ Ox hie oUME VUMPDE ST DUES 
ADD SWAPZ SWAP] PUSH! 0x0 MSTORE PUSHT 0x20 
PUSH 0x0 KECCAK2Z56 SWAP] JUMPDEST DUPZ SLOAD 
DUPZ MSTORE SWAP] PUSH 0x1 ADD SWAP] PUSH 

Ox ZOVADD BUPI DUP4 Gr PUSH! UxlS5 JUMP. “DUES 
SWAP] SUB PUSH] OQxl1F AND DUP3 ADD SWAP2 

JUMP DHS. POP POP “POP —POP -POP -SwArd POP SwArd 
JUMP JUMPDEST PUSH! Ox20 PUSH] Ox40 MLOAD 
SWAPI DUPZ ADD PUSH (0x40 °MSTORE DUPL PUSH 
OU DUPA MSTORE OR SWAP lL JUMP SOP LOG Pus i 
Oxo 27ATATAS0SS8 KECCAKZ56. DUPSG “—PUSHZ 7 

















OxSDA4F7E0O5C4AD9B45DD1 0FB6C133A523541ED06DB6DD 
SLDS IBS SDe OR? PUSH ASCO ZOU OO UC OOCOOD OG, 


"sourceMap": 
ON Die Oy er Oe, ir ee er i iri er 
NDT ea Aaa Tea ay ie coresbarereraerzy vac wilco a ear: 


CR AC Os ONC SOE Lota Cae Oo Ce 
| ide Mass Me AE CREE Ta RO eS, Al faa) AL OY fd Loa fe lL SO LAY Lt fa AE AY fd A Ag Pa OL LA Ea A fell al SN LY 


As we can see, the data in the BYTECODE section is a JSON 
object. This is basically the output of the compilation of the 
smart contract. Remix compiled our smart contract using the 
Solidity compiler and as a result we got the solidity byte code. 
Now closely examine this JSON and look at the “object” 
property and its value. This is a hex string that contains the 
byte code for our smart contract, and we will be sending it in 
the contract creation transaction in the data field—the same 
data field that we left blank in the previous example Ethereum 
transaction between Alice and Bob. 

Now we have all the details for our smart contract and we 
are ready to send it to the Ethereum network. 


DEPLOY CONTRACT TO ETHEREUM 
NETWORK 


Now that we have our smart contract and its details, we need to 
prepare a transaction that can deploy this contract to the 
Ethereum blockchain. This transaction preparation will be very 
similar to the transaction we prepared in the previous section, 
but it will have a few more properties that are needed to create 
contracts. 

First, we need to create an object of the 
web3.eth.Contract class, which can represent our contract. 
The following code snippet creates an instance for the said 
class with a JSON array as an input parameter. This is the same 


JSON array that we copied from the ABI section of the Remix 
popup window, showing the details about our smart contract. 


var helloworldContract = new 
Wiel oe eel leo Tyee al ootenoly 
NEOUS alii a ne eey 
Vebiote sess lly 
“names 4) He Ions 
eve Ha) on laces a me [ 
oneness We eet 
MRO oa eda lee 
}1, 
“payaole”, false, 
stat eMucabrinty”: “view? , 
Vivioe! shine Lert) 


Moisi ecidesss cde WO lity 

"payable": false, 
MstateMutabrlity”: "“nonpayableY, 
Mey Oat) f CONS mG hole 2 


Paes 


Now we need to send this contract to the Ethereum network 
using the Contract .deploy method of the web3 library. The 
following code snippet shows how to do this. 


helloworldContract 
.deploy ({ 
data: 

"0x6060604052341561000f57600080fd5b60408051908 
TOLGO40S250600es lS 260A 00ly £E8656C6COr205 (6b 126 
c642100000000000000000000000000000000000000008 
LeZ2 D0 COCO USO SLSOGO 20019 0 GOO Ser AO Oe TOGO S65 
bSUelOLGS seo bSoZeUh4oOOleLeOU roles lol ooo 20s 66 
O02 SO0Z9I0GOO0USZ60Z2Z06000Z2Z090601LFOL6OZ09004Z 31019 
Wage sao. 6) Main MOMS AC C\e cilia esd Oar ie Op mum ICM crstore O10 Eley rose oust o JN OL0ke: 


Ooo Crovaol) OEMS HNGMLOiichororsyo:adbota MO Orenmary Sibo pz Olueletcric deal 
IS GiLOWees e757 5-5 9G O27 0e Loe oOo GGG Wis 
Solos SelM Mohs Oc U ONG cha MM CIOL SIMON Ovetel exes) ool0lSiClenerey oyenlbl OM CZ2) 
TOVSPSO sZt olottes | COO SASS COR Os 55 0:6 UO NO INGO 
0€6565b5090565b90565b6101bc806101146000396000F 
300606060405260043610610041576000357c010000000 
OODDDD0000000000000000000000000000000000000000 
O0OO0900463£fFffFLLFL168063bcdfe0d514610046575b600 
080fd5b341561005157600080Ffd5b6100596100d4565b6 
CAVUSILEOSCORU2ZOOLE Ze Oe BZ eo hel seks 76.02 0iG dros 
VSUSLIOGOCVOMI OS USess So 0DUSDS so UROUS eG LOO IS 7506 
ZOMG PS AAO 20 SOS Oa Can Oia oe oO 50S. 0.905 
OSOSMOLIOGCOLr Pe s0lSoloteos (oUSZO0S S051 GOO Le Soe 
OOS GilLOnOO Va OS Toes ls Ze OZ OOO aa 0 so 5082 20S 0 506.014 
OS POO SoU tee heli deo ui reson OO EUs 46 Odes 6 
COLNE TS 6 EOROOOZ OSE SG OOZ OO 0A SOC Odkr CANS O03 CSO @ 
ZoOZ00 E04 0S TIO SLOTCO40S260029T90STS PaZ2602 00.3 
25 05 to OU eLOO OI ibs LOMeUO ZU Se eUC2Z SUA St Lee ld 
io? SOCOM LOG LOIATS elo ovstes S40 40263529602 
OOEOLG LOI Ze65b 620 Oo UC OOO S26 OC OE OUO7Z OW bekS 
Selo 2oUCUOLUUIOSOZO00LS USS elo lS oa 462900 S601: 
S820 LI LSbSUSOStSs0Ss OS US090So5boUZ0 504051906 L016 
O40 SZ S0CO00 STS 2 SUP OSb00e lea G2iavalZsUss2038 ) a5 
da4f7e05c4ad9b45dd10fb6c133a52354led06db6odd31d 
SIS saa poees C07 Ie 
}) 
.send ({ 

FeO: 
"OxAf£9d328E8181aEn831Bc426347949EB7946A88DA', 

Gac 4 ACU OR, 

GaSPraces "ZOUU UC O000 0000" 





























hy 

LUNCELOMVerEort, Keransactvoniash 4 
Gonso los Log foie Or ry 
console, VogGEransacmuonlechiy 


}) 


SAGs Stale mmlvuguen aun e Nelerghicharckeu we) 
Cons Cler Log Ceci braet 


{ 
); 


y 


eee 


Note that the value of the field data inside the deploy 
function parameter object is the same value we received in the 
object field of the BYTECODE details in the previous step. Also 
notice that the string “ox” is added to this value in the 
beginning. So, the data passed in the deploy function is ‘Ox’ + 
byte code of the contract. 

Inside the send function after the deploy, we have added the 
“from” address, which will be the owner of the contract and the 
transaction fee details of gas limit and gas Price. Finally, when 
the call is complete, the contract object is returned. This 
contract object will have the contract details along with the 
address of the contract, which can be used to call the function 
on the contract. 

Another way of sending the contract to the network would 
be to wrap the contract inside a transaction and send it directly. 
The following code snippet creates a transaction object with 
data as the contract bytecode, signs it using the private key of 
the address in the “from” field, and then sends it to the 
Ethereum blockchain. 

Note that we have not assigned a “to” address in this 
transaction object, as the address of the contract is unknown 
before the contract is deployed. 


var tx = { 

rom: 
"OxZ2ZOIsrtroseZ90SbbrCedABb4 ps7 lorDB3sd eA"; 

Gasbrrace VAOOU OCU OCOGrT, 

Gas.) Ao OO O00er 

data: 
"0x6060604052341561000f57600080fFfd5b60408051908 
EO LGOAO S26 UGO0Cehs ZOU 7AUO i rae se FOR C eo TAOS ori 6 
c642100000000000000000000000000000000000000008 
IBS VAS ON SOLON MNCL SK OLS MN CNON MO 1OIG MEMO Now CHehsyercha CHR SMOKG I OUONSMO Resor 
SOG LOS S6abS 2305400018 PEO Fela 6 WOLOO0 206166 


OOZVU04 9060005260206 000Z09060lTFOL6GCOZ090048 1019 
ZS ZOU fOr 1 OW art 7.6 OealiG Otel Oe ee oO Iii ie eo Sale 
LEN Ohs Oket veel CLO lO OIG kcis sence Maro MOUbkenceu) she VAUMbedenseatc nek 
ES cule Oharvew cet touliokae a) ciil.eilO ONO MES ao NOR onOHe ONE SKhe MCuON eros 
CS bs bDoOUSUSOeMOOdes 2 Oboe OS 6s boUSUS6ob6 0107S 
LOO SoU S27 eG Lore oe OU SS OO S015.5:510-6) Okie sng) 
VEeeS6obs090S6Ssb90S565b61l0lbcs06lOTTLAC000S S60 00F 
30060 6060405760043610610041576000357c01 0000000 
OODDDD00000000000000000000000000000000000000000 
QOOUSOU046SEPREDPEPELOSUSGSbecadrevdsl 46 L004 os 1a b600 
OSOEGSD SATS OMOUSIS 7 CUO0SCEAS 6 IU OS 96ELO0d4S65b6 
C20 SL SO SUCOZOON SA OLS S752 55 cle lake baz GOA UO 1S Ac5 
CSGal SOSO2Z OOM USU Sse 3o00Usb3 35 WON S600 08S 73.06 
PAO a leaker MO vigs excl eZ Oop G Aes Oloie hen Cleer nse) ova fo lOhey 8 io Bele hs, 
CEOs VOIO SUT Res Okla 6 LOOC6 Ss sUa7Z US cS LOU Ors Seu 
COSEUOMOO Ca Os ave eS 60 ZOU boUle OOO Eo4 
CSS USO SOULS Sb elOUdeorOlie 36 oe oUUIlS 0 ba6 UOdke 6 
OOLTSErS6LhOrOCG02 Us LeGvoZ00G 45060 FRO le020s0 910040 
ZOUZUOMGCOAU SAGO SIO G6 O40 S27 S092 91-9 Oe Te SZ 602 001s 
ZOUDA OOO LS LGOO LAG oo LO LOO0ZUS IG 6002900 45015610 
25130 601 LOG MOI To 7 oll OO OS OS SS 404078352791 -602 
OOS Le Moly ZoaosbeZ OTS Lo poOUOS 26020 GO 002000 Ssb815 
Aol? JOOOO RG LO OSOZ OURS SSLVCG LOS 5s /s2 900350 
CeZU LOTS boUoVS0s0S0CUS 0505 6obCOZUG0405 150300 In6 
C4057 5 O06 000 sis Ze0S 0s G00 ee S62 Vala] 2 S07 Used 7a 
da4f7e05c4ad9b45dd10fb6c133a52354led06db6dd31d 
DIDS Odo beau 
}; 





























webs.e4kh. accounes -Signirensaction (tx, 
"Oxc6676b7262dabla3a28a781c77110b63ab8cd5eae2a 
5a828ba3blad28e9Ff5a9b") 
SE HenvCruUMmen hon. atone cilioey) oa 
web3.eth.sendSignedTransaction (signedT 
~~, haw ll rPeansack nom) 
SEnenlconeede. Log) 


b)e 


When we execute this code snippet, we get the following 
output, which is the receipt of this transaction. 


{ 

blockHash: 
"Oxaba93b4561fc35e062alad/2460e0b677603331lbbee 
S53 VSCSOClIAT ARC POO Deo. iy 

blockNumber: 2539889, 

contractAddress: 

“Oxdsavdis 7 73h3457 2h EF PIbRO TPAC UOMe bat os Che", 

cumulativeGasUsed: 205547, 

ACO: 
rOx2 AU L3rrroSc79O09bbrecdabbé tlds lordb34ilea;. 

dasUseds 205547, 

Logs: lly, 

Log SB Loom, 
"Ox0000000000000000000000000000000000000000000 
ODODODD00000000000000000000000000000000000000000 
OOODD00000000000000000000000000000000000000000 
OODODD00000000000000000000000000000000000000000 
OODDD00000000000000000000000000000000000000000 
OOODD00000000000000000000000000000000000000000 
OODDD00000000000000000000000000000000000000000 
OODODD00000000000000000000000000000000000000000 
OODODD00000000000000000000000000000000000000000 
OOODD00000000000000000000000000000000000000000 
OOODD00000000000000000000000000000000000000000 
OO NORO NENA TOVCIO NT 

Stearic Ose as 

jeer wiah tele, 

EVansacrronhesine 
“OsCS 55 CHC OPCS DO 6 LOG ado es oo Veh 4ey Ss 
bea69212363030d36565a", 

Evransactuoningdex =. <0 





Notice the properties of the transaction receipt object. It has 
a value assigned to the contractAddress property, while the 
value of the “to” property is null. This means that this was a 
contract creation transaction that was successfully mined on 
the network and the contract created as part of this transaction 
is deployed at the address 
* 0xd5a2d13723A34522EF7 9bEOf1E7806E86a4578E9 . 

We have successfully created an Ethereum smart contract 
programmatically. 


Interacting Programmatically with 
Ethereum—Executing Smart Contract 


Functions 

Now that we have deployed our smart contract to the Ethereum 
network, we can call its member functions. Following are the 
steps to call an Ethereum smart contract programmatically. 


GET REFERENCE 1O THE SMART 
CONTRACT 


To execute a function of the smart contract, first we need to 
create an instance of the web3.eth.Contract class with the ABI 
and address of our deployed contract. The following code 
snippet shows how to do that. 


var helloworldContract = new 
web3.eth.Contract ([{ 
VGonstant:.4 “enue: 
Daemons: sai lies 
Vrame we eich. 
Oe De ee tet 
I RAMIG gn 


ARORA Oro Nve te Ae SHGHaaE ais i 


tle 
"payable": false, 
MetateMurabialaiy's view", 
Vivioe! 2 humcw rem) 

Rien 
Mos ocideass eter IO lik 
"payable": false, 
VstaceMitabalaiy 2 monpayablet, 
MyDS. | CONS mie hore! 

b 1, 

"OxdeaZdl37Z2sAsd527br )IbRULLEy SUGK SC 6a4> oho"): 


In the preceding code snippet, we have created an instance of 
the web3 .eth.Contract class by passing the ABI of the 
contract we created in the previous section, and we have also 
passed the address of the contract that we received after 
deploying the contract. 

This object can now be used to call functions on our 
contract. 


EXECUTE SMART CONTRACT 
FUNCTION 


Recall that we have only one public function in our contract. 
This method is named Hello and it returns the string "Hello 
World!" when executed. 

To execute this method, we will call it using the 
contract.methods class in the web library. The follwing 
code snippet shows this. 


helloworldContract.methods.Hello().send({ 
eats OMS 
"OXP6e@bo3ARSIZOaFr lez 3s1libsvOss 2 76de2DIdBEss i" 
biaerenm(eonsowve boo); 


In the preceding code snippet, we have added a value to the 
“from” address in the send function, and this address will be 


used to send the transaction that will in turn execute the 
function Hello on our smart contract. 

The full code for calling a smart contract is in the follwing 
code snippet. 


Vat. Ca liiCom tack = srumebioms cae of 
var helloworldContract = new 
WeDo Sint contrac tliat 
MEO dertven \, vielen ey 
Peisrinenane cols: Siliaic, 
“names UT Heduko", 
OMe aie Sine ee 
MUTVeLIMet sg) © sy 
EV pera Siig. 
}1, 
"payable": false, 
"stateMutability": "view", 
evo Miner por! 


Abia OWSIR eestor ena (ae 

"payable": false, 
YsStateMutabilaty": "“nonpayable", 
Moyet. TOOnse hue hor! 


bl, 
"OxdSaZ2d1l3s7/23A34522HF 7 9DEOTLE7S80GHS6a45/SH9"); 


helloworldContract.methods.Hello().send({ 
BCom: 
VOx GobUSAROlZ0ab ler sibs U0 oo P6d6ZDVaRBrS sd 
iP) Menten Console tT Logr, 


a 


Another way of executing this contract function will be by 
sending a raw transaction by signing it. It is similar to how we 
sent a raw Ethereum transaction to send Ether and to create a 
contract in the previous sections. In this case all we need to do 
is provide the contract address in the “to” field of the 


transaction object and the encoded ABI value of the function 
call in the data field. 

The following code snippet first creates a contract object 
and then gets the encoded ABI value of the smart contract 
function to be called. It then creates a transaction object based 
on these values and then signs and sends it to the network. 
Note that we have used the encodeABI function on the 
contract function to get the data payload value for the 
transaction. This is the input for the smart contract. 


Wie eae cA eOThicera. <= tiie hone a(S 4 
var helloworldContract = new 
web s:-eth. ContrackGl 4 
SCoOmarant as, mnie, 
hati Owe reese em ama thal (gs 
Eagkeliiisen ee eckowil Wonk. 
Vee oabi cise ean || t 
Teer ames wee ee 
Wireroen sr cy iee merce’ 


b], 

"payable": false, 
MStateMutabrlrty™: “wrew™, 
UA GAA OFS Gann RIB RGT ONS O sin: 


Vero tess”. Seb lay 

"payable": false, 
WStateMutabiiaty”:. “nonpayable™, 
Ey Oe Hee vere imicrcnatheyneyany 


ally 
 Oxdsazdl3 7 23A34522R PF] 9DwOrIE] COGr Shade 739); 


var payload = 
helloworldContract.methods .Hello() .encodeABI () 


7 


Var tx = 4 


LOM: 
HAG Mors l erie Atoll Ore Wh Nowc dbl clonGieporenomm seller Baile te weep ollaye- 
Gas Prece =) 7 UO ORO Os 
Gace OO Ue Or 
Gate Pay foad 
he 


Webo. ell accounts ~Stgnl FancsaeuLon(rx, 
“Oxc66 Pob/2oZzdabllasazcay elec! ALIUbGsabecdseacZa 
5a828ba3blad28e9Ff5a9b") 

SEN (EUNGE won, (Sr qmed Ta). -{ 
web3.eth.sendSignedTransaction (sig 
nedTx.rawTransaction) 
.then(console.log); 

})e 

}; 


Important Note When using a public-hosted node for 
Ethereum, we should use the raw transaction method for 
creating and executing smart contracts because the 
web3.eth.Contract submodule of the library uses either an 
unlocked or default account associated with the provider 
Ethereum node, but this is not supported by the public nodes 
(at the time of this writing). 


Blockchain Concepts Revisited 


In the previous sections we programmatically sent transactions 
to both Bitcoin and Ethereum blockchains using JavaScript. 
Here are some of the common concepts that we can now 
revisit, looking at the process of handcrafting transactions 
using code. 


e Transactions : Looking at the code we wrote and the 
output we got for sending transactions to Ethereum and 
Bitcoin, we can now Say that blockchain transactions are 
the operations initiated from an account owner, which, if 


completed successfully, update the state of the blockchain. 
For example, in our transactions between Alice and Bob, 
we saw that the ownership of a certain amount of Bitcoins 
and Ether changed from Alice to Bob and vice versa, and 
this change of ownership was recorded in the blockchain, 
hence bringing it into a new state. In the case of Ethereum, 
transactions go further into contract creation and 
execution and these transactions also update the state of 
the blockchain. We created a transaction that in turn 
deployed a smart contract on the Ethereum blockchain. 
The state of the blockchain was updated because now we 
have a new contract account created in the blockchain. 


Inputs, Outputs, Accounts and Balances : We also 


saw how Bitcoin and Ethereum are different from each 
other in terms of managing the state. While Bitcoin uses 
the UTXO model, Ethereum uses the accounts and 
balances model. However, the underlying idea is both the 
blockchains record the ownership of assets, and 
transactions are used to change ownership of these assets. 


Transaction Fee : For every transaction we do on public 


blockchain networks, we must pay a transaction fee for our 
transactions to be confirmed by the miners. In Bitcoin this 
is automatically calculated, while in Ethereum we should 
mention the maximum fee we are willing to pay in terms of 
gas Price and gas limit. 


Signing : In both cases, we also saw that after creating a 


transaction object with the required values, we signed it 
using the sender’s public key. Cryptographic signing is a 
way of proving ownership of the assets. If the signature is 
incorrect, then the transaction becomes invalid. 


Transaction broadcasting : After creating and signing 


the transactions, we sent them to the blockchain nodes. 
While we sent our example transactions to publicly hosted 
Bitcoin and Ethereum test network nodes, we are free to 
send our transactions to multiple nodes if we don’t trust all 


of them to process our transactions. This is called 
transaction broadcasting. 


To summarize, when interacting with blockchains, if we 
intend to update the state of the blockchain, we submit signed 
transactions; and to get these transactions confirmed, we need 
to pay some fee to the network. 


Public vs. Private Blockchains 


Based on access control, blockchains can be classified as public 
and private. Public blockchains are also called permissionless 
blockchain and private blockchains are also called 
permissioned blockchains. The primary difference between the 
two is access control. Public or permissionless blockchains do 
not restrict addition of new nodes to the network and anyone 
can join the network. Private blockchains have a limited 
number of nodes in the network and not everyone can join the 
network. Examples of public blockchains are Bitcoin and 
Ethereum main nets. An example of a private blockchain can 
be a network of a few Ethereum nodes connected to each other 
but not connected to the main net. These nodes would be 
collectively called a private blockchain. 

Private blockchains are generally used by enterprises to 
exchange data among themselves and their partners and/or 
among their suborganizations. 

When we develop applications for blockchains, the type of 
blockchain, public or private, makes a difference because the 
rules of interaction with the blockchain may or may not be the 
same. This is called blockchain governance. The public 
blockchains have a predefined set of rules and the private ones 
can have a different set of rules per blockchain. A private 
blockchain for a supply chain may have different governance 
rules, while a private blockchain for protocol governance may 
have different rules. For example, the token, gas Price, 
transaction fee, endpoints, etc. may or may not be the same in 
the aforementioned private Ethereum ledger and the Ethereum 
main net. This can impact our applications too. 


In our code samples, we primarily focused on the public test 
networks of Bitcoin and Ethereum. While the basic concepts of 
interacting with private deployments of these blockchains will 
still be the same, there will be differences in how we configure 
our code to point to the private networks. 


Decentralized Application Architecture 


In general, the decentralized applications are meant to directly 
interact with the blockchain nodes without the need for any 
centralized components coming into picture. However, in 
practical scenarios, with legacy systems integrations and 
limited functionality and scaling of the current blockchain 
networks, sometimes we must make choices between full 
decentralization and scalability while designing our DApps. 


PUBLIC NODES VS. SELF-HOSTED 
NODES 


Blockchains are decentralized networks of nodes. All nodes 
have the same copy of data and they agree on the state of data 
always. When we develop applications for blockchains, we can 
make our application talk to any of the nodes of the target 
network. There can be mainly two set-ups for this: 


e Application and node both run locally: The 


application and the node both run on the local machine. 
This means we will need our application users to run a 
local blockchain node and point the application to connect 
with it. This model would be a purely decentralized model 
of running an application. An example of this model is the 
Ethereum-based Mist browser, which uses a local geth 
node. 

Figure 5-6 shows this setup. 


Application 
Code 





Figure 5-6 DApp connets to local node 


e Public node: The application talks to a public node 


hosted by a third party. This way our users don’t have to 
host a local node. There are several advantages and 
disadvantages of this approach. While the users don’t have 
to pay for power and storage for running a local node, they 
need to trust a third party to broadcast their transactions 
to the blockchain. The Ethereum browser plugin 
metamask uses this model and connects with public 
hosted Ethereum nodes. 


Application 
Code 





Figure 5-7 DApp connets to public node 


DECENTRALIZED APPLICATIONS AND 
SERVERS 


Apart from the previously mentioned scenarios, there can be 
other setups too, depending upon specific use cases and 
requirements. There are a lot of scenarios when a server is 
needed between an app and the blockchain. For example: 
When you need to maintain a cache of the blockchain state for 
faster queries; when the app needs to send notifications 
(emails, push, SMS, etc.) to the users based on state updates on 
the blockchain; and when multiple ledgers are involved, and 
you need to run a back-end logic to transform data between the 
ledgers. Imagine the infrastructure being used by some of the 
big cryptocurrency exchanges where we get all the services like 
two-factor authentication, notifications, and payment 
gateways, among other things, and none of these services are 
available directly in any of the blockchains. In a broader sense, 
blockchains simply make sure of keeping the data layer tamper 
resistant and auditable. 


Summary 


In this chapter we learned about decentralized application 
development along with some code exercises about interacting 
programmatically with the Bitcoin and Ethereum blockchains. 
We also looked at some of the DApp architecture models and 
how they differ based on the use cases. 

In the next chapter we will set up a private Ethereum 
network and then we will develop a full-fledged DApp 
interacting with this private network, which will also use smart 
contracts for business logic. 


References 


web3.js Documentation 


http://web3js.readthedocs.io/en/1.0/index.ht 
afin ae 

Solidity Documentation 

hitps:/ (solidity; reacthedocs.org/ . 

bitcoinjs Source Code Repository 

hbiys 77g thu. Com bi ecoim Ss /bireoin)] s=lib. 

Infura Documentation 

hips >) / ature 16, doce. 

Block Explorer API Documentation 

bhitps:/ /blockexplorer com api-ret . 

Designing the Architecture for your Ethereum 
Application 

https://blog.zeppelin.solutions/designing- 
the-architecture-for-your-ethereum- 
application—Jeecleorssl 7. 


© Bikramaditya Singhal, Gautam Dhameja, Priyansu Sekhar Panda 2018 
Bikramaditya Singhal, Gautam Dhameja and Priyansu Sekhar Panda, Beginning 
Blockchain, https://doi.org/10.1007/978-1-4842-3444-0_6 


6. Building an Ethereum DApp 


Bikramaditya Singhal: , Gautam Dhameja’ 
and Priyansu Sekhar Panda‘ 


(1) Bangalore, Karnataka, India 
(2) Berlin, Berlin, Germany 


In the previous chapter we learned how to programmatically 
interact with Bitcoin and Ethereum blockchains using 
JavaScript. We also touched on how to create and deploy 
Ethereum smart contracts. In this chapter we will take our 
blockchain application programming to the next level by 
learning how to develop and deploy a DApp based on the 
Ethereum blockchain. As part of creating this DApp, we will be 
setting up a private Ethereum network and then we will use 
this network as the underlying blockchain for our DApp. This 
DApp will have its business logic in an Ethereum smart 
contract, and this logic will be executed using a web application 
connecting to private Ethereum network. This way, we intend 
to cover all aspects of Ethereum application development—from 
setting up nodes and networks, to creating and deploying a 
smart contract, to executing smart contract functions using 
client applications. 


The DApp 


Before we jump into developing the DApp, we need to define 
the use case for the DApp. We also need to define the various 
components that will be part of our DApp. So, let’s first do this. 

The use case for our DApp is a polling application that can 
allow voters to vote on a poll published in the public domain. 
Voting using a centralized system is not very reliable, as it 
exposes a single point of data corruption and failure. So, the 
goal of our DApp is to enable decentralized polling. This way 
every voter is in control of their vote and each vote is processed 
on every node on the blockchain so there is no way to tamper 
with the vote data. While this can be easily done using the 
public Ethereum blockchain, to make our exercise interesting 
we will deploy our polling DApp on a private Ethereum 
network, and for that we will set up the private network too. 
Sounds interesting? Let’s do this. 

The first step will be to set up a private Ethereum network. 
Then, for hosting the business logic and poll results, we will 
create a smart contract that will be deployed on this private 
Ethereum network. To interact with this smart contract, we will 
create a front-end web application using the web3 library. 
That’s it. 

As per the plan just described, our DApp development 
exercise will have the following steps: 


1 Setting up a private Ethereum network 
2 Creating a smart contract for polling functionality 
3 Deploying the smart contract to the private network 


4 Creating a front-end web app to interact with the smart 
contract 


In the following sections, we will be looking, in detail, at 
each of the steps mentioned. 


Note As mentioned, we can also use the public Ethereum 
network for this DApp development. In addition to that, we 
can also use several tools like Metamask and Truffle 
framework to expedite the development of an Ethereum 
DApp. These tools, along with various others, allow us to 
manage our code and deployments in a better way. The 
reader is encouraged to explore these and other tools to try 


to find the best combination to create a comfortable and 
productive development environment for their DApp 
development. This text is primarily focussed on making the 
reader understand what goes under the hood when creating 
an Ethereum DApp, hence all tools providing abstractions 
on top of the DApp development process are kept out of 
scope. 





Setting Up a Private Ethereum Network 


To set up a private Ethereum network, we will need one of the 
many Ethereum clients available. In simple terms, an 
Ethereum client is an application that implements the 
Ethereum blockchain protocol. There are many Ethereum 
clients available on the Internet today; one of the popular ones 
is go-ethereum, also known as geth. We will be using geth for 
our private network set-up. For this exercise, we are using a 
virtual machine running Ubuntu Linux version 16.04. 


INSTALL GO-ETHEREUM (GETH) 


The first step is to install geth on our local machine. To install 
geth, we will get the geth executable installer from the official 
source https://geth.ethereum.org/downloads/ . This 
download page at the official geth website lists the installer 
packages for all major platforms (Windows, macOS, Linux). 

Download the installer package for your platform and 
install geth on your local machine. You can also choose to 
install geth on a remote (cloud-hosted) server/virtual machine 
if you do not want to install it on your local machine. 


Once geth is successfully installed on your local machine, 
you can check the installation by running the following 
command in your terminal/command prompt. 


geth version 


Depending on your platform OS and the geth version you 
have installed, this command should give an output similar to 
the following: 


Geth 
Version: 1.7.3-stable 
Gache Cormac: 


4bb3c89d44e372e6a9ab85a8be0c9345265c763a 
Architecture: amd64 

Prowocol Versions = (66s °67 | 

Network Id: 1 

Go-“Verscons -<Goles 

Operaking System: Vepnux 

GOPATH= 

GOROOT=/usr/lib/go-1.9 


CREATE GETH DATA DIRECTORY 


By default, geth will have its working directory but we will 
create a custom one so that we can track it easily. Simply create 
a directory and keep the path to this directory handy. 


mkdir mygeth 


CREATE A GETH ACCOUNT 


The first thing we need is an Ethereum account that can hold 
Ether. We will need this account to create our smart contracts 
and transactions later in the DApp development. We can create 
a new account using the following command. 


sudo geth account new --datadir <path to the 
data directory we created in the previous 


step> 
sudo geth account new --datadir /mygeth 


Note Weare using sudo to avoid any permission issues. 


When you run this command, the prompt will ask for a 
passphrase to lock this account. Enter and confirm the 
passphrase and then your geth account will be created. Make 
sure to remember the passphrase you entered; it will be needed 
to unlock the account later to sign transactions. The address of 
this account will be shown on the screen. For us, the address of 
the generated account is 
baf£735£889d603£0ec6b1030c91d9033e60525c3. The 
following screenshot (Figure 6-1) shows this process. 


author@testserver:~$ sudo geth account new --datadir /mygeth 

Your new account is Locked with a password, Please give a password, Do not forget this p 
assword. 

Passphrase: 

Repeat passphrase: 

Address: {baf735F889d603f0ec6b1036c91d9033e60525¢3} 


Figure 6-1 Ethereum account setup with geth 


Notice that we have passed the data directory as the 
parameter for the create account command. This is to make 
sure that the file containing the account details is created inside 
our data directory so that it is easy to access the account from 
the context of this directory. If we do not pass the data 
directory parameter to the geth commands, then it will 
automatically take the default location of the data directory 
(which can be different depending on the platform). 


CREATE GENESIS. JSON 
CONFIGURATION FILE 


After installing geth and creating a new account, the next step 
is to define the genesis configuration for our private network. 
As we have seen in the previous chapters, blockchains have a 


genesis block that acts as the starting point of the blockchain, 
and all transactions and blocks are validated against the 
genesis block. For our private network, we will have a custom 
genesis block and hence a custom genesis configuration. This 
configuration defines some key values for the blockchain like 
difficulty level, gas limit for blocks, etc. 

The genesis configuration for Ethereum has the following 
format as a JSON object. Each of the keys of this object is a 
configuration value that drives the network. 


{ 
“contag >: 4 
"“echainid”: 3792" 
"homesteadBlock": 0, 
"eip1l55Block": 0, 
"eip1l58Block": 0 
1 
WAEEriculey 3 2000%,, 
"gasLimit": "2100000", 
Mal loc =) -4 
"baf735£889d603£0ec6b1030c91d9033e6052 
5c3": { "balance": "9000000000000000000" } 


} 


The JSON object is primarily constituted by a config section 
having values specific to chainId and block numbers related to 
some of the forks that have taken place. The important 
parameter to note here is the chainId, which represents the 
identifier of the blockchain and helps prevent replay attacks. 
For our private chain, we have opted for a random chainId 
3792. You can choose any number here different from the 
numbers used by main net (1) and the test nets (2, 3, and 4). 

The next important parameter is the difficulty. This value 
defines how difficult it will be to mine a new block. This value is 
much higher in the Ethereum main network, but for private 
networks we can choose a relatively smaller value. 


Then there is gasLimit. This is the total gas limit for a block 
and not a transaction. A higher value generally means more 
transactions in each block. 

Finally, we have the alloc section. Using this configuration, 
we can prefund Ethereum accounts with the value in wei. As we 
can see, we have funded the same Ethereum account that we 
created in the last step, with 9 Ether. 


RUN THE FIRST NODE OF THE PRIVATE 
NETWORK 


To run the first node of the private blockchain, let’s first copy 
the JSON from the previous step and save it as a file named 
genesis. json. For simplicity, we are saving this file in the 
same directory that we are using as the data directory for geth. 

First, we need to initialize geth with the genesis. son. This 
initialization is needed to set the custom genesis configuration 
for our private network. 

CD to the directory where we have saved the genesis. fon 
file is 


cd mygeth 


The following command will initialize geth with the custom 
configuration we have defined. 


sudo geth --datadir "/mygeth" init 
genesis.json 


geth will confirm the custom genesis configuration set-up 
with the output in the following screen-shot (Figure 6-2). 


quthor@testserver;~/mygethS sudo geth --datedir "/mygeth" init genesis. json 





INFO [02-11117:45:32] Allocated cache and file handles databasea/mygeth/geth/chaindate cache=l6 handles=l6 
INFO (@2-11117;45;32] Writing custon genesis block 

INFO [62=11117:45:32] Successfully wrote genesis stote database=chaindata hash=294e0a..1 F407 

INFO (@2-11117:45:32] Allocated cache and file handles databasea/nygeth/geth/Lightchaindata cache=16 handles«16 
INFO [(@2-11117:45:32] Writing custon genesis bleck 

INFO [02-11117:45;32] Successfully wrote genesis state database=lightchoindata nash=254e00.1f4a07 


Figure 6-2 Initialize geth with configuration in genesis. json 


Next, we need to run geth using the following command and 
the parameters. We will look into each of these parameters in 
detail. 


sudo geth --datadir "/mygeth" --networkid 8956 
--ipcdisable --port 30307 --rpc --rpcapi 
"eth,web3 ,personal,net,miner,admin,debug" -- 
rpcport 8507 --mine --minerthreads=1 -- 
etherbase=0xbaf735£889d603£0ec6b1030c91d9033e6 
0525c3 


Let’s look at each of the parameters that we gave to the geth 
command. 


e datadir: This is to specify the data directory just like we 
did in the previous steps. 


e networkid: This is the identifier of the network, which 
differentiates our private blockchain with other Ethereum 
networks. This is similar to the chainId we defined in the 
genesis.json file but provides another layer of 
differentiation among networks. As we can see, we have 
used another custom number for this value. 


¢ ipcdisable: With this parameter we have disabled the 
interprocess communication port for geth so that while 
running multiple geth instances (nodes) on the same local 
machine we should not encounter any conflicting issues. 


e port: We have selected a custom value for the port to 
interact with geth. 


e rpc, --rpcapli, --rpcport: These three parameters define 
the configuration for the RPC API exposed by geth. We 
want to enable it; we want 
eth,web3,personal,net,miner,admin,debug geth APIs 
exposed over RPC; and we want to run it on a custom port 
8507. 


¢ mine — minerthreads — etherbase : With these three 


parameters we are instructing geth to start this node as a 
miner node, limit the miner process threads to only one 
(so that we do not consume a lot of CPU power), and send 
the mining rewards to the Ethereum account that we 
created in the first step. 


That’s all the configuration we need at this time to run our 
first geth node for the private network. 

When we run this command with all the parameters, geth 
will give the following output (as in the screenshot shown in 
Figure 6-3). 


outhor@testserver:-/imygethS sudo geth --dabadir “/mygeth” --networkid 8956 --ipodisoble --port J0387 --rpc --rpcapi “eth,meb3 personal net miner a 
Grin,cebug’ --rpcport ESO? --nine --minerthreadsel --ctherbosceabat7{SfSssHosiVeceblasssldaatichys2sc4 


THFO [82+22119;00,55) Storsing peer-to-peer node instorcewGek v1, 7,3-stuble-dboscG9d/Tirux-uwb4/gol 9 

IWF [02-13118:00:55) Allocated coche ond file handles dotorasem/mygeth/geth/chaindeta cocheel2a hovclese1624 

WARM [82-11118;00:55) Upgrading database to use Lookup entries 

TWFO [P2-11118:00:55) Tai tial ised chain cori guration eontige"{CratalD: 3792 Homestead: @ OAD: <nil> CMOSmpert: folse ETPLSG: <nil> ETPI 
55: © EIPISa: @ Byzontiun: <nil> Engine: unknown" 

IMFO [02-11118:08:55) Database deduplicokion successful deduondeb 

THRO [87-11119;00:55) Disk storage ermbled for ethesh caches — dira/myeti/geth/ethash courted 

TWP [82-11118:09:55) Disk storage enabled for ethosh (és dire/nome/author/.ethosh counts? 

THRO [B2~1111H:@0:55) Inttialising Elereut protocol wer'siorée” [G3 G2)" networked56 

TWO [B2-11119;00:55) Loeded most recent local header rumers hase? tdeniee 


IMFO [02-11118 08:55) Loaded most recent local full block numoere® haste tdeet litany tia 2iee 

IMFO [02-11118;00:55) Loaded most recent local fast block numbereD has mtSeeda Litoa? (dace 

TWO [87~11119:00:55) Regenerated local trasaction Sourral — teansactionsed ncttertsed 

THPO [02-11118:03:95) Starting P2P networking 

THRO (02-11118:00:57) UOP Listener up S01 femode: //ePRnSaeShln2579904 Fabbal [7cchADheadosehto225clalchlaves 1954 74d741Sf 308 
Fo FeefuS Rcd 7 2297301 MDG e SRN eR T LIS Bde 7 OZ be GEL; 5): 38907 

TWAO [82-12118;00:57] RLPx Listener up sel feerode: //eO3b0eSbLb25799H Flbbdf F7ccha bec tesedde22ScidlchlaléS19H 74d 41s Fes 
MbFogl CSSEES7ZAITIULMEDGICG SING CE ZEISUL PHOS EET D RAIL |: ]: VII 

TWO [82-19118:00:57) HTTP endpoint opened: tty: //127,0,0, 1; B87 

IMFO [82-11118:00:57] Transaction pool price threshold updoted price=18RbUEeY 

IWFO [@2-11118:00:57) Starking mining cperatton 


TWO [82-19118 00:57) Commit ew mining work rynneral txsel) unclesed elopsedald2ps 
THPO [€2-11118:00:89) Generating O46 im progress epocned percertogeed clapsede?38.27 ins 
THFO [87-11158:@1:08) Generating OMG im prageess epacred percontagnel ¢laasedel 5925 


Figure 6-3 Geth run first node 
Note the UDP listener up log statement in the output. 


INFO PO2—1 1) e200. 57] UDE listener: 
upself=enode: //e03b50e9b1b2579904£2bbdf£7dd082 
6bd4e4eb2e225cl1dicb1a765195474d7418f3e8fbfeefd 
55bd85722973d17626£0e53208c62e38d1099bb583e702 
b3b48@[::]:30307 


This contains the address of the node we just started. To 
connect other nodes to this node we will need this address. 


Let’s keep it noted at some place. The following line has the 
extracted address from the previous log statement. 





enode://e03b50e9b1b2579904f2bbdff7dd0826bd4e4e 
b2e225cldicb1a765195474d7418 f3e8fbfeefd55bd857 
22973017626f0E53208c62e38d1099bb583e702b3b48@ [ 
eral | eevee TOBY: 





Note the [::] before the port number we defined in the 
command. Let’s replace this with the local host IP address if we 
are running the other node on the same machine, or else 
replace it with the external IP address of the machine. As we 
are going to run the other network node on the same machine 
(for development purposes), we will replace it with the 
localhost IP address. So, the address of the first node will 
finally be 


enode: //e03b50e9b1b2579904£2bbdf£7dd0826bd4e4e 
b2e225c1d1cb1a765195474d7418£3e8 fbfeefd55bd857 
22973d17626£0e53208c62e38d1099bb583e702b3b48@1 
27.0.0.1:30307 


RUN THE SECOND NODE OF 
THE NETWORK 


There is no network with just one node; it should at least have 
two nodes. So, let’s run another geth instance on the same 
machine, which will interact with the node we just started, and 
both these nodes together will form our Ethereum private 
network. 

To run another node, first of all we need another directory 
that can be set as the data directory of the second node. Let us 
create one. 


mkdir mygeth2 


Now, we will initialize this node also with the same 
genesis.json configuration we created for the first node. Let’s 


create another copy of this genesis.json file and save it in the 
new directory we created earlier. Let’s also CD to this directory. 
Now, let’s initialize the genesis configuration for the second 
node. 


sudo geth --datadir "/mygeth2" init 
genesis.json 


And, we will get a similar output as we got for the first node. 
See the screenshot below (Figure 6-4). 


author@testserver:~/mygeth?$ sudo geth «-datadir "/mygeth2" init genesis. json 
WARN [02-11128:19:15] No etherbase set and no accounts found as cefoult 


INFO [02-11128:19:15) Alloceted cache and file handles dotabase=/mygeth2/geth/chaindata cacheel6 nandles=16 
INFO [(02-11128:19:15) Weiting custon genesis block 

INFO [@2-11118:19:15] Successfully wrote genesis state detabase=chaindata hash=294e0a_1f4aa7 

INFO [@2-21118:19:15) Alleceted cache and file handles dotabase=/mygeth2/oeth/Lightchatndate cacht=16 handles=16 
INFO [2-21116:19;15] Writing custon genesis block 

INFO [2-21118;19;15] Successfully wrote genesis state detabaseelightchoindata hashe?Me0a..1fdea? 


Figure 6-4 Geth initialize configuration for second node 


Now our second node is also initialized with the genesis 
configuration. Let’s run it. 

For running the second node, we will pass a few different 
parameters to the geth command. This second node will not 
run as a miner, so we will skip the last three parameters from 
the command that we gave to the first node. Also, we want to 
expose the geth console while running this node, so we will add 
a parameter for that. The command for running the second 
node will be 


sudo geth --datadir "/mygeth2" --networkid 
8956 --ipcdisable --port 30308 --rpc --rpcapi 
"eth,web3 ,personal,net,miner,admin,debug" -- 
rpcport 8508 console 


As we can see, the data directory and ports have been 
changed for the second node. We also have added the console 
flag to the command so we can get the geth console for this 
node. 


When we run this command, the second node will also start 
running and we will see the following output in the terminal 
(Figure 6-5). 


outhorPtestserver:-/mygeth?$ sudo geth --datacir */mygeth?" --networkid 8956 --ipedisable --part 30304 --rpe --rpcapi “oth ,web3,p 
ersonal net,miner,adrin,cebug” =-rpcport 8508 console 
WARN [02-12118:20;27] No etherbase set and no accounts found os default 


INFO [@2-12118:20:27] Storting peer-to-peer node instancesGeth/v1, 7, 3estcble-4bb3cB3e/Linux-andb4/gol,9 

INFO [@2-12118:20:27) Allocoted coche and file nondles datavuseev/inypeth2/geth/chaindota cachee12é hondles=l@24 

WARM [@2-12118:20:27) Upgrading datubase to use lookup entries 

INFO [(82-12118:26:27) Initiclised choin configuretion config="{QhoinID: 3792 Homestead: @ O40: «il» DMSupport: false E 


IP150: <nil> ETPISS: @ EIP1S8: 8 Ayzentium: <nil» Engine: unknowi}” 
INFO [02-11118:20:27] Disk storage enabled for ethash caches  dita/mygeth2/qeth/ethash courted 
INFO [O2-11118:20:27] Disk storage enodled for ethash Dads dira/home/author/.ethash courte? 


INFO [O2-11118;20:27) Initiolising Etherevn protocol versionse"(63 62)" nelworkeS956 
INFO [@2+11118;20:27) Database decuplication successful Gecupeced 
INFO (@2-12118: 20:27) Loaded most recert local header farbore@ hasheZ4eba1f4aa7 tdeZdOe 


TNFO [02-12118:20:27] Loaded most recent local full block furbored hashe2S¢eha_ifdaa? tie? AO 
THFO [02-12118:20:27) Loaded most recent local fast block nurbored hashe2Séeha_ifdaa? tin2 iO 
TNF [0%-12.118:20:27) Regenerated Lacal transection journal — transactionset occruntsed 

INFO [@2-12118:20:27] Sterting P2P networking 


INFO [@2-12118:20:29] UOP Listener up selfmerode://e7badcalbtebS2eddbbSa9Sedca2tbdeB242Weab/bbadesOIs24 
F2S2207S45SSb 380 faIWIdeeaI6? 377 FSbSeS3oe@adal? 7¢979SF 284067 3f FoleS 943 3eGG8[: :) : 0108 
INFO [82-12118:20:29) RLPx Listener up sel feenode: //e7badobdteb92au6h5a9 Sedca226ue824230cub7b bod e403524 


32522075d555b38u FoI deea367377 FSbScS3meada3 779795 F 28407 Sf FolcSMMS3eG6HE( ; 2] : 30308 
TWFO [827-15118:26:29) HTTP erclpoint opened: htto://127.0.8.1:8508 
Welcome to the Geth JavaScript console! 


instonce; Geth/v1.7,3-steble-4bb3c83e/Timx-andé4/gol 
eodules; adnia;3.@ debugs1.0 eth; 1.8 mingr:].0 ret;].0 personal:1.¢ rpc: 1,0 txpool; 2.0 web3;1,0 


>t 


Figure 6-5 Geth run second node 


At this time, both our geth nodes are running but they do 
not know about each other. If we run the admin. peers 
command on the geth console of the second node, we will get 
an empty array as the result (Figure 6-6). 


> admin.peers 


(J 


> 


Figure 6-6 Geth console—-check for peers 


This means that the nodes are not connected to each other. 
Let’s connect the nodes. To do this, we will send the 
admin .addPeer () command on the geth console of the 
second node with the node address of the first node as the 
parameter. Remember we noted the address of the first node 


after running it. Let’s run this command in the second node’s 
geth console. 


admin .addPeer ("enode: //e03b50e9b1b2579904£2bbd 
f£7dd0826bd4e4eb2e225cl1d1icb1a765195474d7418f3e 
8fbfeefd55bd85722973d17626£0e53208c62e38d1099b 
b583e702b3b48@127.0.0.1:30307") 


And as soon as we run this command on the second node, it 
returns true. Also, after a few seconds it starts synchronization 
with the first node. The following screen shot (Figure 6-7) 
shows this output from the console of the second node. 


#3A440588_1_En_6_Fig7_HTML.jpg 


Figure 6-7 Geth console—add peer node 


Both our nodes are now connected and our private 
Ethereum network is up. To further verify this, we will run the 
admin. peers command again on the second node and this 
time we will see the JSON array with an object showing the 
first node as the peer (Figure 6-8). 


> admin. peers 
if 
caps: ["eth/63"], 
id: "e03b50e9b1b2579904 f2bbdf f7dd@826bd4e4eb2e225c1d1ch1a765195474d7418f3e8 fbfeefdSSbd 
85722973d17626FGe53208c62e38d1099bb583e702b3b48", 
nome: “Geth/v1.7.3-stable-4bb3¢c89d/Linux-amd64/901.9" , 
network: { 
localAddress; "127,0,0,1;53790", 
remoteAddress: "127.0,0,1:30307" 
}, 
protocols: { 
eth: { 
difficulty; 120652076, 
head: “@xSlidfe69b3e05360baSdebO73e6c34601d6e7266298ccf4c4407006683db9285", 
version: 63 
} 
} 
}) 


Figure 6-8 Geth console—check for peers (again) 


The following screen shot shows the terminal windows of 
both the nodes we’ve set up. On the left is the first node, which 
is also a miner node, and as we can see it is constantly mining 
new blocks. The second node is on the right and we can see it is 


is too small to read because of too much information in it, but it 
just captures and shows the logs from both Ethereum nodes 
side by side. 


TWO (22-13119-46:17} Succenafitly rected ven stock 
10 CRANES AB AT) Cliheck reached carendice chain 


TWO (22-1014: 47} Comet cow weving work 


IMO (22-127) Sarcosutally wacted sew Stock 
WO (82-13119-46;22) reached concetcet chain 
190 (Q2-11e19AB 122) * mead gotentie’ Blsoe 

1860 CARVING MH /AZ] Coal t vw wivieg ment 

1o.2hee 


IO (Bel: ED Soucesn*al ly senled ven sloek 
1680 CRINGE) Pode reaches carmelcal <rain 
IMFO (22-3501%-4:22) “erinnd pateetict block 

TWO (RE+1IN98:22) Cowe.t raw wering vert 


THO (R2-1INL9NG: 95) Soccomfally weld ren flock 
IMO (22-126: 45) reathed caneetcal chain 
TWO CRR1SH1G 5 IS) A prieend gentid jek bilo 

TWO (R2-131-46: 35) Comet raw aiaing ork 


oe 

Jute (RAAB 1A) SomeeneFel ly seehed ees glock 
10 CASH: MY Gbideck reached careelcak chain 
IPO (22-22019-86:45) “mrinad cotentict block 

WW CREDITS Mh 2K) pel few wining mat 


IMO (R2-1,01245: 49) Saccenntally eecled ton slack 
two (Rtn 1.2 48} sonnel reached cornice cain 


Ieee (2-35 bisa 

mo Roakee. Com.t row wiring nork 
16.3 

150 CRRASHG A AD Soccesetel ly tected tem glock 
160 [RD-IIELO 4a Pow reached corwrtcal chain 
1060 (RR 19- 4508) “ erie! potent io’ block 

[he (R24 a bAGO ALON) Comme nee wining nore 


Oma 

TPO (BR-1121945:42) Soccenstel ly secled rev sloct 
wa SEG MA) Gbdeck reached carwelcet chain 
mo 311946242} “mined potenti’ block 

IMO (R21: AZ} Comet now muving week 


WO (R2-4101946:45) Saccomefully wecled cen lock 
who (0t-11199:45) reached coneriont chain 
imo (R-abGH LES) “eens poteetiel Dinoe 

TWO CR-AEMAG) Comet ree wining neck 


a 

1S CRAG MAT] Secretly vented ew Wlock 
180 CARLIE] Coed reacted conericet chain 
IMO (22-11015-46:45) “mined patenticl block 

Wh (BRI 2119. 45.5) Cow t raw wining nerk 








Figure 6-9 Geth logs from both Ethereum nodes 


Now that both nodes are peers to each other in the network, 
we have a working private Ethereum blockchain with two 
nodes. We also have an Ethereum account that is set as a miner 
and also is prefunded by some Ether amount. We can now 
create more accounts and pass Ether among them on this 
private blockchain. 


In this section we learned how to set up a private Ethereum 
network with two nodes. This can be any number of nodes; we 
just need to follow the same process for each new node. In case 
of remote nodes, we should be careful about specifying the 
right IP addresses of the remote machines and we should also 
make sure that the required ports are opened if there is a 
firewall preventing traffic to the machines. 


Creating the Smart Contract 


Now that we have the private Ethereum network set up and 
working, we can move on to the next step of creating a smart 
contract for the polling functionality of our DApp. We will then 
deploy this contract to our private network. We will follow the 
same steps of creating and deploying a smart contract as we did 
in the last chapter. 

Let’s fire up the Remix online IDE and code our smart 
contract in Solidity. 

The following Solidity code snippet shows the smart 
contract we have coded for the polling functionality. 


pragma solidity *0.4.19; 


contract Poll { 
event Voted ( 
address voter, 
uint value 


); 
mapping (address => uint) public votes; 


string pollSubject = "Should coffee be 
made tax free? Pass 1 for yes OR 2 for no in 
the vote function."; 


function getPoll() constant public returns 
(string) { 


return pollSubject; 
} 


function vote(uint selection) public { 
Voted (msg.sender, selection) ; 


require (votes[msg.sender] == 0); 
require (selection > 0 && selection < 
3); 
votes [msg.sender] = selection; 
} 
} 


Now, let’s analyze this contract source code to understand 
what we have done here. As we can see, the name of the 
contract is Poll. 

The next line of code is 


event Voted ( 
address voter, 
uint value 


Me 


The preceding code snippet is basically declaring a smart 
contract event that takes two parameters: one is of the type of 
Ethereum address and another is of the type of unsigned 
integer. We have created this event so that we can capture who 
has voted what in the poll. We will come back to this later. 

Next, we have 


mapping (address => uint) public votes; 


The preceding line of code declares a mapping of Ethereum 
addresses and unsigned integers. This is the data store where 
we will be storing the voters’ addresses and their chosen value 
for the vote. 

Then we have the following: 


string pollSubject = "Should coffee be made 
tax free? Pass 1 for yes OR 2 for no in the 
vote function."; 
function getPoll() constant public returns 
(string) { 

return pollSubject; 
} 


The preceding code snippet first declares a string for the 
polling subject. In this we are asking a question of the voters. 
And then we have a function that can return the value of this 
string so that voters can query what the poll is about. 

And finally, we have the function that implements the 
voting functionality. 


function vote(uint selection) public { 
Voted (msg.sender, selection) ; 


require (votes[msg.sender] == 0); 
require (selection > 0 && selection < 3); 
votes [msg.sender] = selection; 


Examine closely each line of the preceding snippet. 

First, as soon as we enter this function, we are raising the 
voted event we created with the values of the sender’s address 
(voter) and the value he has chosen. 

Next, we are limiting one vote per voter by checking if the 
value of the vote is zero for the corresponding address in the 
mapping. The require statement is used to check conditions 
based on user inputs. 

And then we are also limiting, by using the require 
statement, the value of the selection to either 1 or 2. 1 is a yes 
and 2 is ano. And we have passed these instructions in the 
pollSubject string so that the voters know what to do. 

The screenshot in Figure 6-10 shows the smart contract in 
Remix, 


We compiled this contract code using Remix and we took 
the ABI and byte code for the contract so that we can deploy it 
to our private network. We copied the bytecode and ABI from 
the respective sections in the details popup of the Remix 
compile tab—exactly how we did this in the previous chapter. 


ose 6c 4% ae 


*broweer 
pulled 


* brrowser/pollsot * 


1 proges colidity 9.4, Sr 


5+ contract Pull ( 
‘ “ahve “Nabe 


5 addracs voter, 

6 viet wolue 

, % 

$ 

9 mapplngiadirace <- sirt) pubis: woten; 

Ww 

i shel pallS.cigect © “Pemtd coffee be wate tee Coen? Senet 1 Tor yes 1B 2 for wy in bee ante f 
nu 

ph function grt*oll) coratort ceritc raterra Catrina? | 
i sewn ort lsusinct 

"5 } 

16 

Vv function vatsiuunt Selectise! sophie | 

a Yored(ecg,conzer, celertter) 

W 

a sopire Sarten[rsg senier)  @) 

éi soles foelectlor » @ 4S celecticn «25 

Zz votar[enj. sender) ~ selection; 

“s ! 

™) 


> Crrete tn Sethe Aewhnh Conger port 


Sionesrpe GO uatorge 


wet Dead bondi 


Pies 


Figure 6-10 Smart contract editing in Remix online Solidity editor 


The ABI of the contract is 


"CGOnetamt 9: niLEiue, 
Daou | 


{ 


wey 
y 


"name": 
"type": "address" 


J, 


“names “votes, 
Mowiep wis. +e 


{ 


“Haine 2 56: 


"name": 
"type" : 


l, 

"payable": false, 
stat ecMiutabriviny a. view, 
VEVOer os OR UIcie Oris 


WEOiMot aiite ss) aoe: 
J Sriigy one mesial (6 
"mame + 'gebPoli™, 
Lcsnisiic eubhetvs y || 
if 
Mame’ UM, 
Wie yioe ae Sic raier 


l, 
"payable": false, 


"stateMutability": "view", 
My ets Mab iiete a ore 
ManOnymoOus = false, 
MOsrigo uric tall 
{ 
"indexed": false, 
TVA he suey 
VEype' 2 “address” 
Ins 
{ 
"indexed": false, 
A emnie eS ranlien 
Oe ay TP Misionie A om 
} 
le 
“Hames = Wromed 


"type": "event" 


WEG alin 4+ ahaa: 


gation enotierouas dill 
{ 
"Heame 4) Selections. 
ICA ACL eae auece ining G By nor oe 
} 
] y 
Wiame iviores 
OW Ue one Maley 
"payable": false, 
"stateMutability": "nonpayable", 
Din iOce ta Uo i rorie 


And the byte code for the contract is 


"linkReferences": {}, 

Mobyect: 
"606060405260806040519081016040528060508152602 
0017£53686£756c6420636£66666565206265206d61646 
52074617820667265653£2081526020017£53656e64203 
120666£7220796573204£52203220666£72206e6£F20696 
e20746881526020017£6520766£74652066756e6374696 
£6e2e00000000000000000000000000000000815250600 
1908051906020019061009c9291906100ad565b5034156 
100a857600080£d5b610152565b8280546001816001161 
56101000203166002900490600052602060002090601£0 
16020900481019282601£106100ee57805160f££F1916838 
00117855561011c565b8280016001018555821561011c5 
79182015b8281111561011b57825182559160200191906 
0010190610100565b5b509050610129919061012d565b5 
090565b61014£91905b8082111561014b5760008160009 
05550600101610133565b5090565b90565b61037380610 


1616000396000£30060606040526004361061005757600 
0357c01000000000000000000000000000000000000000 
00000000000 NNNNNN900463FLLLLLLL£1680630121b93F1 
461005c57806303c322781461007£578063d8bf£5a5146 
1010d575b600080£d5b341561006757600080£d5b61007 
d600480803590602001909190505061015a565b005b341 
561008a57600080£d5b610092610273565b60405180806 
0200182810382528381815181526020019150805190602 
0019080838360005b838110156100d2578082015181840 
1526020810190506100b7565b505050509050908101906 
01£1680156100££5780820380516001836020036101000 
a031916815260200191505b50925050506040518091039 
0£35b341561011857600080£d5b610144600480803573£f 
ELEPECELELE EEE CEP CES EC EE CLEP E Cece ec rec lL 6o0G02 
001909190505061031b565b60405180828152602001915 
05060405180910390£35b7£4d99b957a2bc2 9a30ebd96a 
Tbe8e68 fe50a3c701db28a91436490b7d53870ca433826 
OSO051BOSS/SErELELTICERELT ELE EEE ELE LEE EEE Ce Eecerre 
PrELelo7StLecirrrrecetirEpeei trier rector Eee er erer 
£££1681526020018281526020019250505060405180910 
S90aLGO0OS0S000SS /SEELEEELLEELEELEErIrCEr PCr ecee 
PEELE ELE EELS 6 /SLECEELCEECLErCEroCeecErrecererer$ 
f£fLLLfLfffLF16815260200190815260200160002054141 
51561021257600080£d5b6000811180156102225750600 
381105b151561022d57600080fd5b806000803373ffffLF 
ELEPLEEEC EEE CECE SEES EPEC ELE ELELEL Le SEELEEEE 
ELELEELeCcCLEeLCrCrCrLCrceecrcerceececrcercrcrrl16st526020019 
081526020016000208190555050565b61027b610333565 
b600180546001816001161561010002031660029004806 
01£0160208091040260200160405190810160405280929 
1908181526020018280546001816001161561010002031 
66002900480156103115780601£106102e657610100808 
354040283529160200191610311565b820191906000526 
020600020905b815481529060010190602001808311610 
2£457829003601£168201915b5050505050905090565b6 
0006020528060005260406000206000915090505481565 


b6020604051908101604052806000815250905600a1656 
27a7a72305820ec7d3eldae8412ec85045a8eafc248e37 
ae506802cc008ead300dflac81aab490029", 
MOOCOGdes 2 “OPUS UxeO) PUSH Ox4 0. MS TORE 
PUSH] 0x80 PUSH] 0x40 MLOAD SWAP1 DUP2 ADD 
PUSH Os 0 UMS TORE DUP Ie PUSH 16250) DUP Z Me roR i 
PUSH Me O22) ADD PUSHSZ 
OxS3666H 1 56C64 706s ooGC CD Oo2 GZ 65 20GDE Led 6520 
TACT C2 0667 2656593ER20" DUPZ MSTORE. PUSHY 0x20 
ADD PUSH32 
UxSS6 56H C4203 1 2066CE 1220 796s S2U4r 52203220606" 
T2206E6F20696E207468 DUP2 MSTORE PUSH1 0x20 
ADD PUSH SZ 
0x6520766F74652066756E6374696F6E2E000000000000 
O0000000000000000000 DUP2 MSTORE POP PUSH1 Oxl1 
SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAPI1 
USH2 0x9C SWAP3 SWAP2 SWAP1 PUSH2 OxAD JUMP 
UMPDEST POP CALLVALUE ISZERO PUSH2 OxA8 JUMPI 
USHIS Cx0 DUP REVERT UUMPDEST PUSH? Uxik52 
UME, JUMPERS. “DUPS DUPE SLOAD PUSH Dal DUPZ 
USE ase VANE oA RO: teu SEZ wOre OO SIMiLL swiss AND 
USE (0x2. SWAPIL DIV SWAP) (PUSH! Gx0) MS TORE 
USHE 0x70 PUSH Ox0 KRCCARZS6 SWAPL PUSH 
x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 
UPS PUSH! UxtE LT PUSHZ OxRE-JUMPL UPL MEOAD 
USH1 OxFF NOT AND DUP4 DUP1 ADD OR DUP6 
SPORE: PUSH 10sie = JUMP Me DES DU Pe WPals ADTs 
USH Gs ADD DULG SS TORE. PUPS KoA RO PUSH 
Ox LikeC- JUMP SWAPZ DUPS ADD JUMPDEST PUPS: DUPZ 
Gr PSZERO. PUSHZ Ox1lIB JUMP DUPS MLOAD DUES 
SSTORE SWAP2 PUSH] Qx20 ADD SWAP2 SWAP1 PUSH1 
Ox! “ADD: SWAP PUSHZ Ux100) JUMP JUMPPEST 
JUMPDEST POP SWAP1 POP PUSH2 0x129 SWAP2 SWAP1 
PUSH2 0x12D JUMP JUMPDEST POP SWAP1 JUMP 
JUMPDEST PUSH2 OQx14F SWAP2 SWAP1 JUMPDEST DUP1 
DUPS Gl Post Ro PUSH? (Ox 4EBe0UMPr PUSH EIOx0 











vnmwevuomtuUy ata ty 


DUE PUSH Ue SWAP 25.5 TORE ROP Pu SEO le Ado) 
PUSHe Osis oP UMP DE ode AP GHP so Wier ees UiMie 
JUMPDES TE SWAP) GUMP DUMPDE SD PUSHZ 0x3 72. DUP I 
US Fiz 0s. OM ce Sie Osa Ose One Gee eEwS Hun ae 0) 
RETURN STOP PUSH Ux6o0 PUSHT 0x40" MSTORE .PUSHL 
Ox4 CALLDATASIZE LT PUSH2 0x57 JUMPI PUSH1 0x0 
CALLDATALOAD PUSH29 
OxLOQDDONDDODDDDODDDDDNDODDNDDNDDODDNDDOND00000000 
OOOQO0Q00000000 SWAP1 DIV PUSH4 OXFFFFFFFF AND 
DoE RU SHA SOscG7 EEO Si We BU ti) B55 Cor ME ee) bal 
PUSHAO<3C37276 OS PUSH. (sche UMP DURE ees HA 
OxDEB EP OAS HO. PUSHA Osh UME T UME DEST PUSH 
OxO DUP1 REVERT JUMPDEST CALLVALUE ISZERO 
BUSHZ] Oxo. JUME® PUSHIC U0 DU Pal REV Ral 
JUMPED Si SPUSH2 Os PP SHie 104 0 Pals Duves 
CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP2 
SWAP POPS POP PUSHZ Ox lea JUME SUMP DEST = Ss 7@P 
JUMPDEST CALLVALUE ISZERO PUSH2 Ox8A JUMPI 
PUSS 00 DUP REVERE UMP DES ly ePuS He Ox 2 
PUSHZ3027)73 JUMP WUMPDiS T PUSH 6x40) MbOAD 
DUEL DUP EU Sel 0s ADD wD SU Poe sUE DUES 
MSTORE, DUES DUPZ DUPZ MEOAD DUPZ MSTORE, PUSH 
Ox20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 
ADD? SWAP DUPIADUP 4 DUP A PUSH (Ux SUUMP DES 
DUES DURA hi Leah RO. Pier sch 2 huis Ue hes 
ADD MLOAD DUP2 DUPS5 ADD MSTORE PUSH1 Ox20 DUPZ2 
ADD SWAP POP PUSHZ Oxs] JUMP IUMPBE ST POP POP 
POPS POP SWART POP Sib ue Abs owe WGP US rN 
G5c1F SANE UE! ls Os VES bi Ose acer ehP Ie Are: ll 
DUES -oUB EET MOA eUrSriy Ose Su Py AP Urs Hila a0) 
SUB PUSHZ 0x00 Exe SUB NOt AND DUEZ MS TORE 
PUSH Ox20 ADD SWAPZ, POP VIUMPDE SY POP SWAPS 
POP HOP SP Ors US Hl O24 0 MEOAD (DUE Sik Zo2,5 Ue 
SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 
Csi CUM PAs PUSHES 0 (DUP IO SR EVR UMP Dk Sie 
PUSH2 0x144 PUSH1 0x4 DUP1 DUP1 CALLDATALOAD 





PUSHAG 
OXPRPRPRERPRRPRPRPRFEFRRFRFRFREFRFRFREFRFRFFREFREFEFEFE AND 
SWAP1 PUSH1 0x20 ADD SWAP1 SWAP2 SWAP1 POP POP 
PUSHZs Ox318 DUMP UMP DiS T Push 6x40) MEOAD 
DUEL DUS. DUES MSTORE PUSHIN 270) AbD SWwAPZ POP 
POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 
RETURN DUMPDEST PUSHS2 
Ox4D99B957A2BC2 9A3 0EBDI6A7BE8E68FE50A3C701DB28 
A91436490B7D53870CA4 CALLER DUP3 PUSH1 0x40 
MEOGAD DUP “DUP4 PUSHZD 
OXFPRPFRRPRFRERFRFRERPRPRFREFRFREFREPRFRFREFRPRFREFREFEFEEE AND 
PUSHAD 
OXPRPRPRPRPRRPRPRFRFRRFRFRFRERFRFRPRFRRFREPREPRPPEFREFEEE AND 
DUEZ. MS TORE PUSHIN 0220) ADL: DURS WU PZ, MS PORE 
PUSS TL O27 tab Dy SWAPS POP POPs POP. Push lst s<40 
MEOADS DUP SWAPZ SUB SWAP LOGT BUSH 020) BUPL 
PUSH. (030) (CATER sPUSHAO 
0 
Ee 





eel ecb Mca cylalekinhedlRcciemlelen cM cyleelnpls deulmlae ch cklaMadeticbinuleelioalng cnc: meet) 
USHZO 
OXPRPRPERPRPRRPRPRPRFRFRFRPFRFRPFRFRPFREPREFRPFREFEFEFEFE AND 
DUEZ MSTORE, PUSH x70 Abb SWAP) DUPZ MSTORE 
PUSH Ox20 ADD PUSHL 0x0 KECCAKZ56 SEOAD HO 
PAO. Sat RO Pie HAZ 1 0soA UME Pes re Osc Os ues 
REVERS JUMP PRS) PUSH 020) PUPA Wl “DUIPIn WSocnRe 
Glebe Ob: aaa era UII Otee AUS ick WUbese (DiWN22. eAlnll 
UUMPOH Sais AiO sate RUroria x27 be ME eu SH 
O50) DUP LORE VER UME DiS 2 IU re Ps Hee OseO. uke: 
CALLER PUSH20 
OXPRPRPRPRPRRPRPRFRFRRFRFRPFRERPRFRERPRFRFREFREFRFREFEFEFE AND 
BUSH 
OXFPRPRPRRPRRPRPFRRFREFPRRPRFRFREFRRPRFRFRERFREPRFRFEFEFE AND 
DUP Zo MS ROR “eu SH O70 VAD SAP DUP MS ORE 
PUSH, Ox20) ADD (PUSHT “Ox0) KECCAKZ96. DUPZ SWAP 
So lLORE POP POR UME UME DiS TSW SHe SOx 7 Babes, 
Cbons rey eC NUIUNS NOI Bish ec OR SieclelOb. INDIO U sae ON Ba =e Oaiotk 
Ose) DUP 2 ori oti 0s AND AE S7ORO PU SH2. (Ooi) sMivag 





S10) eee Bea l= Chote leap eee on PSE SME ameIBID SEM ele les) Silke ri@b:al hele 
ADD PUSHIy Uxc20) DUP Swale 2 Diy Mui Pw Shi Osc270) 
ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 
MSTORE DUPYT SWAPS SWAP2 SWAP °DUPZ DUEZ MSTORE 
PU rOoce Olea Dba bilEs: MPa SS iOADa Pus tie Os Eo 
PUSH (Osal VANDA TsS2bRO PUSHZ OsclhO00° MUL SUB AND 
PUSS le 0x7 SNA ibys SUE SA RCs Piss tis Ones sleds 
UME Diba PU Sie Osolie ive PWS hie OscZ ost hel 
PUSH OscL00 DUPL DUPA SLOALDY Di Mud, DUPA 
MSTORE, SWAPZ PUSH) 0x20 ADD SWAPZ (PUSHZ Oxsil 
JUMP UUME DES) DU Ps ADDY SWAP? SWAP "PU Shi 2020 
MS LORE: PUSH Osc) buon 0a Oe REC OAK 7 So. swe I 
JUMPDEST DUPZ SEOAD. DUPZ MSTORE, SWAPL PUSHI 
Ox ADD SWAP PUSH 02.0 “ADDS DUP). DUPA GT 
PUSS 0x72 4s UME le Dies SWAP SUE. PUSH IO sokr. 
AND DUPS. ADD SWAPZ JUMPDEST POP POP POP POP 
POP SWAPI POP SWAP JUMP? JUMPDEST PUGH 0x0 
PUSH IL O20 STORE (DUES PUSS ni Os CMe TORE Pwo Ha 
Osx 20 PU SHAenOscOt hE CCA > Om U ort eUn 0 Sone SOP 
SWAP IVPOP  SLOAD DUE? SUMP VUMPDE SD PUSH -Os20 
PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSHI1 0x40 
MSTORE: DUEL euUsnh Ox SU PZ MS LORE APOP swab dl 
JUMP STOP LOGI PusHGs 0x62 (ATA) 2 SUS KECCARZS6 
Oxec PUSH30 
Ox3E1DAE8 412EC85045A8EAFC248E37AE506802CCOO8EA 
DSUUDEDACSLAABAS STOP. 0x29. 

"sourceMap"™: 








oa] seams ee oe oa ee eae oO eee ee © © © © © © © © © ee ee ee ew we ew ew ee ew ew 
7 eh, Se Vg T a VEOT LOG Lo Tne 216°) Ae Aa Lond Bed LL A LAN fA LA PAI el WA) Ld ALAN SO GY Ls 


With these values our smart contract is ready to be 
deployed. 


Important Note There may be some improvements that 
can be done to make this contract more secure and 
performance (gas) friendly. The Solidity code should not be 


taken as reference. Detailed discussion on Solidity best 
practices is out of scope for this text. For Solidity best 
practices, we recommend following the official solidity 
documentation and Solidity-specific texts. 





Deploying the Smart Contract 


In this section we will deploy the smart contract we developed 
in the last section to the private Ethereum network we have 
created. The process of deploying the smart contract is the 
same as what we did in the previous chapter. The only 
difference is that this time we are deploying the contract to a 
private network instead of a public one. In this chapter too, we 
are using the same web3.js library for Ethereum programming 
using JavaScript. We recommend the reader to go through the 
previous chapter if they have not already done that. 


SETTING UP WEB3 LIBRARY AND 
CONNECTION 


First of all, we will install the webg library in a node.js 
application. This is exactly how we did it in the last chapter. 
This node.js application will be used to deploy the smart 
contract. 


npm install web3@1.0.0-beta.28 


After installation, let’s first initialize and instantiate the 
web3 instance. 


var Web3 = require('web3') ; 


var web3 = new Web3 (new 
Web3.providers .HttpProvider ('http://127.0.0.1: 
8507')); 


Note that this time, our HTTP provider for the web3 
instance has changed to a local endpoint instead of a public 
INFURA endpoint, which we used in the last chapter. This is 
because we are now connecting to our local private network. 
Also note that the port we are using is 8507, which is what we 
provided in the --rpeport parameter when we set up the first 
node of our private network. This means we are connecting to 
the first node of the network from our web3 instance. 


DEPLOY THE CONTRACT TO 
THE PRIVATE NETWORK 


Now that we have our smart contract and its details, we will 
prepare a web3 contract object with the details of this contract, 
and then we will deploy this contract to the Ethereum 
blockchain by calling the deploy method on the contract object. 

We need to create an object of the web3.eth.Contract class 
that can represent our contract. The following code snippet 
creates a contract instance with the ABI of our contract as an 
input to the constructor. 


var pollingContract = new web3.eth.Contract ([ 


{ 





MeOMetamter. Ankiitsy 
USslagy oSieesiusa mall 
{ 
Miele as 7) ag 
"Eype 2 “address” 


ly 
Mirame Ns “VORes’, 
ROU Wie its | 

{ 


Woamean : W Uae 
pee 10) Seeks Nisin ghar anes one 


l, 

"payable": false, 

Mist ane Mire a baiimes Ver az ew sy, 
ENOA’AO\= ab mer SienOhaveyemney gh 


VGOnSt ant...) rue: 
Ae cig eyoten some ttl Me 
Weame i Oot Ody, 
Reavis) oy aoc eam || 
1 
sd = ih ae 
VIC s6 Sere” 


l, 

"payable": false, 
MStateMutabilaty™: “Lew, 
MiVioe. te Omen 


FOnonymMeus “eo se, 
pealsigy OVER seat is all 


{ 
"InNCexed" 2 false, 
MMiaveliNcN Ave gl ORICON uaa 
"Eype': “address” 

iy 

{ 


"indexed": false, 
Piven ee! vac 
i ie Ol aes Nini Shaya" okt 


WileaMe 1s. SEW OImeC a 
"type": "event" 


MiG OM subcliies st oltre 
Maisie eb Guts a cil 
{ 
"name": "selection", 
(Hien OS amet Resa eke ne 
} 
] y 
“Hamme”. "7OEer 
Wweabinejonayacst aaa |G ir 
"payable": false, 
WStateMitabailaty@ Unenpayab vets, 
PEevoe =. Viuimiek norm! 


lie 


Now we need to deploy this contract to the Ethereum 
network using the web3 library’s deploy method. The following 
code snippet shows how to do this. In this snippet we have 
added the byte code in the data field of the object passed to the 
deploy method. 


ejay she (Gro) at ess youe 
.deploy ({ 
data: 
'0x6060604052608060405190810160405280605081526 
020017£53686£756c6420636£66666565206265206d616 
4652074617820667265653£2081526020017£53656e642 
03120666£7220796573204£52203220666£72206e6£206 
96e20746881526020017£6520766£74652066756e63746 
96£6e2e€000000000000000000000000000000008152506 
001908051906020019061009c9291906100ad565b50341 
56100a857600080£d5b610152565b82805460018160011 


6156101000203166002900490600052602060002090601 
£016020900481019282601f106100ee57805160£FF19168 
3800117855561011c565b8280016001018555821561011 
c579182015b8281111561011b578251825591602001919 
060010190610100565b5b509050610129919061012d565 
b5090565b61014£91905b8082111561014b57600081600 
0905550600101610133565b5090565b90565b610373806 
101616000396000£300606060405260043610610057576 
000357c010000000000000000000000000000000000000 
0000000000000 N00000900463L£LLLLLLF1680630121b93 
£1461005c57806303c322781461007£578063d8bfFf5a51 
461010d575b600080£d5b341561006757600080£d5b610 
07d600480803590602001909190505061015a565b005b3 
41561008a57600080£d5b610092610273565b604051808 
0602001828103825283818151815260200191508051906 
020019080838360005b838110156100d25780820151818 
401526020810190506100b7565b5050505090509081019 
0601£1680156100££57808203805160018360200361010 
00a031916815260200191505b509250505060405180910 
390£35b341561011857600080£d5b61014460048080357 
SrEECPrerreererrercrEecereerrerreererrr rr eee 6906 
02001909190505061031b565b604051808281526020019 
1505060405180910390f35b7£4d99b957a2bc2 9a30ebd9 
6a7be8e68 fe50a3c701db28a91436490b7d53870ca4338 
26040518083 7S£LELELELELELE EEE ELEC ereSee ee Ler eee 
ELELCEE UG /SELEGET SELES EEL EEE EELEESECEDoL ES Ee rE 
££LLL£16815260200182815260200192505050604051809 
10390a160008060003373f£ffFLLLLLLLLLLLCLLLLLLLLLCLL 
FrEPTELEET PELE CG SEC erPpererrerreerrerreeerrere 
ff£fLLfLfffffF168152602001908152602001600020541 
4151561021257600080£d5b60008111801561022257506 
00381105b151561022d57600080£d5b806000803373ffF 
FEELELL ELT OSCECoCCcCeCCreoer treet rrerr re: Lon srt rat 
EEEEEELEPECEEPC EL CELE ES SESE ESE LEE LEGS 15260200 
19081526020016000208190555050565b61027b6103335 
65b6001805460018160011615610100020316600290048 


0601£01602080910402602001604051908101604052809 
2919081815260200182805460018160011615610100020 
3166002900480156103115780601£106102e6576101008 
08354040283529160200191610311565b8201919060005 
26020600020905b8154815290600101906020018083116 
102£457829003601£168201915b5050505050905090565 
b600060205280600052604060002060009150905054815 
65b6020604051908101604052806000815250905600a16 
5627a7a72305820ec7d3eldae8412ec85045a8eafc248e 
37ae506802cc008ead300dflac81aab490029' 
}) 
.send ({ 
from: 
'Oxbaf735£889d603£0ec6b1030c91d9033e60525c3', 
gas: 4700000, 
GasPrace: “ZO00 0000000000" 
hey 
HUME LOmtemeor. hansacuLommtacsiiy 
console. Jogqerror):; 
Console og (hransact tonkash); 
}) 
SHE M Gaui eial om Leonia) 
CONneC le. LOC. (comerac t 


7 


{ 
) 
b)e 


Note that we have also used the account that we created 
during the network setup in the “from” field of the send 
function. As this account was prefunded with nine Ether and 
it’s also added as the etherbase account for the mining rewards, 
it has enough Ether to deploy a contract. 

The full function to deploy the contract will be 


Vac ep lovyConerack —suncri1om Ga 
var pollingContract = new 
web3.eth.Contract ([ { 
Weveralsyers linens mongole 


alia Cube scarce Itt 
MT veeutee ey oy 
"type": "address" 
yallee 
"name": "votes", 
OU Ulett: le 
ss eb (ea 
UB wat ere aire Pan Shiki ay eared ony 
ply 
"payable": false, 
"stateMutability": "view", 
VEVbe i) eerie trom: 


PClORe methine: ence Ulery 
orl gh eb his sua (tj 
Mate vi 1 oe Ou 
MO blink oa sete kece lt 
Palen ve ste sty 
EO! a. Serre” 
}], 
Moavaie ss —raliee, 
'starteMutabilaiy ss “vy pew, 
Loe Acyoniseaylom bhavelmnmen al 


PanonymoOus 2 false; 

Ui raay cub hssGaeca ails 
"indexed": false, 
MAM OSs 1 ete tee, 
Meypet. “address 


"indexed": false, 
Ave wiNew acy Se grime idle 
WEG. a Meee na” 


es 
“riame “Voted, 
"type": "event" 


IGUGRbiG teenies eee wel Ser 
alah oubkinstd sem ih | 
Thee tf) Seeks eteroni yy, 
EV Oet a. Unites Om 
}], 
"Rhames Vvyowe 
Pr Celts eon ese tl alley 
"payable": false, 


TStateMitabilrk ys iO npayab ke "s. 
Mie jevoneee ule bhavelmimenany 
} 
1); 
DOIG nee Omir Were 
.deploy ({ 
data: 


"0x6060604052608060405190810160405280605081526 
UZ0 OP RSD CGE) DOCOAIUSSOLOOCOODOOZUCZO 37. 06d6 6 
65707 Ol TO Z006IZ OSG S53n7Z0CTSZC0Z00I TES S65CE042 
O2L2Z06CCLT A207 Sons 20Cr eZ 20S7 20 CCCL TAZ Geoa 20 6 
96e7z0 TAS ISLS ZCOAZ00 Pos 707 OGn TACs Z0GG/ S6E030 a6 
9ofo6e2eN0D0000000000000000000000000000008152506 
DOLIOSUSLIOU CU ZOULIUG LOUIS coZ91 IU elO00ad> oSbo0341 
SoOmIVasoeoOUO SOLA Delo lS S65 bDe7.c0S4 CO 0MeLoOO lL 
6156101000203166002900490600052602060002090601 
BOLGOZOIOOAS MOE Ae AOU R NOG MO eebT OOS Ooi Oo IGS 
SCOWIA Sa S56 MOIT CSG SsbseAsO0MoUOLU eo s56 72561 Or 
COTO Neo O Lobe Zo ine MOIS ooo she Sooo 07 DOE 
OS, COMING NS TONS MAG AOL) scrodeiey os Okc (Ole 10; BO MIZ Ic SMES MON on MOMIE Ze toy oye) 
beUOUS CSD elo tO LOO Sbs 0S 7 a6 Mis 1 OU0 Ue G00 
IU SSD UCUOVOMGILOIS Sob SOO ses IOS Gobo FS BUG 

















1016160003 96000F300606060405260043610610057576 
VOUSS ToOTUCUO UO OOOO C COCO UO OC COCOUCOCCOU COR OCCO 
VOU COUOUOU0COUUU UO OSUU2E SE EEPETE PLES U63 Oreos 
PLAEMOOS CST SUGSUSES27 Si4 oO 0TES SOS Sadsbrroaol 
AG MUNI ST SHbOU0USCUFAID E3456 006757 60002 0 rdabel0 
OF A6004 SUSUSS 906020019091 SO0S05061 0lSas565b005b3 
AVS OUOCS aS / COOUS OAS CLO 7 6 RO2 ts a65b6 U0 Si stts 
OGO AU OMe ASO S372 a2 8 3 Gee Pode o0 4 OURO Iss WS 0 Seo OG 
OZOUMI VOCUS ss 36 000S bs Sci hUS CLO Od2 57 S032 Osladke rs 
AOS 2607.0 sv OOS Uewlot by soso USUS0 00S 090 sO Ig 
CCU kGe OS OMOUe Sy Ss 20s oO sdeo OMe O07 003 GasCalny 
OVEUS TIVES VE7 60700191 5US5509250505000405 580910 
390£35b341561011857600080fd5b61014460048080357 
go icp lbp se oat ey n-ategafee fee us sete afte in aot ep alerts fur feed te leg feat ie ate teeter dee fects, chiens 
CLAONOMENORS CNS IGNeGouO ouiblorsicyelene OvNOlecnGesbare. Now.con Cee GES) 
15050604051 80910390£35b7£4d99b95 TazZbc29a30ebd9 
6a7be8e68Fe50a3c701db28a91436490b7d53870ca4338 
DG) Oe iSO) coe ce ata os desea siete usta te toate teastecte fey tuoe fe fests Teri stss tayivgle tet teatemiente 
des felitee te tee Ted My fete desde ce Te tm Pate dec toenterstc is ew ior ae dei tenet dele fesae teeter re ais ie uiaeieatocia 
frien Weel a 76700 SA SSAC UZ0OLS 7S Us 0S 060405 1305 
IOTSVENO) SAC ONG ON SNO 3S Oc CNONS C87 ose die euGnk er pGie ake Geeks aie mig od ae 
es ests staeseste ate sm tena ec ete seg lg Cy habe Pe tmeterrte safes uatget) tua dea tee tecte star en teiec tems fecle Tapia te te 
Gl GME AAC ICE GaRABNe evens, ace.) AU NO plac HOSS tole OA lONONIEIS OKO GpzlGhew- ab 
ANS WoO 6h AS COCUCO rads DOOD SIL aU LS GLO 222597506 
OU SCIMO Shales ol Oe Zoo OUUU SO rab bh UG OUO SOS Sa. ink 
ek tecefes ste taalaosteyi re Steir steps antarte Te tetioite tv fonteyiededs fete do debtevivi te taulate elute yale teiedests 
Glo RIG Glee ee CPi eee Pisa lee MiGs Cabs ie Clonee iO ieak eae LA Se Il eloll AWG! 
OOS AS OZ VOR G OOO AO SIU es 50 5056 56 IW Zao Gis 535 
65b6001805460018160011615610100020316600290048 
0601£01602080910402602001604051908101604052809 
AMO SWS ZOU UU ESAS US ACO Oks LOUIE GAs aC Use O.O20 
SU6COUZIOU4SOUSSCUUST TS T80CULTELUGIUZ EOS 7 6L0LOUs 
OS2S4 0402 SS 529602 00TIVE OSI be Gabe ZU hI 6OUGS 
PZOUZVCOUCDOZOIUSDSIS4 515290600 LOloO60200U30s 31116 
ROE eA 0S 6 UlsE es 7 UES aU aU SCS 0 SU OU SOS S.6 
b600060205230600052604060002060009150905054315 























SsaboUZOSUS0SIGUCTOULGU4O0SZe0COOUCTSZ25090Ss600a lo 
562 7a7al2305820ecT7d3eldae8412ec85045a8eafc248e 
37ae506802cc008ead300dflac8laab490029' 

1) 


.send ( { 





from: 
MOxXbat (BOC SITIOUSTUSCoD MOS OcIMagOS SeoOSz Sea, 
gas > 4700000; 
Gas Praca: “ZOC0UD0O0O UO U0" 
by 


LUnCE VOM CeLrror, transact tonkash ) 


console. log (error); 
Console Wog(transactronnash):; 
}) 
TCHhSniCmuUneELoOn (Contract) 4 
COnscoVe LOG Connect |, 
oe: 
}; 


After executing this function from our node.js application, 
we received the following output: 


Commune stews | 
currentProvider: [Getter/Setter], 
Dre quest Manager. 
RequestManager { 
ie Qvale cue: Farid dey 
providers: 
{ WebsocketProvider: [Function: 
WebsocketProvider], 
Hove Provder: (prune eLom: 
Hie bpRmov ude; 
Iperrovvder. | PuncEN Ons hock rouwrdem, 





hy 


SUS Cie Oe Ou Somme, 


givenProvider: null, 
providers: 
{ WebsocketProvider: [Function: 
WebsocketProvider], 
HeEOrP Roy der in Pune one (Hiro Prevacer | y 
ipeProvider \Punet ron. eer rover}; 
OT Ov eae ss mn ley 
setProvider: [Function], 
Bat chkequest.. “[Puncivon. bound Bakehal, 
extend: 
(Pare accie esc] 
formatters: 
{ inputDefaultBlockNumberFormatter: 
[Function: inputDefaultBlockNumberFormatter], 


inputBlockNumberFormatter: [Function: 
inputBlockNumberFormatter], 

InpucLcalLlrormatter: [Functhion: 
sip gheyel an @ sulle Rey qe irelicgetowe ||0, 

alagye ihe Wieslgvors anual eNpene | eMedteon aes ei(sUueles mama ale 
inputTransactionFormatter], 

inputAddressFormatter: [Function: 
inputAddressFormatter], 

PHOULE OSE Orla tems | EMC recurs 
inputPostFormatter], 

inpurlogrornat tem \[PincElon: 
inputLogFormatter], 

LUPUS EMP ORiabbeths Manner Lon. 
INpWEStONPoOrmMaLeer |, 

outputBigNumberFormatter: [Function: 
outputBigNumberFormatter], 

SCULEPUE Eras aGmrontornat ten > s | Pumet anor: 


CuLpuEl ran sacl vonrormat wer), 
outputTransactionReceiptFormatter: 
[Function: outputTransactionReceiptFormatter], 
CULDMER LOCK oOrmakt eri: UP uimet tom 
CULBPUERLOCKHORrMakeer |G 


OuLpUtLOgHormatter: [Functiom: 
OuULTDULLOGFOLRMaLEer ||, 


CULO POSthOrnawrer, | EUne rERom: 
OULBULPOSEPOrmMatrter |, 

OUEDULSVNeCInGgPormatrerin | Punrcrmon 
CUED MES wile wMimicin Orme: meals oe, 

Tigers 
(Oae ealiaclisaiaiosers aN buGyChrabionci: Me pieniicenthe cone by, 

SJSeCninvertaceMethoulo srr ing. 
LUNG Hon aT SOEs rr aeehennedl Ost Tima, 

randeomlex: [runctron: rendomHex], 

ee ot ovcuabon onl! 

Bite Unmet vom :, 

eS oie euler edie eS Niliey 

HSEBLoNumoer: [| Puncrton. -SsBagNumber|; 

LsHex. (Functions ashes, 

PInexXSteLoer. (I PRUNemEOnt sheheto tthe tl > 

‘clave tony a elbuaketoulonanle 

ReGCcaks.o74 HuUnmer Tom): 


SHOplesiye skquay acy avel Chew ml blbiaven sab ovat 
etoullieie ideay Av ate nous 


TrSsAddress: (runecE Nom. TeAddres S|, 

checkAddressChecksum: [Function: 
checkAddressChecksum], 

toChecksumAddress: [Function: 
toChecksumAddress], 

tones. PUM OEvOn< = iPoOhesc| 


webNey Leaner aon., ScoObN |, 

bytesToHex: [Function: bytesToHex], 

hexloBytes:: [Punceion] hexToByres|; 

hexToNumberString: [Function: 
hexToNumberString], 

hexToNumber: [Function: hexToNumber], 

rebecimel: [Punctroen > hexToNnumber|, 

numberToHex: [Function: numberToHex], 

fromDecimal: [Function: numberToHex], 


lavco Cite) E iaiers tame Meaitvakenenhenue ais ele Us wamoullen 
llexlOSir midge  frunmcr tone Hexloumie}, 
MOU eiers allel Chaleksabenghaelayoy alo UN ems mle 
Ube lOnHese:: (Mune hrete: cero Moiese. 
SEMI Monesc:: i RINGZE Onc: Withee Tones, 
LeonUEre - (hiner Mone there rOnmes|., 
hexToAseii: LFunction: hexToAse: 2 |), 
EGASGI Ie (ROUNCE TOM MexToAscias|; 
ASC Mmelenesc: |LEUMet hom: caser: Lome sa, 
LrOmAs cic. (PMG tren sase lil ones), 
Une Mape, Ob sec tml, 
toWei: [Function: toWeil], 
fromWei: [Function: fromWeil], 
badherr: [Puncrwon: lerePad], 
ertPpads (Function: ert Pad), 
PadRagins: [PRUNer Om wero bach|>, 
lap Ci acge exe hoe |Manbnahetuakengyan sicuoleumbereneklll 
toTwosComplement: [Function: 
toTwosComplement] }, 
Methods. (Function: Method] “h, 
Clear ones Gr Lyi Louse. | hum Cm Lotniyy 
OO TOs 
{ address: [Getter/Setter], 
jsonInterface: [Getter/Setter], 
data: undefined, 
from: undefined, 
gasPrice: undefined, 
gas: undefined }, 
defaultAccount: [Getter/Setter], 
defaultBlock: [Getter/Setter], 














methods: 
ie VOSS es UnCinue crs HOOUnGE Temea We Oey eeie) 
JiUb-eelelouminevckem ve Nbusions ston em clenohetol 
et earelx< Once nly 
iyvoLec (address) ss. Pimrectvon= Hound 


EcreacelZOpRecn|:, 


Cerro Pune k ron ond 








PeEcarelx<Ob Teeny 

VOSUSGSO2e 46 i baNedee ore: com uarel 
PereatelZO pects, 

Ropesmiaroy lly esse ai We bndve maken greed OrenbuRie 
Percate loonie er, 

VOte.) IEUNG EEO. oOuId se reabelxOM ecu), 

MOS Oey eis ine bared aloo uid 
BCreatel OD jeer, 

MVOC rine So) e) hunerten.. scound 
ere avel AO by eer lie, 

events: 
PWored«:  (HUnGt Won: bBoune a | 


'0x4d99b957a2bc29a30ebd96aT7Tbe8e68 fe50a3c7 
01db28a91436490b7d53870ca4': [Function: bound 
ly 


"VOted (addtuess,Uintzoo)  ? rumernron: 
Dounce |". 
Lea Veris 2. iE inet Mette. sioO einich veal. 
MACdEess: 


'0x59E7161646C3436DFdF5eBE617B4A172974B481le', 
TJechlneerracs: 
a COne tanita st nue. 
ANTUO UW wc e ler ciate asya| 
name: ‘'votes', 
Gurpwes.. Arrasals, 
payable: false, 
stateMutability: 'view', 
Eypes 2 fiie haere sy, 
Sup Men EU ete ga OKChO oie in oer Ou ae may 
ie COnCtehitce (elue., 
SRA) Wey Sern | ey 
name: 'getPoll', 
GUE pres. Sse asf 
payable: false, 
stateMutability: 'view', 


mypeSt) 7 hunNetwomey 
Skene kuna. OxOs eS ot a, 
{ anonymous: false, 
EMOWUES so (kara y 
name: 'Voted', 
type: ‘event’, 
Signature: 
'0x4d99b957a2bc2 9a30ebd96aT7Tbe8eb68Ffe50a3c701db2 
8a91436490b7d53870ca4' }, 
Y-eConestanc. talse,, 


rou s 2. WAT |, 
name: '‘'vote', 
eyblimeablmrey au ILL ihe 


payable: false, 
stateMutability: 'nonpayable', 
Eyoes “EuUMeraony 

siullepeie uc bhal=eamiO >. <0 clZalblonemen sel ath) lies! 


The output shows the various properties of the contract we 
deployed to our private network. The most important one is the 
contract address at which the contract is deployed, which is 
0x59E7161646C3436DFdF5eBE617B4A172974B481e. 

The contract ABI and address can be used to call a function 
on the contract. In the next section we will build a simple web 
app that will call the vote function of this contract, showcasing 
how the polling can be done from the front end. 


Client Application 


As we did in the last chapter, we can use the webg library to call 
a function on a smart contract. But, in the last chapter we did 
that using a node.js application and not in a browser 
application. In this section, we will be using web3 in a browser 
application to call our deployed smart contract’s vote function. 
The simplest web application we can create for this DApp is 
a single web page with a few text and button controls. For the 
web page, we can use the following code inside an html file and 


then run it from a local server. Note that running from a local 
server and not directly opening the file from the browser is 
important to load the scripts properly, without facing any 
browser security issues. 


el aneaqaulle 


ee 

<meta charset="UTF-8"> 

<title>Beginning Blockchain - DApp 
demo</title> 

<script src="<source of web3 library from 
any CDN or local file>"></script> 
</head> 


<body> 
=< Cane> 
De 
<strong>Beginning 
Blockchain</streng> 
</p> 
<p>Hi, Welcome to the Polling DApp! 
</p> 
<p> s nbsp; </p> 
<p>Get latest poll:&nbsp; 
“Dur EOn one lick Werroll (yy >Ger 
Poll /buerou- 
Ger: 
jee 
<a d= "Dol lV Subspecin! a7 caw 
<—ppe 
Spe Vore., vest 
<input type="radio" id="yes"> No: 
<input type="radio" id="no"> 
</p> 
<> SUDIISE 6 Ibs, 


Sinton 


onciobe k= ""Subinit votre () (= Submit Vote<7 bucron— 


ier: 
<> 
aoe ney 
scrip 
if (typeof web3 ! == 'undefined') { 
web3 = new 
Web3 (web3.currentProvider) ; 
} else { 
web3 = new Web3 (new 
Webs providersentrpr rovadeim( titer psy Aue OO: 
SOR elie 
i 
Dime hwon: ek eo G a 
var pollingContract = new 
web3.eth.Contract ([ { 
MiCOMc waters ebUSy 
itisyevehecon een nl isl 
se gira bait tah aay yobs 
TEVoe ss “fadcuess. 
alley 
"name": "votes", 
AONE Sees alba 
Eanes ase ats 
Meyer Cait 25.60 
rly 
THeaoke > Pakoe, 
Ue tateMidealoumdlaie yi 
“evpes humer vem’ 
tae 
{ 
MCOne tai. sam neues, 
ei biay Gath wes Wd bear (Ul 
PIGWCW IS Verran lO Kone drole er 


"view" 


Pou Oe Sere ule 

Wnamnmen : woo ‘ 

Wi Vioey =tpees tie err 
jelliee 
"payable": false, 


WSstateMurabaltey: ew", 
ED Gran 2 AL ece@rae 
heey 
{ 
Man OM MOue 2s. deco Sy 
MGEisyoutlarsuw ee (he) 
"indexed": false, 
Nan HN A Pe ei Ser iSiel et ens 
Mie. 2 ie caclelice sa. 
Vee 
{ 
"indexed": false, 
(ake View a iret ih iol ee 
EV Goada.e een reo 
} 
ie 
Maaco MO Cele 
"type": "event" 
iy 
{ 
ite Om Loneaiii eta wlectdee e, 
abi syoublieasuaie te: (le) 
"name": "selection", 
Ube AOl Sua rem mil gu ear tok 
rales 
"name": "vote", 


(ene iat clocks Weems s|. 

"payable": false, 

dessa (e) Mibmetst osidieina sak 
"nonpayable", 

VEVOe Ask Oe 1 Orn” 


J, 
"0x59E7161646C3436DFdF5eBE617/7B4A17/2974B481e') ; 


polleengeont hack Mernouds dere olllig=. 
Calli ehenm (time e bom. scrawny, 
document.getHElementBylId('polls 
ubject').textContent = value; 
a 
be 


huMtrone sume tie t e.(e as 
var value = 0 
var yes = 
document.getHKlementBylId('yes') .checked; 
var no = 
document.getHlementById('no').checked; 


if (yes) { 
value = 1 
Ve GA Giese ete PiiO.ye 4. 
value = 2 
} else { 
recur; 
} 
var pollingContract = new 
WEDS. eine Contrce bt Cilt 
Me OMe tment: os mite wey 
tuhigyeySkuroeohanae| (ee 
Miname’s oN i 
"type": "address" 
}], 
Viaines 7. Oeeae a, 
oui rs) oye nesses | ll) 


wre 
y 


"name": 


Eye (“ei oo. 
Tale, 
"payable": false, 
Westra hemi: aaclsvdeay ies ey We 
Vi oe. 2 Virani n” 


"COns Game(* trues 

Petrie ner nly 

MENON S nesas OTe eee Osean tes 

Worshmje iota NCA Ac 
URnamet se 2th 
Misys eke incy 

Piles 

"payable": false, 


is ene Mbit abe Mec Sree 
Mivyoe er Cok wneteon. 
MAnNOnyMmOuUSs + ha Lsey 
PEO Ul tore ere i [y 
"indexed": false, 
Denese on Ot eries 
BEVe es Adress! 
te 
{ 
"indexed": false, 
MUNEN ING ha aa Actes 
Vite oe est a Weleni eGar 
} 
A; 
"name": "Voted", 
"type": "event" 


Veonstant™: talkse, 


Vimowes” 254 


"name": "selection", 
VEyoe 2 2 Une ao. 
Tale 
"name": "vote", 


onbkeeibhes a Al, || 7 

"payable": false, 

"stateMutability"”: 
"nonpayable", 

Vevoe “so hier em” 


J, 
'0x59E7161646C3436DFdF5eBE617/B4A172974B481e') ; 


pollingContract.methods.vote (value 
).send({ 
i OM: 
“Oxbat7s5rse%doUsr0eceb Os 0c 9lds0s3eq05Z5e3" 
\) theni(ftunetion (result) 4 
console.log(result) ; 
}); 
}e 
q/ Seri pe 
</Dody- 


<7 tem 


Let’s now analyze each of the sections of this HTML file. 

In the head section of the HTML document, we have loaded 
the web script from either a CDN source or a local source. 
This is just like we refer to any other third-party JavaScript 
library in our web pages (JQuery, etc.) 

Then in the body section of the HTML, we have the controls 
for showing the poll subject and radio and submit buttons to 
capture user input. The overall web page looks like this (Figure 
6-11). 


Beginning Blockchain 


Hi, Welcome to the Polling DApp! 


Get latest poll: Get Poll 
Vote: Yes: () No: 


Submit: Submit Vote 


Figure 6-11 Polling web application view 


What is important is the script section in the body. That’s 
where we are calling the smart contract interaction code . Let’s 
look at it in detail. 


ie Saag ene 
if (typeof web3 ! == 'undefined') { 
web3 = new 
Web3 (web3.currentProvider) ; 
} else { 
web3 = new Web3 (new 
Webs, Providers -HttpProvider ('hetp://127 .0,0.1: 
8507 "a3 


} 


Funct Lon “GerPoli¢). 4 


var pollingContract = new 
web3.eth.Contract ([ { 
COns Game(* tries 
Perouse Alia 
Mieke aes ee 


MEV OS et) BAC GeS es. 


talee 
“amen 2 “vores! 
seeds OMe se le 
Dveine ese eth 
Vive. suet dane oro 
vale 
"payable": false, 
Piscine Maite al iaeebonet aise ereee a: 
REyoe es. hue ter 


Veo c water. ebUSy 
Pavone se. Jee 
MOMS set ek OA 
Monts Oise tae a ie 

PD UGUNe een, Gat ay 

MEyDe «2 Vsikramds 
Teles 
"payable": false, 
Wetabevirababaiay is Ayew, 
Ltyoe. 20 Vane iaven: 


Pamonymous. = bavse- 

Perigo uitens ses silty 
"indexed": false, 
NACH por ek One lens, 
Wie (scene sc! 


ae 

{ 
"indexed": false, 
Mineme ves Wy reninie ye, 
VE Oe. aay Ueniiae Ge 

} 


“names. “Vored™, 


"type": "event" 


YeOns tate. urakkes 
ii gyouelie css oe a(t 
MCG as) SSuLec Eons, 
Pre Gases) vabicinhitaa o1Guy 
delle 
Miramar s Parotels 
roubles eue ies sem | NO 
"payable": false, 
Were bem tab aloud: 
"nonpayable", 
WES OS tres aie buine Eitri 


J, 
'0x59E7161646C3436DFdF5eBE617/B4A172974B481e') ; 


polling ontrack zmethods. get Poll (): 
callQ:. then (tinction (value { 
document.getHElementBylId('polls 
ubject').textContent = value; 
})e 
} 


Piet homeo tone vobeds)) ex 
var value = 0 
var yes = 
document.getHKlementBylId('yes') .checked; 
var no = 
document.getHlementBylId('no').checked; 


LE yes) 4 
value = 1 

} else iff (no) { 
value = 2 


} else { 


Perum, 
} 
Var polliangContract. = new 
webs. etm Contract [it 
"COnes tame sc rie, 
onl gy Ole lnens acetal (le 
WATERING tage ee 
VEVbS -t Vodcdness| 
}], 
"name": "votes", 
Mee Ouiean ren il 
WET eHGrsts oy tay 
PE yOet a UO. 


b1, 

"payable": false, 
We bathe Milica bade 25 ewe WwW, 7, 
TEevpe: se) Vhunct ron 


WG Ome elias seo nes Lene 
MEO tssrast) yl liy 
Trametes “ger Poli, 
{roube we eile sites |S | 
Lames ate As 
Meype™ =: “Sepang” 
}], 
"payable": false, 
"stateMutability": "view", 
“oeype:< “hunervont' 


TAneonymous '\. “alse, 
Aabiay OAM wc us new na| (eh 
"indexed": false, 


PAM Gy Pees eae, 


MEypere: “address” 
ey 
{ 
"indexed": false, 
Maney “eae Mey 
UI URUJOreU ies Meus Sleigh ne Kalan 
} 
iS 
Mieme ee MV Gia | 
"Cype": "event" 
ae 
{ 
WeEOMsS teams iraks ec, 
MoligyebhiscsM ae aliG| 
Mame 2 Selections, 
WEYDS §s Er oor 
Talay 
“irame*-< “Aroicess, 


SEGuevis MMe urn |e 

"payable": false, 

Weta ceMiitabadent ys 
"nonpayable", 

“evype «hunch won: 


J, 
"0x59E7161646C3436DFdF5eBE61/B4A17/72974B481le') ; 


pollingContract.methods.vote (value 
) .send ( { 
com: 
nOxbaty Bor es 93douSst Vechb hs OcoildOs3eCq0e2ocs 
hy rhen(hunctien (resid) 4 
console. log result); 
Lee 
}; 


eer Ol 


In the previous script section, first we are initializing the 
web3 object with the HTTP provider of the local Ethereum 
node (if it is not already initialized). 

Then, we have two JavaScript functions. One for getting the 
value of the pollSubJect string from the smart contract and 
another for calling the vote function of the contract. 

The calling of smart contract functions is exactly how we 
did it in the previous chapter using the web3.eth.Contract 
submodule of the web3 library. 

Note that in the first function getPol1 we are calling the 
call function on the smart contract instance, while in the 
second function submitVote we are calling send on the smart 
contract instance. That’s primarily the difference in the two 
function calls. 

Using the call on the getPol11 function of the smart 
contract, we are getting the return value of the getPoll function 
without sending any transaction to the network. We are then 
showing this value on the UI by assigning it as the text of a UI 
element. 

Next, using send on the vote function, we are sending a 
transaction to execute this function on the network and so we 
have to also define an account that will be used to execute the 
smart contract function. Following is the output obtained from 
the submitVote function shown previously, which is basically a 
transaction receipt. 


{ 

louliexe!l @akeisden 
"0x04a02dd56c037569ebb6abe25e003a65d3366407134c 
90a056F 64b62c2d23eb84', 

blockNumber: 4257, 

@@iuercrsreyeyls ohaaiers easly: 

cumulativeGasUsed: 43463, 

anos 
“Oxbarysortssvdeusr lecGb Los leslds0sseq0s25cs, 


gasUsed: 43463, 
ikogsb icon: 
"Ox0000000000000000000000000000008000000000000 
OO40000000000000000000200000000000000000000000 
ODODDD00000000000000000000000000000000000000000 
OOODD00000000000000002000000000020000000000000 
OODDD00000000000000000000000000000000000000000 
OODODD00000000000000000000000000000000000000000 
OODODD00000000000000000000000000000000000000000 
OOODD00000000000000000200000000000000000000000 
ODOODD00000000000000000000000000000000000000000 
OODODD00000000000000000000000000000000000000000 
ODODDD00000000000000000000000000000000000000000 
GUONCNONGHONGHENG Wer 
erate 
"Ox58bc4ece0a3025ca3f303df9bb243d052a1230265196 
3730c52c88aafe92ebece', 
Ors 
'0x59e7161646c3436dfdf5ebe617b4al72974b481le', 
EransacrronkHash= 
"0x434aa9c0037af3367a0d3d92985781c50774241lacel 
OSS 2G) Zoo ser eGead 1 Sie: 4 
transactionindexs U,; 
events: { 
Voted: { 
address: 
"0x59EB7161646C3436DFdF5eBE617B4A172974B48le', 
blockNumber: 4257, 
lerarcligvar= couse ikonalls’sheu ale 
"Ox4s4aa9cQ03s7aisse /a0dsdyzZosS7Sles07/424lacel 
0382a8723985efcea/3b3', 
Eransact roningdex > 10), 
ledlke ier alone’ ale 
"0x04a02dd56c037569ebbabe25e003a65d3366407134c 
90a056fF64b62c2d23eb84', 
legindex: 0; 








removed: false, 

Lon (Hog. Saal aay 

returnValues: [Result], 

event: 'Voted', 

Signature: 
"Ox4d99b95T7a2bc29a30ebd9b6aT7beseb8Fes50a3c701ldb2 
8a91436490b7d53870ca4', 

raw: [Object] 


If we look closely at this output, we see that this also has an 
events section and it shows the triggering of the Voted event 
that we created in our smart contract. 


events: { 
Voted: { 

address: 
'0x59E7161646C3436DFdF5eBE617B4A172974B481le', 

blockNumber: 4257, 

transactionHash: 
'0x434aa9c0037af3367a0d3d92985781c50774241lacel 
d382a8723985efcea73b3', 

transactionIndex: 0, 

blockHash: 
'0x04a02dd56c037569eb6abe25e003a65d3366407134c 
90a056£64b62c2d23eb84', 

logindex: 0, 

removed: false, 

id: 'log 980a1744', 

returnValues: [Result], 

event: 'Voted', 

Signature: 
'0x4d99b957a2bc2 9a30ebd96aT7Tbe8e68F£e50a3c701db2 
8a91436490b7d53870ca4', 


raw: [Object] 


} 


In the preceding code snippet, we’ve extracted out the 
events section from the transaction receipt we received in the 
response of the send transaction to the vote function of our 
smart contract. As we can see, the events section also shows the 
return values and the raw values from the function call. 

We have now come to the end of our DApp programming 
exercise. In the previous sections of this chapter, we developed 
an end-to-end decentralized application on the Ethereum 
blockchain and we also deployed a private blockchain for our 
DApp. 

The DApp can be used with the public Ethereum network 
too—a voter has to host a node and they can vote using their 
existing Ethereum accounts on the public (main) network. 

There can be several ways in which the business logic in the 
smart contract can be enhanced by using different checks and 
rules. 

This programming exercise gives us a basic idea about how 
to approach development of decentralized applications and the 
components that come into the picture during the process. This 
exercise can be treated as a starting point for Ethereum 
application development, and the reader is encouraged to 
explore best practices and more complex scenarios on the 
subject. 


Summary 


In this chapter we compiled a programming exercise of 
developing a decentralized application based on the Ethereum 
blockchain. We also learned how to set up a private Ethereum 
network and how to interact with it using the DApp. 


References 


web3.js Documentation 
http://web3js.readthedocs.io/en/1.0/index.ht 
ml. 
Solidity Documentation 
https ://solidity. resdtnedocs ord, ; 
Ethereum Private Networking Tutorial 
https://github.com/ethereumproject/go- 
ethereum/wiki/Private-Networking-Tutorial. 


Index 


A 


Abstraction layers 
admin.addPeer() command 
Advanced Encryption Standard (AES) 
AddRoundKey 
AES-128 
8-bit byte 
block size 
encryption and decryption process 
key expansion 
MixColumns 
NIST 
processing steps 
round function 
ShiftRows 
state array 
state words 
SubBytes 
substitution-permutation network 
Amazon 
Application Binary Interface (ABI) 
Application layer 
Asymmetric key cryptography 
App stores 
authentication 
code examples 
confidentiality 
digital signatures 
DSA 
ECC 
See Elliptic curve cryptography (ECC 
ECDSA 


private key 
public key 
RSA algorithm 
encryption/decryption 
generation of key pairs 
modular arithmetic 
vs. symmetric key cryptography 
text message, Alice to Bob 
Autonomous Decentralized Peer-To-Peer Telemetry (ADEPT) 


B 


Banking era 
Bitcoin 

bitcoinjs 

block explorer API 

block structure 
difficulty target 
header components 
field and size 
Merkle trees 

data structure 

dawn 

defined 

Ethereum 

full nodes 

genesis block 
chainparams.cpp 
hash information 
transaction information 

mining 

orphan blocks 

PoW 

smart contracts 

SPVs 

transaction, Bitcoin test network 
addOutput method 
broadcast transaction 
transaction.addInput method 


get test net Bitcoins 
hex string 
keypairs creation 
sender’s unspent outputs 
setup and initialization, bitcoinjs library 
sign transaction inputs 
wallets 
working with 
Bitcoin network 
block propagation 
consensus and block mining 
See Block mining 
discovery, new node 
full/lightweight nodes 
on Internet 
SPV 
transactions 
Bitcoin scripts 
CheckSig 
defined 
formation of combined validation 
granular components 
input and output code 
practical example 
ScriptPubKey 
ScriptSig 
stack-based implementation 
transaction fields 
transactions revisited 
BitcoinJ 
Blockchain 
advantages 
applications 
actors, handle requests 
backend database 
Bitcoin node 
centralized web server 
cloud-empowered blockchain system 
cloud services 


consensus algorithms 
DApps, Ethereum network 
development 
hybrid 
interaction 
public blockchain 
banking system 
Bitcoin 
See Bitcoin 
business problems and situations 
Byzantine Generals’ Problem 
centralized system 
components 
computer science engineering 
See Computer science engineering 
core 
cryptocurrency implementations 
cryptography 
See Cryptography 
data structure 
decentralized and peer-to-peer solution 
description 
distributed consensus mechanisms 
fundamentals 
game theory 
See Game theory 
handcrafting transactions 
intermediary vs. peer-to-peer transaction 
offerings 
PBFT 
PoS 
PoW 
properties 
auditability 
consistent state of ledger 
democratic 
double-spend resistant 
forgery resistant 
immutability 


resilient 
real-world business problems 
scalability 
Bitcoin adoption 
centralized system 
consensus protocols 
database sharding 
disruptive technologies 
off-chain computation 
public and private Blockchains 
transactions 
scenarios 
transactions 
use cases 
Block ciphers 
Block mining 
ballpark values 
block header 
block reward 
coin creation 
cryptographic security 
defined 
halving process 
hash and target value 
incentivization mechanism 
miners 
nodes 
orphaned blocks 
PoW 
transaction fees 
valid block 
Bureaucratic system 
Business transaction 
Byzantine Generals’ Problem 


S 


Centralized systems 
advantages 


vs. decentralized systems 
limitations 
Coinbase transaction 
Computer science engineering 
blockchain 
block-1234 
block structure 
data structure 
genesis block 
hash pointer 
parent block 
SHA-256 
Merkle trees 
Consensus layer 
Contract.deploy method 
Cryptography 
advanced mathematical techniques 
asymmetric key 
See Asymmetric key cryptography 
authentication 
ciphertext 
confidentiality 
data integrity 
Diffie-Hellman key exchange 
encryption techniques 
hash functions 
See Hash functions 
non-repudiation 
plaintext 
steps 
symmetric key 
See Symmetric key cryptography 
transactions 


D 


Database sharding 
Data Encryption Standard (DES) 
64-bit block size 


cryptography 
Feistel cipher 
key generator 
limitations 
Moore’s law 
round function 
Decentralized applications (DApps) 
architecture 
public nodes vs. self-hosted nodes 
servers 
blockchain-based 
client application, web3 
getPoll function 
html file and scripts 
JavaScript functions 
polling web application view 
send on vote function 
smart contract interaction code 
transaction, smart contract function 
voted event 
web3.eth.Contract submodule 
private Ethereum network 
See Private Ethereum network 
smart contract 
See Smart contract, DApp 
voting system 
Decentralized applications (DApps) 
Decentralized systems 
advantages 
vs. centralized systems 
limitations 
peer-to-peer system 
Diffie-Hellman key exchange 
Digital signature algorithm (DSA) 


E 


Elliptic curve cryptography (ECC) 
160-bit ECC key 


characteristics 
discrete logarithm problem 
domain parameters 
mathematical equation 
shapes 
Elliptic Curve Diffie-Hellman (ECDH) 
Elliptic Curve Digital Signature Algorithm (ECDSA) 
key generation 
vs. RSA 
sender and receiver 
signature generation 
signature verification 
Ethereum blockchain 
accounts 
advantages 
Contract Accounts 
EOAs 
See Externally Owned Accounts (EOAs) 
state 
UTXOs advantages 
Bitcoin to 
block metadata 
consensus-subsystem information 
data references 
data structure 
decentralized applications 
design philosophy 
ecosystem 
DApp 
development components 
limitations 
Swarm 
Whisper 
EVM 
gas and transaction cost 
Infura API service 
Merkle Patricia tree 
mining 
PoW 


RLP encoding 
Ropsten test network 
library and connection 
preparation 
send transaction 
set up Ethereum accounts 
sign transaction 
testnet faucets, sender’s account 
smart contracts 
application 
blocks 
compilation 
contract creation 
deploy 
executing 
Remix IDE 
solidity programming language 
transaction 
voting application 
software development and deployment 
state transaction function 
transaction and message structure 
transaction execution information 
trie usage 
Ethereum virtual machine (EVM) 
ABI 
absolute determinism 
easy security 
JVM 
memory 
native operations 
P2P network 
simplicity 
smart contract deployment and usage 
space optimization 
stack 
storage 
Ethminer 
Execution layer 


Externally Owned Accounts (EOAs) 
to Contract Account transaction 
to EOA transaction 


Je 


Feistel cipher 
Fiat currency 
Financial services market 


G 


Game theory 
Bitcoins 
blockchain job 
Byzantine Generals’ Problem 
cricket tournament 
Nash Equilibrium 
prisoner’s dilemma 
real-life situations 
sport event 
strategies 
vegetables 
zero-sum games 

Government sectors 


H 


Handcrafting transactions 
Hash functions 
applications 
basic form 
Bitcoin 
code examples 
core properties 
hash value 
information security applications 
message digest (MD) family 
puzzle friendliness 
RIPEMD 


search puzzle 
security properties 
collision resistance 
pre-image resistance 
SHA 
See Secure Hash Algorithm (SHA) 
Hyperledger 


le 


Initial Coin Offering (ICO) 
Internet Engineering Task Force (IETF) 


K 
Keypairs 


Ib 


Layers 
abstraction 
application 
consensus 
execution 
propagation 
semantic 


M 


Merkle trees 
Message authentication code (MAC) 
Mining 
Mist wallet 
Monetary transactions 
Money 
banking era 
fiat currency 
gold and silver metals 
Internet 
pimitive barter system 


N,O 


Nash Equilibrium 
National Institute of Standards and Technology (NIST) 
National Security Agency (NSA) 


1510, 
PBFT 
See Practical Byzantine Fault Tollerance (PBFT 
Pimitive barter system 
PoS 
See Proof of Stake (PoS 
PoW 
See Proof of Work (PoW 
Practical Byzantine Fault Tollerance (PBFT) 
Prisoner’s dilemma 
Private Ethereum network 
account creation 
first node 
configuration 
custom genesis configuration 
geth command 
genesis.json configuration file 
geth data directory 
install geth 
second node 
command 
genesis.json configuration 
geth console, peers 
geth initialize configuration 
geth logs 
Proof of Stake (PoS) 
Proof of Work (PoW) 
Propagation layer 
Pseudorandom number generator (PRNG) 
Public key infrastructure (PKI) 
Public vs. private blockchains 


R 


RACE Integrity Primitives Evaluation Message Digest 
(RIPEMD) 
Regular transactions 


S 


ScriptPubKey 
Secure Hash Algorithm (SHA) 
DSA 
NSA 
SHA-1 
SHA-2 
SHA-3 
cryptographic hash functions 
Merkle-Damgard construction 
NIST 
sponge construction 
state array representationin 
variants, padding 
SHA-256 and SHA-512 
versions 
Semantic layer 
sendSignedTransaction function 
Simplified Payment Verification (SPV) 
signTransaction function 
Smart contract, Ethereum DApp 
client applications 
html code 
interaction code 
polling web application view 
transaction 
creation 
ABI 
byte code 
polling functionality 
preceding code snippet 
Remix online Solidity editor 


solidity code snippet 
voting functionality 
deploying 
private network 
web3 library and connection 
Smart software engineering 
Solidity programming language 
Stock transaction 
Stream ciphers 
Supply chains 
Symmetric key cryptography 
AES 
See Advanced Encryption Standard (AES 
vs. asymmetric key cryptography 
block ciphers 
ciphertext 
DES 
See Data Encryption Standard (DES 
file transfer protocols 
Kerckhoff’s principle and XOR function 
limitations 
MAC and HMAC 
one-time pad 
sender and receiver 
“shared secret” 
stream ciphers 


T, U, V 


transaction.sign function 
Transmission Control Protocol/Internet Protocol (TCP/IP) 
Truffle 


W, X, Y 


Web3.js 
The Wisdom of Crowds 
World Wide Web (WWW) 


ZL 


Zero-sum games