Beginning Ethereum Smart Contracts Programming: With Examples in Python, Solidity, and Javascript, 2Nd Edition Wei-Meng Lee

Download as pdf or txt
Download as pdf or txt
You are on page 1of 69

Full download ebooks at ebookmeta.

com

Beginning Ethereum Smart Contracts Programming:


With Examples in Python, Solidity, and JavaScript,
2nd Edition Wei-Meng Lee

https://ebookmeta.com/product/beginning-ethereum-smart-
contracts-programming-with-examples-in-python-solidity-and-
javascript-2nd-edition-wei-meng-lee/

OR CLICK BUTTON

DOWLOAD NOW

Download more ebook from https://ebookmeta.com


More products digital (pdf, epub, mobi) instant
download maybe you interests ...

Beginning Swift Programming 1st Edition Wei Meng Lee

https://ebookmeta.com/product/beginning-swift-programming-1st-
edition-wei-meng-lee/

Building Games with Ethereum Smart Contracts:


Intermediate Projects for Solidity Developers Kedar
Iyer

https://ebookmeta.com/product/building-games-with-ethereum-smart-
contracts-intermediate-projects-for-solidity-developers-kedar-
iyer/

Blockchain and Ethereum Smart Contract Solution


Development: Dapp Programming with Solidity 1st Edition
Weijia Zhang

https://ebookmeta.com/product/blockchain-and-ethereum-smart-
contract-solution-development-dapp-programming-with-solidity-1st-
edition-weijia-zhang/

Cambridge IGCSE and O Level History Workbook 2C - Depth


Study: the United States, 1919-41 2nd Edition Benjamin
Harrison

https://ebookmeta.com/product/cambridge-igcse-and-o-level-
history-workbook-2c-depth-study-the-united-states-1919-41-2nd-
edition-benjamin-harrison/
Solidity Programming Essentials: A guide to building
smart contracts and tokens using the widely used
Solidity language 2nd Edition Ritesh Modi

https://ebookmeta.com/product/solidity-programming-essentials-a-
guide-to-building-smart-contracts-and-tokens-using-the-widely-
used-solidity-language-2nd-edition-ritesh-modi/

Hands On Smart Contract Development with Solidity and


Ethereum From Fundamentals to Deployment 1st Edition
Kevin Solorio

https://ebookmeta.com/product/hands-on-smart-contract-
development-with-solidity-and-ethereum-from-fundamentals-to-
deployment-1st-edition-kevin-solorio/

Beginning Programming with Python For Dummies 2nd


Edition John Paul Mueller

https://ebookmeta.com/product/beginning-programming-with-python-
for-dummies-2nd-edition-john-paul-mueller/

Beginning Programming with Python For Dummies 2nd


Edition John Paul Mueller

https://ebookmeta.com/product/beginning-programming-with-python-
for-dummies-2nd-edition-john-paul-mueller-2/

Beginning Programming with Python For Dummies 3rd


Edition John Paul Mueller

https://ebookmeta.com/product/beginning-programming-with-python-
for-dummies-3rd-edition-john-paul-mueller/
Beginning Ethereum
Smart Contracts
Programming
With Examples in Python, Solidity,
and JavaScript
Second Edition

Wei-Meng Lee
Beginning Ethereum Smart Contracts Programming: With Examples in Python,
Solidity, and JavaScript

Wei-Meng Lee
Ang Mo Kio, Singapore

ISBN-13 (pbk): 978-1-4842-9270-9 ISBN-13 (electronic): 978-1-4842-9271-6


https://doi.org/10.1007/978-1-4842-9271-6
Copyright © 2023 by Wei-Meng Lee
This work is subject to copyright. All rights are reserved by the Publisher, whether the whole or part of the
material is concerned, specifically the rights of translation, reprinting, reuse of illustrations, recitation,
broadcasting, reproduction on microfilms or in any other physical way, and transmission or information
storage and retrieval, electronic adaptation, computer software, or by similar or dissimilar methodology now
known or hereafter developed.
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.
Managing Director, Apress Media LLC: Welmoed Spahr
Acquisitions Editor: Joan Murray
Development Editor: Laura Berendson
Editorial Assistant: Gryffin Winkler
Copy Editor: Mary Behr
Cover image designed by eStudioCalamar
Distributed to the book trade worldwide by Springer Science+Business Media New York, 1 New York Plaza,
Suite 4600, New York, NY 10004-1562, USA. 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.
For information on translations, please e-mail [email protected]; for reprint,
paperback, or audio rights, please e-mail [email protected].
Apress titles may be purchased in bulk for academic, corporate, or promotional use. eBook versions and
licenses are also available for most titles. For more information, reference our Print and eBook Bulk Sales
web page at www.apress.com/bulk-sales.
Any source code or other supplementary material referenced by the author in this book is available to
readers on GitHub (github.com/apress). For more detailed information, please visit www.apress.com/
source-code.
Printed on acid-free paper
Table of Contents
About the Author����������������������������������������������������������������������������������������������������� xi

About the Technical Reviewer������������������������������������������������������������������������������� xiii


Acknowledgments���������������������������������������������������������������������������������������������������xv

Introduction�����������������������������������������������������������������������������������������������������������xvii

Chapter 1: Understanding the Science Behind Blockchain: Cryptography��������������� 1


What Is Cryptography?������������������������������������������������������������������������������������������������������������������ 1
Types of Cryptography������������������������������������������������������������������������������������������������������������� 2
Hash Functions����������������������������������������������������������������������������������������������������������������������������� 3
Uses of Hashing����������������������������������������������������������������������������������������������������������������������� 5
Implementing Hashing in Python��������������������������������������������������������������������������������������������� 6
Symmetric Cryptography�������������������������������������������������������������������������������������������������������������� 7
Generating the Shared Key in Python�������������������������������������������������������������������������������������� 8
Performing Symmetric Encryption������������������������������������������������������������������������������������������ 9
Performing Symmetric Decryption������������������������������������������������������������������������������������������ 9
Asymmetric Cryptography���������������������������������������������������������������������������������������������������������� 10
Generating and Saving the Public/Private Key Pairs������������������������������������������������������������� 12
Encrypting Using the Public Key�������������������������������������������������������������������������������������������� 14
Decrypting Using the Private Key������������������������������������������������������������������������������������������ 14
Digital Signature: Signing Using Private Key������������������������������������������������������������������������� 15
Verifying the Digital Signature Using a Public Key���������������������������������������������������������������� 18
How Cryptography Is Used in Blockchain����������������������������������������������������������������������������������� 18
Hashing��������������������������������������������������������������������������������������������������������������������������������� 19
Symmetric and Asymmetric Cryptography���������������������������������������������������������������������������� 19
Digital Signature�������������������������������������������������������������������������������������������������������������������� 20
Summary������������������������������������������������������������������������������������������������������������������������������������ 21

iii
Table of Contents

Chapter 2: Understanding Blockchain�������������������������������������������������������������������� 23


Motivations Behind Blockchain��������������������������������������������������������������������������������������������������� 24
Placement of Trust����������������������������������������������������������������������������������������������������������������� 24
Trust Issues��������������������������������������������������������������������������������������������������������������������������� 25
Solving Trust Issues Using Decentralization�������������������������������������������������������������������������� 26
Example of Decentralization�������������������������������������������������������������������������������������������������� 26
Blockchain As a Distributed Ledger��������������������������������������������������������������������������������������� 29
How a Blockchain Works������������������������������������������������������������������������������������������������������������� 30
Chaining the Blocks��������������������������������������������������������������������������������������������������������������� 31
Immutability of Blockchains�������������������������������������������������������������������������������������������������� 34
Consensus Protocols������������������������������������������������������������������������������������������������������������� 35
Proof of Work������������������������������������������������������������������������������������������������������������������������� 37
Proof of Stake (PoS)�������������������������������������������������������������������������������������������������������������� 41
Blockchain in More Detail����������������������������������������������������������������������������������������������������������� 43
Types of Nodes���������������������������������������������������������������������������������������������������������������������� 44
Merkle Tree and Merkle Root������������������������������������������������������������������������������������������������� 47
Uses of Merkle Tree and the Merkle Root������������������������������������������������������������������������������ 48
Summary������������������������������������������������������������������������������������������������������������������������������������ 49

Chapter 3: Implementing Your Own Blockchain Using Python������������������������������� 51


Your Conceptual Blockchain Implementation����������������������������������������������������������������������������� 51
Obtaining the Nonce�������������������������������������������������������������������������������������������������������������� 53
Installing Flask���������������������������������������������������������������������������������������������������������������������� 55
Importing the Various Modules and Libraries������������������������������������������������������������������������ 56
Declaring the Class in Python������������������������������������������������������������������������������������������������ 56
Finding the Nonce����������������������������������������������������������������������������������������������������������������� 57
Appending the Block to the Blockchain��������������������������������������������������������������������������������� 58
Adding Transactions�������������������������������������������������������������������������������������������������������������� 59
Exposing the Blockchain Class as a REST API����������������������������������������������������������������������� 60
Obtaining the Full Blockchain������������������������������������������������������������������������������������������������ 60
Performing Mining����������������������������������������������������������������������������������������������������������������� 60
Adding Transactions�������������������������������������������������������������������������������������������������������������� 61

iv
Table of Contents

Testing Your Blockchain�������������������������������������������������������������������������������������������������������������� 62


Synchronizing Blockchains��������������������������������������������������������������������������������������������������������� 67
Testing the Blockchain with Multiple Nodes�������������������������������������������������������������������������� 72
Full Listing for the Python Blockchain Implementation��������������������������������������������������������������� 78
Summary������������������������������������������������������������������������������������������������������������������������������������ 85

Chapter 4: Creating Your Own Private Ethereum Test Network������������������������������ 87


Downloading and Installing Geth, the Ethereum Client��������������������������������������������������������������� 87
Installing Geth for macOS������������������������������������������������������������������������������������������������������ 88
Installing Geth for Windows��������������������������������������������������������������������������������������������������� 89
Installing Geth for Linux��������������������������������������������������������������������������������������������������������� 89
Creating the Private Ethereum Test Network������������������������������������������������������������������������������ 90
Creating the Genesis Block��������������������������������������������������������������������������������������������������� 91
Creating a Folder for Storing Node Data�������������������������������������������������������������������������������� 92
Initiating a Blockchain Node�������������������������������������������������������������������������������������������������� 93
Starting Up the Nodes����������������������������������������������������������������������������������������������������������� 94
Managing Accounts������������������������������������������������������������������������������������������������������������������� 107
Removing Accounts������������������������������������������������������������������������������������������������������������� 109
Setting the Coinbase����������������������������������������������������������������������������������������������������������� 109
Summary���������������������������������������������������������������������������������������������������������������������������������� 110

Chapter 5: Using the MetaMask Crypto-Wallet����������������������������������������������������� 111


What Is MetaMask?������������������������������������������������������������������������������������������������������������������ 111
How MetaMask Works Behind the Scenes�������������������������������������������������������������������������� 112
Installing MetaMask������������������������������������������������������������������������������������������������������������ 113
Setting Up the Accounts������������������������������������������������������������������������������������������������������ 115
Using the MetaMask Extension������������������������������������������������������������������������������������������� 119
Selecting Ethereum Networks�������������������������������������������������������������������������������������������������� 121
Getting Test Ethers�������������������������������������������������������������������������������������������������������������� 122
Creating Additional Accounts����������������������������������������������������������������������������������������������� 126
Transferring Ethers�������������������������������������������������������������������������������������������������������������� 129
Recovering Accounts����������������������������������������������������������������������������������������������������������� 135

v
Table of Contents

Importing and Exporting Accounts�������������������������������������������������������������������������������������������� 138


Exporting Accounts�������������������������������������������������������������������������������������������������������������� 138
Importing Accounts������������������������������������������������������������������������������������������������������������� 142
Summary���������������������������������������������������������������������������������������������������������������������������������� 144

Chapter 6: Getting Started with Smart Contracts������������������������������������������������� 145


What Is a Smart Contract?�������������������������������������������������������������������������������������������������������� 145
How Smart Contracts Are Executed������������������������������������������������������������������������������������� 146
Your First Smart Contract���������������������������������������������������������������������������������������������������������� 148
Using the Remix IDE������������������������������������������������������������������������������������������������������������ 148
Compiling the Contract�������������������������������������������������������������������������������������������������������� 152
Testing the Smart Contract Using the JavaScript VM���������������������������������������������������������� 154
Getting the ABI and Bytecode of the Contract��������������������������������������������������������������������� 158
Testing the Smart Contract Using the Goerli Testnet����������������������������������������������������������� 162
Summary���������������������������������������������������������������������������������������������������������������������������������� 166

Chapter 7: Storing Proofs Using Smart Contracts������������������������������������������������ 167


A Smart Contract as a Store of Proofs�������������������������������������������������������������������������������������� 167
Creating the Smart Contract������������������������������������������������������������������������������������������������ 168
Compiling the Contract�������������������������������������������������������������������������������������������������������� 174
Deploying the Contract�������������������������������������������������������������������������������������������������������� 176
Testing the Contract������������������������������������������������������������������������������������������������������������ 177
Making Further Changes to the Smart Contract����������������������������������������������������������������������� 180
Restricting Access to Functions������������������������������������������������������������������������������������������ 181
Accepting Payments in Smart Contracts����������������������������������������������������������������������������� 182
Events in Smart Contracts��������������������������������������������������������������������������������������������������� 188
Cashing Out������������������������������������������������������������������������������������������������������������������������� 191
Destroying a Contract���������������������������������������������������������������������������������������������������������� 193
Summary���������������������������������������������������������������������������������������������������������������������������������� 194

Chapter 8: Using the web3.js APIs����������������������������������������������������������������������� 195


What Is web3.js?����������������������������������������������������������������������������������������������������������������������� 195
Installing web3.js���������������������������������������������������������������������������������������������������������������� 196

vi
Table of Contents

Testing the web3.js Using MetaMask���������������������������������������������������������������������������������� 197


Interacting with a Contract Using web3.js�������������������������������������������������������������������������� 202
Summary���������������������������������������������������������������������������������������������������������������������������������� 214

Chapter 9: Developing Web3 dapps using Python������������������������������������������������ 215


Interacting with Ethereum Using Python���������������������������������������������������������������������������������� 216
Registering with Infura�������������������������������������������������������������������������������������������������������� 217
Connecting to Infura������������������������������������������������������������������������������������������������������������ 220
Fetching a Block������������������������������������������������������������������������������������������������������������������ 221
Setting Up the Accounts������������������������������������������������������������������������������������������������������ 223
Getting the Balance of an Account�������������������������������������������������������������������������������������� 225
Transferring Ethers Between Accounts������������������������������������������������������������������������������� 225
Creating a Dapp Using Python�������������������������������������������������������������������������������������������������� 227
Loading the Contract����������������������������������������������������������������������������������������������������������� 230
Base64 Encoding����������������������������������������������������������������������������������������������������������������� 231
Saving Credentials on the Blockchain��������������������������������������������������������������������������������� 231
Verifying the Result������������������������������������������������������������������������������������������������������������� 234
Summary���������������������������������������������������������������������������������������������������������������������������������� 239

Chapter 10: Project: Online Lottery���������������������������������������������������������������������� 241


How the Lottery Game Works���������������������������������������������������������������������������������������������������� 241
Defining the Smart Contract������������������������������������������������������������������������������������������������ 243
Betting a Number���������������������������������������������������������������������������������������������������������������� 246
Setting the Winning Number and Announcing the Winners������������������������������������������������� 249
Getting the Game Status and Winning Number������������������������������������������������������������������� 253
Cashing Out from the Contract�������������������������������������������������������������������������������������������� 253
Testing the Contract������������������������������������������������������������������������������������������������������������������ 254
Announcing the Winner������������������������������������������������������������������������������������������������������� 258
Saving the ABI of the Contract��������������������������������������������������������������������������������������������� 260
Deploying the Contract to the Testnet��������������������������������������������������������������������������������� 262
Creating the Web Front End������������������������������������������������������������������������������������������������������ 263
Announcing the Winning Number���������������������������������������������������������������������������������������� 269
Cashing Out������������������������������������������������������������������������������������������������������������������������� 271
vii
Table of Contents

The Complete Contract������������������������������������������������������������������������������������������������������������� 272


Summary���������������������������������������������������������������������������������������������������������������������������������� 277

Chapter 11: Creating Your Tokens������������������������������������������������������������������������ 279


What Are Tokens?���������������������������������������������������������������������������������������������������������������������� 279
How Tokens Are Implemented?������������������������������������������������������������������������������������������� 281
Minting New Tokens������������������������������������������������������������������������������������������������������������ 282
Burning Tokens�������������������������������������������������������������������������������������������������������������������� 282
Units Used Internally in Token Contracts����������������������������������������������������������������������������� 283
ERC-20 Token Standard������������������������������������������������������������������������������������������������������� 285
Creating Token Contracts���������������������������������������������������������������������������������������������������������� 287
Overriding the Number of Decimal Places of Precision������������������������������������������������������� 288
Deploying the Token Contract���������������������������������������������������������������������������������������������� 289
Adding the Token to MetaMask������������������������������������������������������������������������������������������� 291
What Can You Do with the Token?��������������������������������������������������������������������������������������� 291
Using Tokens for Smart Contract Payments������������������������������������������������������������������������ 292
Selling Tokens Programmatically���������������������������������������������������������������������������������������������� 300
Calculating the Amount of Tokens Bought��������������������������������������������������������������������������� 302
Deploying the Contract�������������������������������������������������������������������������������������������������������� 304
Summary���������������������������������������������������������������������������������������������������������������������������������� 310

Chapter 12: Creating Non-Fungible Tokens Using ERC-721���������������������������������� 311


What Is an NFT?������������������������������������������������������������������������������������������������������������������������ 311
Ownership vs. Copyright����������������������������������������������������������������������������������������������������� 313
Where Do You Buy or Sell NFTs?����������������������������������������������������������������������������������������� 313
Creating NFTs Using Token Contracts��������������������������������������������������������������������������������������� 314
Who Deploys the NFT Token Contract?�������������������������������������������������������������������������������� 315
Using ERC-721 for Creating NFTs���������������������������������������������������������������������������������������� 315
Deploying the NFT Token Contract��������������������������������������������������������������������������������������� 316
Testing the NFT Contract����������������������������������������������������������������������������������������������������� 318
Summary���������������������������������������������������������������������������������������������������������������������������������� 327

viii
Table of Contents

Chapter 13: Introduction to Decentralized Finance���������������������������������������������� 329


Limitations of Traditional Finance��������������������������������������������������������������������������������������������� 329
Decentralized Finance��������������������������������������������������������������������������������������������������������� 330
Components in DeFi������������������������������������������������������������������������������������������������������������ 331
Stablecoins������������������������������������������������������������������������������������������������������������������������������� 331
Fiat-Backed Stablecoins������������������������������������������������������������������������������������������������������ 333
Crypto-Backed Stablecoins������������������������������������������������������������������������������������������������� 334
Non-Collateralized Stablecoins������������������������������������������������������������������������������������������� 340
Crypto Exchanges��������������������������������������������������������������������������������������������������������������������� 340
Creating a Decentralized Exchange������������������������������������������������������������������������������������� 342
Creating the Token Contract������������������������������������������������������������������������������������������������ 343
Deploying the Token Contract���������������������������������������������������������������������������������������������� 343
Creating the DEX Contract��������������������������������������������������������������������������������������������������� 345
Funding the DEX������������������������������������������������������������������������������������������������������������������ 351
Swapping WML Tokens for LWM Tokens������������������������������������������������������������������������������ 354
Summary���������������������������������������������������������������������������������������������������������������������������������� 359

Index��������������������������������������������������������������������������������������������������������������������� 361

ix
About the Author
Wei-Meng Lee is the founder of Developer Learning
Solutions, a technology company specializing in hands-on
training of blockchain and other emerging technologies.
He has many years of training expertise and his courses
emphasize a learn-by-doing approach. He is a master at
making learning a new programming language or technology
less intimidating and more fun. He can be found speaking
at conferences worldwide such as NDC, and he regularly
contributes to online and print publications such as Medium
(https://weimenglee.medium.com) and CoDe Magazine.
He is active on social media, on his blog calendar.learn2develop.net, on Facebook
(www.facebook.com/DeveloperLearningSolutions), on Twitter as @weimenglee, and
on LinkedIn (linkedin.com/leeweimeng).

xi
About the Technical Reviewer
Prasanth Sahoo is a Blockchain Certified Professional,
Professional Scrum Master, and Microsoft Certified
Trainer who is passionate about helping others
learn how to use and gain benefits from the latest
technologies. He is a thought leader and practitioner
in blockchain, cloud, and Scrum. He also handles the
Agile methodology, cloud, and blockchain technology
community initiatives within TransUnion through
coaching, mentoring, and grooming techniques.
Prasanth is an adjunct professor and a technical speaker. He was selected as a speaker
at the China International Industry Big Data Expo 2018 by the Chinese government and
also to the International Blockchain Council by the governments of Telangana and Goa.
He also received accolades for his presentation at China International Industry Big Data
Expo 2018 by the Chinese government. Prasanth has published a patent titled "Digital
Educational Certificate Management System using IPFS Based Blockchain."
To date, Prasanth has reached over 50,000 students, mostly within the technical
domain. He is a working group member of the CryptoCurrency Certification
Consortium, Scrum Alliance, Scrum Organization, and International Institute of
Business Analysis.

xiii
Acknowledgments
Writing a book is immensely exciting, but along with it comes long hours of hard work
and responsibility, straining to get things done accurately and correctly. To make a book
possible, a lot of unsung heroes work tirelessly behind the scenes.
For this, I would like to take this opportunity to thank a number of special people
who made this book possible. First, I want to thank my acquisitions editor, Joan Murray,
for giving me this opportunity. Thanks for suggesting that I update this book with the
latest happenings in the crypto world!
Next, a huge thanks to Jill Balzano, my associate editor, who was always very patient
with me, even though I missed several of my deadlines for the revision of this book.
Thanks, Jill, for your guidance. I could not finish the book without your encouragement
and help!
Equally important is my project coordinator, Shobana Srinivasan. Shobana has been
very patient with me during the whole project while I struggle between work and writing.
Thanks, Shobana, for the assistance rendered during the project!
Last, but not least, I want to thank my parents and my wife, Sze Wa, for all
the support they have given me. They have selflessly adjusted their schedules to
accommodate my busy schedule when I was working on this book. I love you all!

xv
Introduction
Welcome to Beginning Ethereum Smart Contracts Programming, Second Edition!
This book is a quick guide to getting started with Ethereum smart contracts
programming. It starts off with a discussion of blockchain and the motivations behind it.
You will learn what a blockchain is, how blocks in a blockchain are chained together, and
how blocks get added to a blockchain. You will also understand how mining works and
discover the various types of nodes in a blockchain network. Since the publication of the
first edition of this book, a lot of things have changed. In particular, Ethereum has been
updated to use Proof of Stake (PoS) (instead of Proof of Work) as its consensus algorithm.
This book has been updated to include a discussion of how PoS works.
Once that is out of the way, you dive into the Ethereum blockchain. You will learn
how to use an Ethereum client (Geth) to create a private Ethereum blockchain and
perform simple transactions such as sending Ethers to another account.
The next part of this book discusses smart contract programming, a unique feature of
the Ethereum blockchain. You will jumpstart on smart contracts programming without
needing to wade through tons of documentation. The learn-by-doing approach of this
book makes you productive in the shortest amount of time. By the end of this book,
you should be able to write smart contracts, test them, deploy them, and create web
applications to interact with them. In this second edition, I have added more examples
to make it easy for you to explore more complex smart contracts.
The last part of this book touches on tokens and DeFi (decentralized finance),
something that has taken the cryptocurrency market by storm. You will be able to create
your own tokens, launch your own ICO, and write token contracts that allow buyers
to buy tokens using Ethers. As a bonus, I show you how to write a DEX (decentralized
exchange) smart contract to exchange two different tokens!
This book is designed for those who want to get started quickly with Ethereum smart
contracts programming. Basic programming knowledge and an understanding of Python
or JavaScript are recommended.
I hope you enjoy working on the sample projects as much as I enjoyed creating them!

xvii
CHAPTER 1

Understanding the
Science Behind
Blockchain: Cryptography
The reason you are reading this book is because you want to understand what a
blockchain is, how it works, and how you can write smart contracts on it to do cool
things. And while I perfectly understand that you are excited to get started in this first
chapter, we need to take a step back and look at one fundamental technology that makes
blockchain possible: cryptography.
In this chapter, I will explain what cryptography is, the different types of
cryptographic algorithms, how they work, and how they play a vital role in the world
of blockchain. I will also show you how to experiment with the various cryptographic
algorithms using the Python programming language. Even if you are familiar with
cryptography, I suggest scanning through this chapter so that you have a firm foundation
for the subsequent chapters.

What Is Cryptography?
Whether you are trying to build a web application to store users’ credentials or writing
a network application to securely transmit encrypted messages, or even trying to
understand how blockchain works, you need to understand one important topic:
cryptography.
So, what exactly is cryptography? Put simply, cryptography (or cryptology) is the
practice and study of hiding information. It is the science of keeping information secret
and safe.

1
© Wei-Meng Lee 2023
W.-M. Lee, Beginning Ethereum Smart Contracts Programming, https://doi.org/10.1007/978-1-4842-9271-6_1
Chapter 1 Understanding the Science Behind Blockchain: Cryptography

One of the simplest and most widely known cryptographic algorithms is the Caesar
Cipher. It is a very simple algorithm in which each letter in the plaintext is replaced by a letter
a fixed number of positions down the alphabet. Consider the example shown in Figure 1-1.

Figure 1-1. Understanding how the Caesar Cipher works

As you can observe, each character in the alphabet is shifted down three positions.
A becomes D, B becomes E, and so on. If you want to send a sentence (known as the
plaintext), say ATTACK, to your recipient, you map each of the characters in the sentence
using the above algorithm and derive the encrypted sentence (known as the ciphertext):
DWWDFN. When the recipient receives the ciphertext, they reverse the process to obtain
the plaintext. While this algorithm may seem impressive (especially in the early days
of cryptography), it no longer works as intended as soon as someone knows how the
messages are encrypted. Nevertheless, this is a good illustration of the attempt by early
inventors of cryptography to hide information. Today, the cryptographic algorithms we
use are much more sophisticated and secure.
In the following sections, I will explain the main types of cryptographic functions
and how they are used.

Types of Cryptography
There are three main types of cryptography:

• Hash functions

• Symmetric cryptography

• Asymmetric cryptography

In the following sections, I will go through each of the above types in more detail.

2
Chapter 1 Understanding the Science Behind Blockchain: Cryptography

Hash Functions
Hashing is the process in which you convert a block of data of arbitrary size to a
fixed-size value. The function that performs this process is known as a hash function .
Figure 1-2 shows the hashing process.

Figure 1-2. A hash function converts a block of data of variable length to


a fixed-­length output

Tip A commonly-used hash function is SHA256. SHA stands for Secure Hash
Algorithms.

For example, the SHA256 hash function converts a block of text into a 256-bit
hash output. The resultant hash is usually written in hexadecimal, and since each
hexadecimal takes up 4 bits, a 256-bit hash will have 64 characters. To experience how
hashing works, go to https://emn178.github.io/online-tools/sha256.html, type in a
sentence, and observe the result (see Figure 1-3).

3
Chapter 1 Understanding the Science Behind Blockchain: Cryptography

Figure 1-3. Trying out the SHA256 hash function

Hashing has the following important properties:

• Preimage resistant: Based on the hash created, you cannot obtain


the original block of text.

• Deterministic: The same block of text will always produce the same
hash output.

• Collision resistant: It is hard to find two different blocks of text that


will produce the same hash.

Another important feature of hashing is that a single change in the original text will
cause a totally different hash to be generated. This is also known as the avalanche effect.
For example, a change in a single character in the input shown in Figure 1-4 will have a
totally different output.

4
Chapter 1 Understanding the Science Behind Blockchain: Cryptography

Figure 1-4. A single change in the input will cause a totally different output hash

Uses of Hashing
Hashing fulfils some very important roles in computing. For one, websites use hashing
to store your password, instead of storing it in plaintext. Storing your password as hashes
prevents hackers from reversing the hashes and obtaining your original password (which
may very likely be used on other websites as well).
Hashing also plays a very crucial role in blockchain, where each block is “chained”
to the previous block using the hash of the previous block. Any modifications to a block
will invalidate the hash stored in the next block, and the rest of the blocks will hence be
invalid.

Tip Some commonly used hashing algorithms are MD5, SHA256, SHA512, and
Keccak-256.

5
Chapter 1 Understanding the Science Behind Blockchain: Cryptography

Implementing Hashing in Python

Note To install Python on your computer, the easiest way is to download the
Anaconda package (www.anaconda.com/products/distribution). If you do
not want to install Python on your computer, you can use Google Colab
(https://colab.research.google.com).

In Python, you can use the hashlib module to perform hashing. The following code
snippet uses the sha256() function to perform hashing on a string:

import hashlib

result = hashlib.sha256(
    bytes("The quick brown fox jumps over the lazy dog",'utf-8'))

Note that the string to be hashed must be passed to the sha256() function as a
byte array. And so you use the bytes() function to convert the string into a byte array.
Alternatively, in Python, you can prefix the string with a b to denote a bytes string literal:

result = hashlib.sha256(
    b'The quick brown fox jumps over the lazy dog')

The sha256() function returns a sha256 hash object. To get the resultant hash in
hexadecimal, you can call the hexdigest() function of the sha256 hash object:

print(result.hexdigest())

The hash for the above string is as follows:

d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592

If you make a small change to the original string, the output is drastically different
from the previous hash:

result = hashlib.sha256(
    b'The quick brown fox jumps over the lazy dag')
print(result.hexdigest())
# output:
# 559cc2cb0e1998182b4b6343e38611b3757e8a6279d43e9914d74dfb7e7089e6

6
Chapter 1 Understanding the Science Behind Blockchain: Cryptography

Symmetric Cryptography
In symmetric cryptography, you use the same cryptographic key (commonly referred to
as the shared key) for both the encryption of plaintext and the decryption of ciphertext.
Figure 1-5 shows the use of the shared key for both encryption and decryption.

Figure 1-5. Using a shared key for encryption and decryption

Symmetric cryptography is fast and simple, but the main problem is how to ensure
that the key is kept secret. For example, if Tom wants to send a secret message to Susan,
Tom can encrypt the message using the shared key and Susan can decrypt the encrypted
message using the same shared key. The problem here is how can Tom securely send
Susan the shared key? Can Tom email Susan? Send it through SMS or WhatsApp? How
about through the traditional post office? All these methods are not absolutely safe and
are subject to eavesdropping. Moreover, there is this popular saying, “Three may keep a
secret if two of them are dead.” This means, if more than one person knows the secret, it
is no longer a secret.
Having said that, symmetric cryptography has its uses and applications. It is useful
when you want to protect your private data. For example, say you have some confidential
data on your computer that you want to prevent others from seeing. Using symmetric
cryptography, you can encrypt and decrypt the data using the same key, which is only
known to you and no one else.

7
Chapter 1 Understanding the Science Behind Blockchain: Cryptography

Tip Some examples of symmetric key algorithms are AES (Advanced Encryption


Standard, originally known as Rijndael), DES (Data Encryption Standard), and IDEA
(International Data Encryption Algorithm).

Generating the Shared Key in Python


In Python, you can use the cryptography module for symmetric and asymmetric
cryptography. To use the cryptography module, install it using pip:

$ pip install cryptography

Let’s generate a shared key in Python. To do so, use the Fernet class:

from cryptography.fernet import Fernet

# generate the shared key


shared_key = Fernet.generate_key()
print(shared_key)

# base64 encoded, binary format


# A new key is generated each time you run this block of code
# e.g. b'ixXEfrz2NTJlxy1OhxXlsCiFf0Ycg_GL0Cy0MlgTv4U='

Tip The Fernet class is an implementation of symmetric (also known as “secret


key”) authenticated cryptography. Fernet uses the AES algorithm in CBC mode with
a 128-bit key for encryption. For more details, refer to https://github.com/
fernet/spec/blob/master/Spec.md.

The generate_key() function returns a shared key in binary format and it is base64
encoded.

8
Chapter 1 Understanding the Science Behind Blockchain: Cryptography

Performing Symmetric Encryption


To encrypt your data using the shared key, you first create an instance of the Fernet class
using the shared key:

# create an instance of the Fernet class


fernet = Fernet(shared_key)

You can then use the encrypt() function to encrypt your data:

# encrypt the message with the shared key


ciphertext = fernet.encrypt(
    bytes("Secret message!",'utf-8'))
# remember to pass in a byte array

You can save the encrypted data into a file:

# write the encrypted message to file


with open('message.encrypted', 'wb') as f:
    f.write(ciphertext)

And you can save the shared key to file:

# write the shared key to file


with open('symmetric_key.crypt', 'wb') as f:
    f.write(shared_key)

Performing Symmetric Decryption


Decryption is similar to encryption. First, load the shared key from the file (which you
saved previously):

with open('symmetric_key.crypt', 'rb') as f:


    shared_key = f.read()
print(shared_key)

Then, create an instance of the Fernet class using the shared key and call the
decrypt() function to decode the ciphertext:

# create an instance of the Fernet class


fernet = Fernet(shared_key)

9
Chapter 1 Understanding the Science Behind Blockchain: Cryptography

# decrypt the encrypted message read from file


with open('message.encrypted', 'rb') as f:
    print(fernet.decrypt(f.read()).decode("utf-8"))

Asymmetric Cryptography
Unlike symmetric cryptography, which uses a single shared key, asymmetric
cryptography uses a key-pair, one public and one private.

Tip Asymmetric cryptography is also known as public-key cryptography.

A public key algorithm generates two keys that are mathematically linked:

• One public and one private: The public key, as the name implies,
should be made public. The private key, on the other hand,
absolutely must be kept a secret.

• You can encrypt data with a public key and decrypt with the private
key. For example, if Tom wants to send a secret message to Susan,
Tom could encrypt the message using Susan’s public key and only
Susan can decrypt the secret message with her private key.

• You can encrypt data with a private key and decrypt with the public
key. At first, this sounds counterintuitive. If one could decrypt using
the public key (which is supposed to be public), what’s the point of
this? Actually, this is useful. Suppose Tom encrypts a message using
his own private key and sends it to Susan. When Susan receives
the message, she can try to decrypt it using Tom’s public key. If the
message can be decrypted, this means that the message has not been
tampered with and that it indeed comes from Tom. On the other
hand, if the message has been tampered with, Susan would not be
able to decrypt the message using Tom’s public key. This technique is
used in creating a digital signature.

Tip Some examples of public key algorithms are RSA (Rivest–Shamir–Adleman),


Elliptical Curve Cryptography (ECC), and TLS/SSL protocol.

10
Chapter 1 Understanding the Science Behind Blockchain: Cryptography

Figure 1-6 shows the first approach, that of encrypting the data using the public key
and then decrypting it using the private key.

Figure 1-6. Encrypting data using the public key and then decrypting the
ciphertext using the private key

Figure 1-7 shows the second approach of encrypting the data using the private key
and then decrypting it using the public key.

11
Chapter 1 Understanding the Science Behind Blockchain: Cryptography

Figure 1-7. Encrypting data using the private key and then decrypting the
ciphertext using the public key

Generating and Saving the Public/Private Key Pairs


Let’s generate the public/private key pair using the cryptography module with some
commonly used parameters:

from cryptography.hazmat.backends import default_backend


from cryptography.hazmat.primitives.asymmetric import rsa

# generate the private key


private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048,
    backend=default_backend()
)

# derive the public key from the private key


public_key = private_key.public_key()

12
Chapter 1 Understanding the Science Behind Blockchain: Cryptography

In this code snippet, you are using the RSA algorithm to first generate a private key.
Using the private key, you can then derive its corresponding public key. Once the keys
are generated, it’s useful to serialize (flatten) them to files:

from cryptography.hazmat.primitives import serialization

#---serialize the private key as bytes---


pem = private_key.private_bytes(
    encoding = serialization.Encoding.PEM,
    format = serialization.PrivateFormat.PKCS8,
    encryption_algorithm = serialization.NoEncryption()
)
with open('private_key.pem', 'wb') as f:
    f.write(pem)

#---serialize the public key as bytes---


pem = public_key.public_bytes(
    encoding = serialization.Encoding.PEM,
    format = serialization.PublicFormat.SubjectPublicKeyInfo
)
with open('public_key.pem', 'wb') as f:
    f.write(pem)

You also need to be able to load them back from files:

with open('private_key.pem', 'rb') as f:


    private_key = serialization.load_pem_private_key(
        f.read(),
        password = None,
        backend = default_backend()
    )

with open('public_key.pem', 'rb') as f:


    public_key = serialization.load_pem_public_key(
        f.read(),
        backend = default_backend()
    )

13
Chapter 1 Understanding the Science Behind Blockchain: Cryptography

Encrypting Using the Public Key


You are now ready to perform encryption using the public key:

from cryptography.hazmat.primitives import hashes


from cryptography.hazmat.primitives.asymmetric import padding

plaintext = bytes("This message is secret.",'utf-8')

# encrypt the message using the public key


ciphertext = public_key.encrypt(
    plaintext,
    padding.OAEP(
        mgf = padding.MGF1(algorithm = hashes.SHA256()),
        algorithm = hashes.SHA256(),
        label = None
    )
)

Note The encrypted ciphertext is a byte array.

Decrypting Using the Private Key


With the ciphertext created, you can decrypt it using the private key:

# decrypt using the private key


plaintext = private_key.decrypt(
    ciphertext,
    padding.OAEP(
        mgf = padding.MGF1(algorithm = hashes.SHA256()),
        algorithm = hashes.SHA256(),
        label = None
    )
)

14
Chapter 1 Understanding the Science Behind Blockchain: Cryptography

# decode the plaintext as it is a byte array


print(plaintext.decode('utf-8'))
# This message is secret.

Note The decrypted plaintext is a byte array.

Digital Signature: Signing Using Private Key


Earlier I mentioned that in a digital signature you perform encryption using the private
key and then decrypt using the public key. How does this really work and how is it
useful? Let’s look at the flow of events shown in Figure 1-8.

Figure 1-8. Generating a digital signature using the private key

15
Chapter 1 Understanding the Science Behind Blockchain: Cryptography

• First, the text to be sent is hashed using a hash function.

• The hash is then encrypted using the private key and turned into a
digital signature (this also includes the information on the hashing
algorithm used).

• The original text, together with the digital signature, are then sent to
the recipient. This is known as the signed message.

Figure 1-9 shows what happens when the signed message is received by the
recipient.

Figure 1-9. Verifying a digital signature using the public key

• When the signed message is received, the receiver uses the sender’s
public key to decrypt the hash from the digital signature.

• The receiver also hashes the received text and compares it with the
hash that was decrypted in the previous step.

• If the two hashes match, this means the text has not been
tampered with.

Note A digital signature is a mathematical technique used to validate the


authenticity and integrity of a message, software, or digital document.

16
Chapter 1 Understanding the Science Behind Blockchain: Cryptography

Let’s create a digital signature using the private key.


Technically, you can’t call the encrypt() function on the private key:

private_key.encrypt(...)    # ERROR
# AttributeError: '_RSAPrivateKey' object has no attribute 'encrypt'

Rather, you call the sign() function:

import base64

plaintext = bytes("This message is public.",'utf-8')

# sign the message using the private key


signed = private_key.sign(
    plaintext,
    padding.PSS(
        mgf = padding.MGF1(algorithm=hashes.SHA256()),
        salt_length = padding.PSS.MAX_LENGTH
    ),
    hashes.SHA256()
)

# print out the digital signature using base64 encoding


signed_base64 = base64.b64encode(signed).decode('utf-8')
print(signed_base64)

Here you use the private key to sign the message. The sign() function returns the
digital signature of the string. It returns the digital signature as a byte array, and in the
above code snippet you encode it using base64 encoding and then converted it to string.
The output looks like this:

aNUZixxLUiRRpDjm+nqkcaZo5URklvIA/hiSECR+DoLmS+oVb650Ic5/vg6ADmCvi91CSwiXRY
kknDBEr2qTWaK+Fe9UPqukDFx8WwyW7K2NacjS8TiKqAfPPSH4t2l9ohexwTqfih9oZXli57zf
Z4LKaY63iQxXlWKE9S5OZ0hWyGUfygEInY8OZerGKWFnmxuXHjWNCpDmzSngP04MYBBnfoPVps
Dg7vgKL0gpaz1dn2Qg+Ra2GFLmznqjYKq2qP43zLrdYSmzH3MmPAkO0AIh8XaRnHc+q0XYyUGhT
Bm9iIa7rS8eYaB7MD9G18j0HA7lWWVQjqujnFCQNm8Npg==

When you transmit the message (plaintext), you also send the digital signature
along with it.

17
Chapter 1 Understanding the Science Behind Blockchain: Cryptography

Verifying the Digital Signature Using a Public Key


When the recipient receives the message along with the digital signature, they can
simply verify that the message has not been tampered by calling the verify() function
on the public key:

from cryptography.exceptions import InvalidSignature

# decode the digital signature from base64


signed = base64.b64decode(signed_base64)

try:
    public_key.verify(
        signed,
        plaintext,    # from the previous section
        padding.PSS(
            mgf = padding.MGF1(hashes.SHA256()),
            salt_length = padding.PSS.MAX_LENGTH
        ),
        hashes.SHA256()
    )
    print('Signature is valid!')
except InvalidSignature:
    print('Signature is invalid!')

Note that you have to catch the exception raised by the verify() function. If there is
no exception, the signature is deemed to be correct; otherwise, it is invalid.

How Cryptography Is Used in Blockchain


If you have been following up to this point, you should now have a good idea of how
cryptography works. You might now be wondering how cryptography plays an important
role in blockchain.

18
Chapter 1 Understanding the Science Behind Blockchain: Cryptography

The following sections discuss how the various cryptographic algorithms are used in
blockchain. If you are new to blockchain, feel free to skip the following sections and read
the next chapter. Come back to the next few sections after you have read the following
chapters:
• Chapter 2: Hashing is used to “chain” the blocks in a blockchain.

• Chapters 4 and 5: Asymmetric cryptography is used to generate your


accounts, and symmetric cryptography is used to secure the accounts
you have created in your crypto-wallets.
• Chapter 4 onwards: Asymmetric cryptography is used to create digital
signatures for all of your transactions on the blockchain.

H
 ashing
As mentioned briefly, hashing is used to “chain” the blocks in a blockchain. Each block
in a blockchain contains the hash of the previous block. Doing so allows you to ensure
that data recorded on the blockchain are immutable and thus prevent tampering.
Another good use case of hashing is when storing data on the blockchain. Since all
data on public blockchains are open to scrutiny, you should not store private data on the
public blockchain. If you need to store private data on a public blockchain for proofing
purposes, you should instead store the hash of the data, since it is not reversible.
Chapter 7 provides a good example of this.

Symmetric and Asymmetric Cryptography


Symmetric and asymmetric cryptography are used in generating and securing of
accounts in blockchain.
As shown in Figure 1-10, when you create an account in Ethereum, a private key
using asymmetric cryptography is first generated.

19
Chapter 1 Understanding the Science Behind Blockchain: Cryptography

Figure 1-10. Understanding how an account is generated and secured

Using this private key, a public key is generated using ECDSA (Elliptic Curve Digital
Signature Algorithm). This public key is then used to generate the account address using
the Keccak256 hashing algorithm. The last 20 bytes of this output is used as the address
of the account.
At the same time, remember that when you create an account you must supply
a password. This password is used to encrypt your private key using symmetric
cryptography.

D
 igital Signature
In blockchain, a digital signature is used when creating transactions. In Chapter 4, you
will learn how to create a simple transaction by sending some Ethers from one account
to another.
When you create a transaction, the transaction is signed using your account’s private
key to derive the digital signature. The digital signature, together with the details of the
transaction, are then broadcasted to the various miners/validators in the blockchain
network (see Figure 1-11).

20
Chapter 1 Understanding the Science Behind Blockchain: Cryptography

Figure 1-11. A digital signature is created for a transaction to prove the identity of
the creator

The miners/validators, upon receiving your transaction, verify the authenticity of


your transaction using the transaction’s digital signature. Once the transaction is verified
to be authentic, the miners/validators proceed to verify the content of the transaction.

S
 ummary
In this chapter, you learned about the main science behind blockchain: cryptography.
You learned about hashing, symmetric cryptography, and asymmetric cryptography. If
you are familiar with Python, I strongly suggest you try out the code samples so that you
get first-hand experience with the various cryptographic algorithms. With that, you are
now ready to dive into the world of blockchain. See you in Chapter 2!

21
CHAPTER 2

Understanding Blockchain
One of the hottest technologies of late is blockchain. But what exactly is a blockchain?
And how does it actually work? In this chapter, you will explore the concept of
blockchain, how the concept was conceived, and what problems it aims to solve. By the
end of this chapter, the idea and motivation behind blockchain will be crystal clear.

Tip For the clearly impatient, a blockchain is a digital transaction of records that
is arranged in chunks of data called blocks. These blocks link with each other
through a cryptographic validation known as a hashing function. Linked together,
these blocks form an unbroken chain, a blockchain. A blockchain is programmed
to record not only financial transactions but virtually everything of value. Another
common name for blockchain is distributed ledger.

Hold on tight, as I’m going to discuss a lot of concepts in this chapter. But if you
follow along closely, you’ll understand the concepts of blockchain and be on your way to
creating some really creative applications on the Ethereum blockchain in the upcoming
chapters!

Tip Ethereum is an open-source public blockchain that is similar to the Bitcoin


network. Besides offering a cryptocurrency known as Ether (which is similar to
Bitcoin), the main difference between it and Bitcoin is that it offers a programming
platform on top of the blockchain called Smart Contract. This book focuses on the
Ethereum blockchain and Smart Contract.

23
© Wei-Meng Lee 2023
W.-M. Lee, Beginning Ethereum Smart Contracts Programming, https://doi.org/10.1007/978-1-4842-9271-6_2
Chapter 2 Understanding Blockchain

Motivations Behind Blockchain


Most people have heard of cryptocurrencies, or at least, Bitcoin.

Note The technology behind cryptocurrencies is blockchain.

To understand why we need cryptocurrencies, you have to first start by


understanding a fundamental concept: trust. Today, any asset of value or transaction
is recorded by a third party, such as a bank, government, or company. We trust banks
to not steal our money, and they are regulated by the government. And even if the
banks fail, they are backed by the government. We also trust our credit card companies.
Sellers trust credit card companies to pay them the money, and buyers trust credit card
companies to settle any disputes with the sellers.

Placement of Trust
All of this boils down to one key concept: the placement of trust. And that is, we place
our trust in a central body. Think about it. In our everyday life, we place our trust in
banks and we place our trust in our governments.
Even for simple mundane day-to-day activities, we place our trust in central bodies.
For example, when you go to the library to borrow a book, you trust that the library will
maintain a proper record of the books you have borrowed and returned.
The key theme is that we trust institutions but don’t trust each other. We trust our
government, banks, even our library, but we just don’t trust each other. As an example,
consider the following scenario. Imagine you work at a cafe, and someone walks up to
you and offers you a $10 bill for two cups of coffee. Another person offers to pay you
for the two cups of coffee using a handwritten note saying he owes you $10. Which one
would you trust? The answer is pretty obvious, isn’t it? Naturally you would trust the
$10 bill as opposed to the handwritten note. This is because you understand that you
can use the $10 bill elsewhere for other goods or services and that it is backed by the US
government. In contrast, the handwritten note is not backed by anyone, except perhaps
the person who wrote it, and hence it has literally no value.
Now let’s take the discussion a bit further. Again, imagine you are trying to sell
something. Someone comes up to you and suggests paying for your goods using the
currencies shown in Figure 2-1.

24
Chapter 2 Understanding Blockchain

Figure 2-1. Currencies from two countries

Would you accept the currencies shown in the figure? Here, you have two different
currencies, one from Venezuela and one from Zimbabwe. In this case, the first thing you
consider is whether these currencies are widely accepted. Then you consider your trust
in these governments. You might have read in the news about the hyperinflation in these
two countries, and that these currencies might not retain their value over time. So, would
you accept these currencies as payment?

Trust Issues
Earlier, I mentioned that people trust institutions and don’t trust each other. But even
established economies can fail, such as in the case of the financial crisis of the United
States in 2007–2008. Investment bank Lehman Brothers collapsed in September 2008
because of the subprime mortgage market. So, if banks from established economies
can collapse, how can people in less-developed countries trust their banks and
governments? Even if the banks are trusted, your deposits may be monitored by the
government, and they could arrest you based on your transactions.
As you saw in the example in the previous section, there are times when people don’t
trust institutions, especially if the political situation in that country is not stable.

25
Chapter 2 Understanding Blockchain

This brings us to the next key issue: even though people trust institutions,
institutions can fail. And when people lose trust in institutions, people turn to
cryptocurrencies. In the next section, I will discuss how to solve the trust issues using
decentralization, a fundamental concept behind cryptocurrency.

Solving Trust Issues Using Decentralization


Now that you have seen the challenges of trust, who to trust and who not to trust,
it is time to consider a way to solve the trust issues. In particular, blockchain uses
decentralization to solve the trust issue.
In order to understand decentralization, let’s use a very simple example based on
our daily lives.

Example of Decentralization
To understand how decentralization solves the trust issue, let’s consider a real-life
example.
Imagine a situation where you have three persons with DVDs that they want to share
with one another (see Figure 2-2).

Figure 2-2. Sharing DVDs among a group of people

26
Chapter 2 Understanding Blockchain

The first thing they need to do is to have someone keep track of the whereabouts
of each DVD. Of course, the easiest is for each person to keep track of what they have
borrowed and what they have lent, but since people inherently do not trust each other,
this approach is not very popular among the three people.
To solve this issue, they decided to appoint one person, say B, to keep a ledger of the
whereabouts of each DVD (see Figure 2-3).

Figure 2-3. Appointing a particular person to keep the records

This way, there is a central body to keep track of the whereabouts of each DVD. But
wait, isn’t this the problem with centralization? What happens if B is not trustworthy?
Turns out that B has the habit of stealing DVDs, and he can easily modify the ledger to
erase the record of DVDs that he has borrowed. So, there must be a better way.
Then someone has an idea! Why not let everyone keep a copy of the ledger?
Whenever someone borrows or lends a DVD, the record is broadcast to everyone, and
everyone records the transaction. See Figure 2-4.

27
Chapter 2 Understanding Blockchain

Figure 2-4. Getting everyone to keep the records

So now the record keeping is decentralized. Three people now hold the same ledger.
But wait a minute. What if A and C conspire to change the ledger so that they can steal
the DVDs from B? Since majority wins, as long as there is more than 50% of the people
with the same records, the others would have to listen to the majority. And because there
are only three people in this scenario, it is extremely easy to get more than 50% of the
people to conspire.
The solution is to have a lot more people to hold the ledger, especially people who
are not related to the DVD-sharing business (see Figure 2-5).

28
Chapter 2 Understanding Blockchain

Figure 2-5. Getting a group of unrelated people to help keep the records

This way, it makes it more difficult for one party to alter the records in the ledger. In
order to alter a record, it would need to involve a number of people to do so all at the
same time, which is a time-consuming affair. And this is the key idea behind a distributed
ledger, commonly known as blockchain.

Blockchain As a Distributed Ledger


Now that you have a better idea of a distributed ledger, you can associate it with the term
blockchain. Using the DVD exchange example, each time a DVD is borrowed or returned,
a transaction is created. A number of transactions are then grouped into a block. As more
transactions are performed, the blocks are linked together cryptographically, forming
what we now call a blockchain (see Figure 2-6).

29
Chapter 2 Understanding Blockchain

Figure 2-6. Transactions form a block, and blocks are then chained

Here’s a summary of a few important points:

• Centralized databases and institutions work when there is trust in the


system of law, governments, regulatory bodies, and people.

• A decentralized database built on the blockchain removes the need


for the trust in a central body.

• A blockchain can be used for anything of value, not just currencies.

How a Blockchain Works


At a very high level, a blockchain consists of a number of blocks. Each block contains a
list of transactions and a timestamp (see Figure 2-7).

30
Chapter 2 Understanding Blockchain

Figure 2-7. Every blockchain has a beginning block known as the genesis block

The blocks are connected to each other cryptographically, the details of which
I will discuss in the sections ahead. The first block in a blockchain is known as the
genesis block.

Note Every blockchain has a genesis block.

So, the next important questions is, how do you chain the blocks together?

Chaining the Blocks


To understand how blocks in a blockchain are chained together, you must understand
one key concept: hashing.

Tip Chapter 1 discussed hashing in more detail. Be sure to read it first before
continuing with this section.

31
Chapter 2 Understanding Blockchain

Recall that a hash function is a function that maps data of arbitrary size to data of
fixed size. By altering a single character in the original string, the resultant hash value is
totally different from the previous one. Most importantly, observe that a single change
in the original message results in a completely different hash, making it difficult to know
that the two original messages are similar.
A hash function has the following characteristics:

• It is deterministic: The same message always results in the


same hash.

• It is a one-way process: When you hash a string, it is computationally


hard to reverse a hash to its original message.

• It is collision resistant: It is hard to find two different input messages


that hash to the same hash.

You are now ready to learn how blocks in a blockchain are chained together. To chain
the blocks together, the content of each block is hashed and then stored in the next block
(see Figure 2-8). This way, if any transaction in a block is altered, this will invalidate the
hash of the current block, which is stored in the next block, which in turn invalidates the
hash of the next block, and so on.

32
Random documents with unrelated
content Scribd suggests to you:
kuitenkin lietsoo halua? Hupsu, hupsu, kun sysäät luotasi onnen
mahdollisuuden!»

Häneltä pääsi syvä ähkäisyn tapainen hengähdys ja hän syöksähti


eteenpäin. Mutta kuolemanpelon vallassa hän sitten pysähtyi,
kiskaisi katseensa irti kaihoamastaan naisesta ja riensi yöhön.
VIII

Pienessä, arabialaisleirin keskelle pystytetyssä teltassa Algerian


etelärajoilla istui Craven kirjoittamassa. Paahtavan kuumaa päivää
oli seurannut ihan tyyni, tukahduttava yö, ja Craven oli märkä hiestä,
jota tippui hänen otsaltaan ja joka muodosti nahkeita läiskiä hänen
kätensä alle, tehden kirjoittamisen työlääksi ja vaikeaksi; olisipa se
ollut tuiki mahdotonta, jollei hän olisi sormiensa kohdalle levittänyt
imupaperia. Hänen ohut silkkipaitansa, jonka kaula-aukon hän oli
vetänyt hyvin laajaksi ja jonka hihat hän oli käärinyt kyynärpäittensä
yläpuolelle, oli liimaantunut hänen leveihin hartioihinsa. Valon
houkuttelemina kierteli pienen pieniä kärpäsiä sakeana parvena
lampun ympärillä, tanssien liekin hohteessa ja kärventäen siipiänsä,
niin että niitä sakeasti tippui leiripöytää peittäville, tiheästi kirjoitetuille
liuskoille, tahraten vielä kosteata mustetta ja kasaantuen tahmaksi
hänen kynänteräänsä. Vähänväliä hän kärsimättömästi pyyhkäisi ne
pois.

Hänen takanaan nurkassa kyyrötti Joshio, tutkimattomat, keltaiset


kasvot märkinä ja kiiltävinä, ja puhdisti revolveria tavalliseen
perinpohjaiseen ja huolelliseen tapaansa. Hänen vieressään olevalla
neliskulmaisella, risaisella telttakankaan palasella olivat hänen
työssään tarvitsemansa välineet hyvässä järjestyksessä, ja hänen
uutterasti puhdistaessaan, öljytessään ja kiilloittaessaan nostamatta
katsettaan työstänsä löysivät hänen näppärät sormensa erehtymättä
juuri sen esineen, jota hän tarvitsi. Ase näytti jo tahrattomalta, mutta
jonkun aikaa hän vielä hankasi sitä voimaperäisesti, käsitellen sitä
melkein rakastavan huolellisesti, ikäänkuin ei olisi hennonut laskea
sitä pois käsistään. Vihdoin hän murahti empivästi, pani
vastahakoisesti syrjään käyttämänsä rievun, kääri revolverin
silkkiseen nenäliinaan ja verkkaisesti sujutti sen nahkaiseen
koteloon, jonka hänen huolenpitonsa oli pysyttänyt pehmeänä ja
taipuisena. Pantuaan sen meluttomasti eteensä maahan hän
suuntasi vinot silmänsä Craveniin ja katseli häntä tarkkaavasti
minuutin tai pari. Varmistuttuaan vihdoin siitä, että isäntä oli liian
syventynyt omaan tehtäväänsä huomatakseen palvelijansa puuhia,
hän otti selkänsä takaa toisen revolverin, jota hän alkoi puhdistaa
hätäisemmin, pintapuolisemmin kuin edellistä, samalla varovasti
pitäen silmällä pöydän ääressä kumarassa istuvaa miestä. Kun hän
oli saanut senkin tyydyttävään kuntoon ja pannut sen takaisin
takataskuunsa, väikkyi hänen tavallisesti värähtämättömillä
kasvoillaan melkein lapsellisen mielihyvän ilme, ja hän kävi viekkaan
huolettoman näköisenä käsiksi pyssyyn, joita oli kaksi pystyssä
teltan seinän varassa hänen lähellään.

Kaksi vaivoissa ja vaaroissa elettyä vuotta ei ollut jättänyt häneen


minkäänlaisia jälkiä, samottujen seutujen tuhoisan epäterveellinen
ilmasto ei ollut pystynyt hänen vankkaan ruumiiseensa, ja tieteellisen
retkikunnan keskuudessa raivonneet taudit eivät olleet kajonneet
häneen sen enempää kuin Craveniinkaan. Kun hän ei välittänyt
mistään muusta kuin isäntänsä mukavuudesta sekä uhmaili
väsymystä ja vaaroja, olivat Afrikan sydänmailla vietetyt kuukaudet
olleet paljoa paremmin hänen makunsa mukaiset kuin Craven
Towersin tympeän yksitoikkoinen elämä. Mutta kun matka — tosin
kiertoteitse — käännettiin kotiin päin — Joshion omaksumaan kotiin
— oli hän sittenkin hyvällä tuulella. Hänestä oli elämässä ainoastaan
yksi kannustin — se mies, joka vuosikausia sitten oli Kaliforniassa
pelastanut hänen henkensä. Joshio oli tyytyväinen siellä, missä
Craven oli.

Teltan ulkopuolella oli arabialaisten leirissä hälinää. Oven ohitse


käveli yhtenään ryhmittäin miehiä, jotka keskustelivat innokkaasti ja
väitellessään huusivat käheä-äänisesti, meluisan kiihkeästi. Läheltä
kuului hevosten hirnuntaa, ja kerran peräytyi kirkuva ori rajusti teltan
seinää vasten, jonka vierellä Joshio istui, ärryttäen tyynen
jaappanilaisen päästämään harvinaisen kiukunäännähdyksen,
samalla kun hän kumartui sieppaamaan turvaan toista pyssyä. Sitten
eläin kiskottiin kauemmaksi runsaiden, monivivahteisten
arabialaisten voimasanojen kajahdellessa, ja Joshio virnisti leveästi,
kun käskevä ääni vaimensi arabialaisten hälyn ja muukalaisen teltan
läheisyydessä syntyi äkkiä hiljaisuus.

Joka taholta kuuluvasta häiritsevästä melusta huolimatta Craven


kirjoitti keskeyttämättä vielä jonkun aikaa. Huoahtaen hän sitten
kokosi hajallaan olevat liuskat, pyyhki pois niihin takertuneet
kärventyneet siivet ja pienet, käpertyneet kärpäsenraadot ja
lukematta tiheään kirjoittamiaan arkkeja työnsi ne kuoreen, sulki sen,
kirjoitti osoitteen ja nojautui sitten taaksepäin, huudahtaen
huojennuksesta.

Petersille menevä kirje oli valmis, mutta vielä oli jälellä vaikeampi
kirje, joka hänen oli lähetettävä vaimolleen — jonka kirjoittaminen
häntä peloitti, mutta jonka hän silti kiihkeästi halusi lähettää. Se
saapuisi perille vasta hänen kuolemansa jälkeen, jonka hän varmasti
uskoi hänet saavuttavan ja jota hän hartaasti rukoili, ja paljastaisi
Gillianille koko hänen entisyytensä salaisuuden ja hänen
intohimoisen rakkautensa, joka oli karkoittanut hänet, arvottoman,
kauaksi vaimostaan. Sillä kaksi vuotta kestäneiden seikkailujen ja
vaarojen aikana ei kuolema ollut koskaan näyttänyt niin uhkaavan
läheiseltä kuin nyt, ja ennen kuolemaansa hän tahtoisi saada tämän
ainoan tyydytyksen — hän rikkoisi vaitiolon, joka oli syövän tavoin
jäytänyt hänen sieluaan. Vihdoinkin saisi Gillian tietää kaikki, mistä
hän ei ollut milloinkaan rohjennut puhua, hänen toivottoman
rakkautensa, hänen katumuksensa ja häpeänsä, hänen kiihkeän
halunsa tehdä vaimonsa onnelliseksi.

Kymmeniä kertoja viimeisten kahden vuoden aikana hän oli


yrittänyt kirjoittaa, mutta aina luopunut aikeestaan, mutta tällä kertaa
se tarve oli pakottava. Nyt hänellä oli viimeinen tilaisuus.
Aamusarastuksen varhaisina hetkinä hän seuraisi arabialaisia,
joiden vieraana hän majaili, kostoretkelle, jolta hän ei mielinyt palata
elävänä. Kuolema, jota hän Englannista lähdettyään oli avoimesti
uhitellut, olisi varmastikin helppo löytää niiden sotaa käyvien
heimojen keskuudessa, joiden kohtaloon hän oli liittänyt omansa.
Hänen kasvojaan valaisi hetkisen omituinen hymy, joka sitten äkkiä
haihtui epäilyksen horjuttaessa hänen varmuuttaan. Entäpä jollei
kohtalo taaskaan sallisi hänen päästä irti elämästä, joka oli käynyt
sietämättömämmäksi kuin konsanaan?

Kun häntä vainosi O Hara Sanin muisto ja hän tuskaisesti ikävöi


sitä naista, jonka hän oli tehnyt puolisokseen, oli tämä
kaksinkertainen taakka käynyt ylivoimaiseksi. Hän oli tarttunut
tieteellisen retkikunnan tarjoamaan tilaisuuteen. Hän oli tuntenut
maan vaarallisen luonnon ja tiennyt sen rämeiden ja metsien
uhkuvan kuumehuuruja. Ja hän olikin lähtenyt Afrikkaan kohtaamaan
kuolemaa, joka vapauttaisi hänet jättämättä silti tahraa hänen
vaimonsa kantamaan nimeen. Ja kuolema, joka vapauttaisi hänet,
vapauttaisi myöskin Gillianin! Hän kiristeli hampaitaan ajatellessaan
sen katkeraa oikeudenmukaisuutta. Sillä hän oli määrännyt
omaisuutensa ja laajat tiluksensa Gillianille, käytettäväksi hänen
mielensä mukaan. Nuori, rikas ja vapaa! Kuka saavuttaisi omakseen
sen, mistä hän oli luopunut? Vielä nytkin, kuukausia kestäneen
sielullisen taistelun jälkeen, se ajatus tuntui kiduttavalta.

Mutta kuolema, joka oli vaatinut raskaan veron hänen


kumppaniensa keskuudesta, oli kiertänyt häntä. Sairaudet ja
tapaturmat olivat vainonneet retkikuntaa alusta alkaen. Retken
lääkeopilliset ja tieteelliset tulokset olivat olleet odottamattoman
runsaat, mutta kuoleman saalis seurueen jäsenten joukosta oli ollut
hirvittävä. Äärimmäisen huimapäisenä ja kaikista varokeinoista
välittämättä Craven oli nähnyt murhenäytelmän toisensa jälkeen,
tuntien kateutta, jota hän oli tuskin kyennyt salaamaan. Leirissä
jaksottaisesti tuhoisesti raivonneet äkilliset, tappavat kuumetaudit
eivät pystyneet häneen, ja pelottomasti ja väsymättä hän oli
uurastanut hoivaillessaan tartunnan saaneita retkeläisiä ja
lamaantuneiden, huolettavan helposti sortuneiden kantajien nopeasti
supistuvaa armeijaa. Järkkymätön jaappanilainen aina rinnallaan
hän oli ponnistellut yötä päivää pelastaakseen retkikunnan
täydellisestä tuhosta. Ja hoitaessaan sairaita ja paimentaessaan
haluttomia kantajia hän oli lomahetkinään samoillut laajoilla alueilla
etsimässä tuoretta ravintoa leirin tarpeiksi. Mutta vaarat, joita hän oli
tahallaan hakenut niin uhkarohkeasti, että siitä oli peittelemättä
puhuttu, olivat ihmeellisesti väistäneet häntä. Hänen henkeään
suojeli taikavoima. Hän oli antautunut jokaiseen huimaan yritykseen,
pannut yhtenään itsensä alttiiksi vaaralle, kunnes eräänä iltana,
vähää ennen kuin retkikunnan piti kääntyä taivaltamaan takaisin
sivistysmaailmaan, leirinuotiolla sattumoisin lausuttu sana oli äkkiä
hänelle selvittänyt, kuinka suuresti koko retkikunnan turvallinen
paluu rannikolle oli riippuvainen hänestä.

Omituisesta kohtalonoikusta oli kuolema korjannut runsaimman


satonsa retkikunnan tieteellisesti kouluttamattomien jäsenten
keskuudesta. Vaikka suurriistan metsästäjät olivat karaistuneempia
ja ruumiillisesti paremmin harjaantuneet kestämään vaivoja ja
rasituksia kuin seurueen oppineet jäsenet, olivat he kuitenkin
sortuneet kaikki paitsi Cravenia. Huomautuksen oli eräs tutiseva,
kuumeinen tiedemies, joka nuotion hohteessa kirjoitti muistiinpanoja
päiväkirjaansa tuskin jaksaen vapisevissa sormissaan pitää
lannistumattoman tahdon liikuttamaa, vaivaloisesti pyörivää
täytekynää, lausunut sitä ennakolta ajattelematta ja mitään erikoista
tarkoittamatta. Hätkähdyttävää lausetta oli seurannut juro ele,
hirvittävän sisältörikas ele, ja tyrmistyneenä oli Craven tuijottanut
värisevään olentoon, jonka pingoittuneissa keltaisissa kasvoissa
silmät kiilsivät melkein kammottavan kirkkaina, kunnes miehen
sanojen merkitys hitaasti hänelle selvisi. Mutta kun hän kerran oli
tajunnut huomautuksen koko kantavuuden, oli se herättänyt hänet
täysin ymmärtämään velvollisuutensa niitä miehiä kohtaan, joiden
johtajaksi hän oli ryhtynyt. Kaikista niistä, jotka olisivat kyenneet
opastamaan retkikuntaa kotimatkalla, oli hän yksin jälellä. Ilman
häntä saattaisivat aikoinaan lukuisan seurueen hengissä selviytyneet
jäsenet kenties päästä turvaan, mutta sinä yönä hänelle selvisi,
kuinka ehdottomasti hänen kumppaninsa luottivat, että hän veisi
heidät nopeasti takaisin ja pitäisi aisoissa kantajat, joiden
tuontuostakin uusiintuvat kapinat vain Craven näytti osaavan
tukahduttaa. Hän oli istunut myöhään yöhön, synkästi tuijottaen
roihuavaan tuleen, polttaen piipullisen toisensa jälkeen ja kuunnellen
metsän moninaisia ääniä — kaatuvien puiden kaukaisia
rymähdyksiä, hyönteisten taukoamatonta surinaa, leirin liepeillä
hiipivien petoeläinten venytettyjä ulvahduksia, pöllön pehmeää
huhuilua, joka elävästi toi hänen mieleensä Craven Towersin
viileätuoksuisen puutarhan, ja läheisempää, kammottavaa, hillittyä
valitusta, joka kantautui läheisestä teltasta; siellä ähkyi vielä yksi
tieteen uhri kuolemankielissä.

Tunnin toisensa jälkeen hän istui ja mietti. Siitä ei päässyt


mihinkään — halveksittavaa oli, ettei hän itse ollut sitä aikaisemmin
oivaltanut. Velvollisuuden kaita polku oli hänen edessään, eikä hän
saanut poiketa siltä huojentaakseen mieskohtaisen murheensa
taakkaa. Hän oli sidottu näihin miehiin, jotka luottivat häneen. Kunnia
vaati häntä luopumaan suunnitelmastaan — kunnes hän oli
suorittanut tehtävänsä. Uskollisuuden kumppaneita kohtaan täytyi
olla voimakkaampi kuin kaikki itsekkäät pyyteet. Ja eihän se missään
tapauksessa merkitsisi muuta kuin päätöksen toteuttamisen
viivästymistä, ajatteli hän, tuntien katkeraa tyydytystä. Kun hän vain
olisi saattanut retkikunnan tähteet turvaan rannikolle, olisi hänen
vastuunalaisuutensa lopussa, ja hänellä olisi vapaus lähteä sille
uralle, joka vapauttaisi hänen rakastamansa naisen.

Viimeisenä aamunkoiton edellisenä, viileänä, hiljaisena tuntina


hän oli noussut puutuneena ja väristen istumapaikaltaan hiipuvan
nuotion ääressä, ja kun hänen oli liian myöhäistä enää saada
laiminlyötyä lepoa, oli hän herättänyt Joshion ja lähtenyt
tavanmukaiselle muonitusretkelleen, joka oli hänen jokapäiväinen
puuhansa. Ja siitä ajasta alkaen hän oli huolekkaasti varjellut
henkeään, joka tosin hänestä itsestään oli arvoton, mutta jolla oli
korvaamaton arvo hänen kumppaneilleen. Enää ei ollut sattunut
kuolemantapauksia eikä karkaamisia kantajien jo ennestään
huvenneessa joukossa. Kaikki oli sujunut jatkuvan menestyksellisesti
ja kuusi kuukautta sitten, senjälkeen kun oli suoritettu vaarallinen
marssi vihamielisen maan halki, oli Craven vienyt retkikunnan jätteet
turvalliselle rannikolle.

Retkikunnan palattua Lontooseen hän oli joitakuita viikkoja viipynyt


afrikkalaisessa satamakaupungissa, noussut sitten pieneen
kauppahöyryyn ja matkustanut vähäntunnetulle marokkolaiselle
ranta-asemalle ja sieltä verkkaisesti ja kaartaen nykyiseen
olinpaikkaansa, johon hän oli saapunut vasta viikko sitten.

Hän oli kahdesti ennen käynyt heimon parissa sheikki Mukair Ibn
Zarrarahin nuoremman pojan, Pariisissa kohtaamansa
spahiupseerin vieraana, ja hänelle osoitettu lämmin vierasystävyys
oli tehnyt häneen syvän vaikutuksen. Äkillinen, selittämätön halu oli
vetänyt hänet uudelleen tänne, missä hän oli viettänyt muutamia
elämänsä onnellisimpia kuukausia. Hänessä oli herännyt voimakas
ihailu vanhaa, juroa arabialaispäällikköä ja hänen kahta perinpohjin
erilaista poikaansa kohtaan; vanhempi heistä oli totinen, tavallisesti
harvapuheinen mies, noudatti vanhoja perinnäistapoja
oikeauskoisen muhamettilaisen jäykän sitkeään tapaan, vihasi
ranskalaista oikeudenkäyttöä, jonka alaisena hänen oli pakko elää,
ja uhrasi kaiken aikansa heimon asioihin ja kauniille, palvotulle
vaimolleen, joka oli yksin hänen haareminsa valtiattarena, vaikka ei
ollutkaan lahjoittanut hänelle lasta; nuorempi oli ihan päinvastoin
kuin veljensä komea-asuinen, perin nykyaikainen nuori arabialainen
ja yhtä innokas ranskalaisten pyrkimysten kannattaja kuin Omar oli
niiden vastustaja. Varakas ja mahtava sheikki, jonka ystävyyteen
ranskalaiset hallintoviranomaiset olivat uutterasti pyrkineet
taatakseen itselleen hänen heimonsa tuen, sillä sen vaikutusvalta
ulottui laajalle ja se olisi saattanut osoittautua vaaralliseksi tekijäksi
levottomassa piirissä, kannatti sydämessään esikoisensa tunteita,
mutta viisaampana, laajanäköisempänä ja harkitsevampana oivalsi,
kuinka suotavaa oli, että ainakin yksi hänen sukunsa jäsenistä oli
läheisessä yhteydessä hallituksen kanssa, joka hänen oli pakko
tunnustaa, vaikka hän tekikin sen nurkuen ja puolittain halveksivasti.
Kauan hän oli ollut kahdella päällä ennakkoluulojen ja poliittisen
viisauden taistellessa vallasta hänen mielessään, ennenkuin oli
vastahakoisesti suostunut siihen, että Said merkittiin spahirykmentin
luetteloihin. Ja veljesten välinen harvinaisen voimakas rakkaus oli
kestänyt kokeen, joka olisi saattanut olla liian ankara sen
jatkumiselle; Omar oli alistunut itsevaltaisen päällikkövanhuksen
päätökseen eikä ollut edes huomauttanut asiasta mitään, ja Said
taas oli innostaan huolimatta huolellisesti varonut lietsomasta
ilmiliekkiin veljensä syvälle juurtunutta vihaa sitä kansaa kohtaan,
jota palvellessaan hän itse ylpeili. Hänen suruton luontonsa
mukautui keveästi elämään kahta toisistaan jyrkästi eroavaa elämää,
ja vaikka hän salaisesti pitikin parempina rykmentissään vietettyjä
kuukausia, osasi hän mahdollisimman paljon nauttia loma-ajoistaan,
joiksi hän aina palasi heimon pariin, riisui siellä komean
upseeripukunsa, josta hänen kiihkeä mielensä nautti, salasi
huolellisesti kaikki ranskalaisystävällisten taipumustensa merkit ja
näytteli erittäin tahdikkaasti jonkun verran vastenmielistä osaansa
sheikin nuorempana poikana.

Nuoren spahin ja Cravenin tutustuttua toisiinsa Pariisissa olivat he


pian huomanneet, että heillä oli samanlaisia harrastuksia, ja tulleet
sitten läheisiksi ystävyksiksi. He olivat olleet yhdessä Algeriassa
metsästämässä panttereja ja berberiläisiä lampaita, ja vihdoin oli
Craven suostunut lähtemään vierailulle heimon luokse. Siellä hän oli
nähnyt aitoa aavikkoelämää, joka oli väkevästi kiehtonut hänen
sovinnaisuutta vierovaa, vaellushaluista luonnettaan. Kaikki olivat
poikkeuksetta ottaneet hänet sydämellisesti vastaan, harvapuheinen
Omarkin oli ollut leppeä häntä kohtaan, pitäen häntä sellaisen
kansan edustajana, jota hän saattoi kunnioittaa menettämättä silti
omaa arvoaan. Cravenista olivat arabialaisten leirissä vietetyt viikot
olleet keskeytymätöntä nautintoa, ja hänen toinen käyntinsä oli
lujittanut heidän keskinäisiä suhteitaan. Heimon alue oli Algerian
rajamaiden äärimmäisellä liepeellä, alituisen kuohunnan myllertämän
piirin sydämessä, ja vaara oli siellä aina uhkaamassa, mikä ei
Cravenista ollut sen vähäisin vetovoima. Hän oli tuntenut haikeata
pettymystä sen tähden, että heimojen välinen sota, jota käytiin siitä
huolimatta, että hallitus ponnisteli säilyttääkseen rauhan aavikon
suurten heimojen välillä, oli hänen molempien käyntiensä aikana
ollut keskeytyksissä.

Monia miespolvia oli Mukair Ibn Zarrarahin heimo ollut sodassa


erään toisen mahtavan heimon kanssa, joka asuen kauempana
etelässä oli asiallisesti maan nimellisten hallitsijain ylivallan
ulkopuolella ja rikkoi rajarauhaa lakkaamatta. Mutta tietoisina Mukair
Ibn Zarrarahin kasvavasta vallasta ja apulähteistä olivat rosvot
karttaneet yhteentörmäystä hänen kanssaan ja suunnanneet
huomionsa vähemmän vaarallisiin vastustajiin. Mutta perinnöllisten
vihollisten näennäinen syrjässäpysyminen ei kuitenkaan narrannut
vanhaa sheikkiä vähentämään varokeinojaan. Itämaalaisten
luonteenomaiseen epäilevään tapaan hän piti heitä taukoamatta
silmällä ja pysyi hyvästi järjestetyn vakoilukoneistonsa avulla
jatkuvasti selvillä heidän kaikista liikkeistään. Vierailujensa aikana
Craven oli usein kuunnellut tarinoita menneistä otteluista ja nähnyt
ympärillään olevien rajun kiihkeistä kasvoista, että he toivoivat
vihollisuuksien uusiintuvan. Tämä toivo oli erikoisesti elähyttänyt
heimon nuorempia jäseniä, ja englantilainen oli aprikoinut,
milloinkahan välähtäisi kipuna, joka vihdoin sytyttäisi kauan kyteneen
vihan ja kilpailun liekit ilmiloimuun.
Ja oikeastaan olikin alitajuinen aavistus tällaisesta purkauksesta
ajanut hänet jälleen Mukair Ibn Zarrarahin leiriin. Hänen
aavistuksensa, hartaiden toiveiden tulos, oli osoittautunut todeksi.
Samalla hän oli kuullut kuvauksia kauheista yksityiskohdista, jotka
olisivat — jollei se ennestään olisi ollut hänen aikomuksensa —
saaneet hänet pyrkimään mukaan siihen rangaistusretkikuntaan,
joka valmistautui kostamaan heimon kunniaan kolahtanutta
loukkausta. Hänen viikko sitten saapuessaan leiriin oli siellä kihissyt
vimmastunutta, intohimojen valtaamaa väkeä, joka ei lainkaan
muistuttanut hänen aikaisemmilla käynneillään näkemäänsä
järjestystä noudattavaa, hyvään kuriin totutettua heimoa, ja se, että
lisävoimia oli joka päivä saapunut kaukaisista piireistä, oli estänyt
jännityksen laukeamisen ja paisuttanut yötä päivää myllertävää
kiihtymystä.

Avarassa, barbaarisen upeassa teltassaan oli vanha päällikkö,


jonka tyyntä arvokkuutta eivät edes murheelliset tapahtumat
jaksaneet järkyttää, ottanut hänet yksin vastaan, sillä onneton Omar
oli piiloutunut häväistyn ja ryöstetyn haareminsa lohduttomaan
yksinäisyyteen. Englantilaiselle, jolle hän saattoi puhua avoimesti, oli
vanhus kertonut koko hirvittävän tarinan, ja hänen kuvauksensa oli
uhkunut eloisaa dramaattista voimaa ja loistavaa kaunopuheisuutta,
jonka mestari hän oli. Se oli kertomus väärin osuneesta
luottamuksesta ja petturuudesta, joka oli tullut ilmi ja rangaistu
itämaalaisten ankaraan tapaan ja johtanut sitten pikaiseen,
raukkamaiseen kostoon.

Muuan heimon päällikkö, johon sekä sheikki että hänen vanhempi


poikansa olivat rajattomasti luottaneet, oli osoittautunut syypääksi
raskaisiin hairahduksiin, jotka olisivat saattaneet suuresti
vahingoittaa hallitsevan suvun arvoa, jollei niitä olisi saatu ilmi.
Häneltä oli riistetty päällikkyys, ja kun hänen kannattajansa, joiden
tukeen hän oli luottanut, olivat luontaiseen huikentelevaan tapaansa
hylänneet hänet, oli rikollinen paennut kilpailevan heimon leiriin,
jonka kanssa hän jo oli ollut salaisesti neuvotteluissa. Sen kaiken
olivat Mukair Ibn Zarrarahin vakoojat saaneet selville, mutta tiedot
eivät olleet ehtineet kyllin ajoissa, jotta olisi voitu estää onnettomuus.
Rosvoilevalle päällikölle, joka oli kauan etsinyt tilaisuutta antaakseen
tehokkaan iskun vihatulle kilpailijalleen, oli ilmaistu suunnitelmia,
joiden luultiin olevan sheikin ja hänen poikansa tiedossa, ja Omarin
ollessa laajan, hajallaan asuvan heimon syrjäisille leiripaikoille
tekemällään tarkastuskierroksella, oli hänen pienen karavaaninsa
piirittänyt rusentavan ylivoimainen joukko, jota johtivat heidän
perinnöllinen vihamiehensä ja heidän oman heimonsa luopio.
Sijoittuneina hänen hellästi rakastetun, nuoren vaimonsa kantotuolin
ympärille — hän erosi vaimostaan hyvin harvoin — olivat Omar ja
hänen vähäinen henkivartionsa otelleet epätoivoisesti, mutta
taistelun tulos oli ollut etukäteen varma. Yksi toisensa jälkeen he
olivat kaatuneet ylivoimaisten ahdistajien vimmaisissa
hyökkäyksissä. Voittoisat hätyyttäjät olivat sitten peräytyneet etelää
kohti yhtä nopeasti kuin olivat tulleetkin, vieden mennessään kauniin
Safiyan — kavaltajan petturinpalkkion. Omar ja kaksi muuta olivat
ainoat eloonjääneet; he olivat pahasti haavoittuneina maanneet
ruumiskasojen alla, ja heitä oli luultu kuolleiksi.

Kuolema sydämessään oli nuori mies elänyt ainoastaan siitä


toivosta, että pääsi kostamaan kunniansa loukkaajalle. Tämän
ainoan rajun, voimia antavan halun elähyttämänä nuori Omar oli
vielä toipunut valvomaan ja ohjaamaan, kun valmistauduttiin
kostoretkelle, jonka piti olla ratkaiseva ja lopullinen. Vanhoihin
vääryyksiin oli lisätty tämä äärimmäisen häpäisevä loukkaus, ja
vihan vimmaan raivostuneet Ibn Zarrarahin heimolaiset olivat yhtenä
miehenä päättäneet hävittää vihollisensa sukupuuttoon tai itse tyyten
tuhoutua.

Cravenin saapuessa leiriin oli valmistukset saatu melkein loppuun


suoritetuiksi, ja vasta tänä iltana, sheikin teltassa pidetyssä
lopullisessa sotaneuvottelussa, jossa kaikki ylemmät päälliköt olivat
olleet saapuvilla, oli hän ensi kerran nähnyt iskun kohtaaman
miehen. Hän oli tuskin tuntenut laihaa, kuihtunutta olentoa, jota vain
lannistumaton tahto näytti pitävän pystyssä, komeaksi, jänteväksi
arabialaiseksi, joka koko heimon jäsenistä oli lähimmin vetänyt
vertoja hänen omalle voimakkaalle vartalolleen. Synkästi hehkuvien
silmien hurja epätoivo väräytti vastaavaa kieltä hänen sydämessään,
ja heidän äänetön kädenpuristuksensa tuntui vahvistavan yhteisestä
halusta syntyneen päätöksen. Myöskin tässä oli mies, joka
rakkaudesta naiseen etsi kuolemaa päästäkseen eroon hirveän
muiston kalvamasta elämästä. Heitä tuntui yhdistävän hiljainen
ymmärtämyksen synnyttämä myötätunto; sama päämäärä, joka veti
heidät oudon lähelle toisiaan, herätti Cravenissa kummallisen
sukulaisuudentunteen, joka haihdutti hänen epäröintinsä, niin että
hän saattoi avomielisesti ottaa osaa pian alkaneeseen keskusteluun.
Kokouksen jälkeen hän oli palannut telttaansa suorittamaan omat
loppuvalmistuksensa, tuntien melkein hurmiomaista riemua.
Joshiolle, joka oli tavallistakin ilmeettömämpi, hän oli antanut kaikki
tarpeelliset ohjeet tavaroittensa kuljettamisesta Englantiin.

Enää oli jälellä hänen vaimolleen menevä kirje, jonka aloittaminen


tuntui kummallisen vaikealta. Sysättyään kirjoitusvehkeet luotaan
hän nojautui kauemmaksi taaksepäin tuolissaan, kopeloi taskujaan,
löysi piippunsa ja täytti sen tahallisen hitaasti. Sitten hän hapuili
tulitikkuja, mutta ei löytänyt niitä taskuistaan, nousi, venyttelihe
pitkään ja kumartui pöydän ylitse sytyttämään piipun lampusta. Hän
meni ovelle ja seisoi siellä muutamia minuutteja, mutta liikkeelläolo
ei tuntunut herättävän mielijohteita, ja kohautettuaan kärsimättömästi
olkapäitään hän palasi istumaan, synkästi tuijottaen edessään
olevaan valkeaan arkkiin.

Lepattava lamppu valaisi hänen tummiksi paahtuneita kasvojaan


ja laihaa, jäntevälihaksista vartaloaan. Ollen mainiossa ruumiillisessa
kunnossa ja Afrikan auringon päivetyttämä hän oli nuoremman
näköinen kuin Englannista lähtiessään. Sillä hetkellä näyttivät
kuolema ja Barry Craven olevan hyvin loitolla toisistaan — mutta
muutamien tuntien kuluttua, mietti hän kylmäkiskoisesti kuin asia ei
koskisi häntä, voisivat kuitenkin korppikotkat leijailla nyt niin
voimakkaan ja elämää uhkuvan ruumiin ympärillä. »Komea Barry
Craven.» Hän oli Lagosissa kuullut erään naisen lausuvan ne sanat
ja tuntenut halveksivaa mielihyvää. Kun se huomautus nyt johtui
hänen mieleensä, lehahti hänen kasvoilleen kyynillinen hymy, ja hän
kuvitteli, kuinka saman naisen silmien ilme muuttuisi ihailevasta
inhoavaksi, jos hän näkisi, mitä »komeasta Cravenista»; olisi jälellä
aavikon haaskankorjaajien tehtyä työnsä. Se ajatus ei häntä itseään
kammottanut. Hän oli aina elänyt liian likellä luontoa kaihtaakseen
sen säälimättömien lakien ajattelemista.

Hän täytti piipun uudelleen ja koetti koota harhailevia ajatuksiaan,


mutta nyt tuntui niiden pukeminen täsmällisiksi lauseiksi olevan
mahdotonta, sillä kiihkeä kaipaus, joka ei koskaan lähtenyt hänen
mielestään, heräsi nyt melkein vastustamattomana — halu nähdä
Gillian, kuulla hänen ääntään. Omasta vapaasta tahdostaan hän
aikoi luopua kaikesta, mitä elämä saattoi hänelle merkitä, mitä sillä
saattoi olla hänelle tarjottavana, ja nyt alkoi luonnollinen
vastavaikutus, hän moitti itseään hupsuksi ja napisi omaa
langettamaansa tuomiota vastaan. Vanha taistelu virisi uudelleen,
vanha houkutus kiehtoi häntä koko voimallaan, eikä se koskaan ollut
tuntunut niin haikealta kuin tänä yönä. Tunteittensa heilahdettua
toisaanne hän ei kammonnut kuolemaa, vaan häntä kammotti ajatus
iäisyydestä — yksin. Gillian ei olisi hänen tässä maailmassa eikä
iäisessä elämässä, ja tuskaisesti kaivaten hänen sielunsa valitti
kovaa yksinäisyyttään. Hänen tuli sietämättömän ikävä Gilliania, se
oli polttavaa, vihlovaa, ruumiillista kipua; mutta vielä paljoa
voimakkaampana kohosi hienompi, ylevämpi pyrkimys täydelliseen
sielulliseen kumppanuuteen, jota hän ei koskaan saisi tuntea. Hänen
oman tekonsa tähden se olisi häneltä kielletty. Omalla teollaan hän
oli valmistanut tämän helvetin, jossa hän eli, hänen omaa työtään
olisi sekin helvetti, johon hän tämän jälkeen joutuisi. Aina hän oli
tunnustanut sen oikeutetuksi; ei hän yrittänyt inttää sitä vääräksi
nytkään.

Mutta jos asia olisi ollut toisin — jos hän olisi ollut vapaa
tavoittelemaan Gilliania, koettamaan voittaa hänet omakseen! Hänen
rangaistuksensa lievin puoli ei ollut se, että hän sisimmässään
varmasti uskoi rakkauden uinuvana piilevän Gillianin sydämessä
kaikista hänen päinvastaisista vakuutuksistaan huolimatta. Ja se
rakkaus olisi saattanut kohdistua häneen, olisi kohdistunut häneen,
sillä hänen oma voimakas ja hellä tunteensa olisi vetänyt sitä
puoleensa. Gillianin olisi viimein täytynyt kääntyä hänen puoleensa,
ja hänen rakkautensa olisi luonut Gillianin onnen. Ja hänelle olisi
Gillianin rakkaus ollut elämän kruunu — elämä, täynnä sanomatonta
riemua ja kauneutta, täydellistä, eheää myötätuntoa huokuva liitto.
Yhdessä he olisivat tehneet Towersista maallisen paratiisin; yhdessä
he olisivat voineet murtaa Cravenien kirouksen voiman; yhdessä he
olisivat voineet kylvää onnea monien ihmisten elämään.
Ja hänen haaveillessaan, miten olisi saattanut olla, heräsi
hänessä ensimmäisen kerran isyyden kaipaus; hän kaipasi lasta,
jonka hänen jumaloimansa nainen olisi synnyttänyt, jonka pienessä
olemuksessa yhtyisivät molempien olennaiset piirteet ja joka siten
olisi heidän keskinäisen rakkautensa kouraantuntuva todistus, joka
jatkaisi hänen juurenaan ollutta sukua. Uusi, järkyttävä tunne pani
Cravenin huohottamaan kiivaasti. Hirvittävän äkillisenä kuin salama
välähti sitten muisto, pistävä muisto, joka paiskasi hänen unelmansa
sirpaleiksi hänen jalkojensa juureen. Taaskin hän kuuli hiljaisen,
vienon, nyyhkivän äänen sanovan: »Etkö ole iloinen?» Taaskin hän
näki O Hara Sanin vetoavat, kyyneleiset silmät, tunsi hänen hennon,
surun puistattaman vartalonsa vapisevan sylissään, ja hän painoi
päänsä käsiensä varaan huumaavan kauhun valtaamana.

Tuskaisen muiston ja oman inhon turruttamana hän ei havainnut,


että leiristä taaskin kuului meluisia mielenosoituksia, mistä valppaasti
ja tarkkaavasti kuunteleva Joshio arvasi, että sinne oli saapunut joku
uusi Mukair Ibn Zarrarahin kannattaja, vastaanoton lämmöstä
päättäen erikoisen huomatussa asemassa oleva henkilö. Uteliaana
jaappanilainen nousi meluttomasti pystyyn ja pujahti hiljaa isäntänsä
huomaamatta öiseen ulko-ilmaan.

Vähäistä myöhemmin ponnahti Craven pystyyn kuullessaan


kirkkaan tenoriäänen kuuluvasti mainitsevan hänen nimensä.
Nopeasti hän pyörähti kädet ojossa kookasta, nuorta arabialaista
vastaan, joka kursailematta syöksähti telttaan tervehtimään häntä
myrskyisen kiihkeästi. Craveniin tarttui pari vankkaa käsivartta, ja
empivästi hän englantilaisena alistui tuliseen, itämaiseen syleilyyn,
jota seurasi häntä enemmän miellyttävä, sydämellinen ja pitkä
englantilaismallinen kädenpuristus ja kiivaan vuolas, melkein sekava
tervehdyspuhe.
»C'est bien toi, mon vieux! Olet tervetulleempi kuin konsanaan —
vaikka saattaisinkin toivoa sinun olevan tuhansien kilometrien
päässä, mon ami, mutta siitä lisää myöhemmin. Dame, kuinka olen
ratsastanut! Ikäänkuin Eblisin laumat olisivat olleet kintereilläni! Olin
lomalla, kun sanansaattaja tuli minua etsimään — hän tuntuu olleen
jyrkkä vaatimuksissaan, tämä Selim. Sähkösanomia oli lähetetty
kaikkiin mahdollisiin paikkoihin — onneksi sain yhden niistä
Marseillesissa. Niin, olin ollut Pariisissa. Kiiruhdin päämajaan
pyytämään pitkää lomaa — epämääräiseksi ajaksi — tärkeiden
yksityisasioiden vuoksi, valehtelin niin paljon kuin suinkin luulin
everstin nielevän, mutta ei sanaakaan sodasta, bien entendu! Allahin
kiitos, he eivät estelleet, ja lähdin heti. Senjälkeen olen ratsastanut
miltei pysähtymättä yötä päivää. Kaksi hevosta olen tappanut,
jälkimäinen viruu sydän pakahtuneena isäni teltan edustalla —
muistathan sen? — pieni Mimini, raudikko, valkoinen tähti otsassa;
rakastin sitä kuin sydämeni lemmittyä. En kenenkään muun kuin
Omarin tähden olisi ratsastanut siten, sillä rakastin sitä hevosta,
ymmärräthän, mon ami, enemmän kuin ikinä osaisin naista rakastaa.
Naista! Pyh! Ei ainoakaan nainen koko maailmassa ole Mimini pään
keikahduksen arvoinen. Ja minä tapoin sen, Craven. Tapoin sen, ja
se rakasti minua, luotti minuun eikä ikinä pettänyt minua. Pieni
Mimini! Allahin rakkauden nimessä anna minulle wiskyä!» Ja
nauraen ja itkien samalla kertaa hän ähkäisten vaipui Cravenin
vuoteelle, mutta nousi heti jälleen istumaan ja kaatoi kurkkuunsa
pikarin kiellettyä juomaa — melkein viimeisen tähteen pullon
pohjasta.

»Profeetta ei ollut milloinkaan maistanut wiskyä, sillä muutoin hän


ei olisi kieltänyt sitä tosiuskovaisilta», virkkoi hän, poikamaisesti
virnistäen, ojentaessaan tyhjän pikarin takaisin.
»Jollainen sinä et ole», huomautti Craven hymähtäen.

»En sellaisessa mielessä, kuin sinä tarkoitat», vastasi Said,


heilauttaen jalkansa maahan ja etsien burnuusinsa laskoksista
savukkeen, jonka hän sitten sytytti, ja poltti muutamia minuutteja
mietteissään. Senjälkeen olivat kaikki äskeisen kiihtymyksen jäljet
hänestä kadonneet, ja hän alkoi järkevästi pohtia hetken polttavaa
kysymystä, osoittaen tervettä harkintakykyä ja mielenmalttia, mikä
tuntui olevan ristiriidassa hänen näennäisesti huolettoman ja
suruttoman luonnonlaatunsa kanssa. Se oli hänen luonteensa
syvempi, visusti salattu puoli, jonka Craven oli vaistonnut jo heidän
tuttavuutensa alkuaikoina.

Nyt hän puhui peittelemättömän totisesti tilanteen vakavuudesta.


Sinä lyhyenä aikana, jonka hän oli ollut isänsä luona, ennenkuin lähti
etsimään ystäväänsä, hän oli yksityiskohtaisesti perehtynyt retken
suunnitelmaan ja eurooppalaisten tietojensa nojalla ehdottanut, jopa
— esiintyen pontevammin kuin koskaan ennen vanhan sheikin
seurassa — vaatinut siihen erinäisiä muutoksia, jotka hän nyt tarkoin
selitti Cravenille. Tämä kannatti niitä sydämensä pohjasta, sillä hän
itse oli esittänyt ihan samansuuntaiset ehdotukset, mutta vanhoilliset
päälliköt olivat hylänneet ne mahdottomina uudistuksina, eikä hän,
tuntien olevansa vieras, ollut niitä tyrkyttänyt. Äkkiä muuttaen
sävyään nuori arabialainen sitten otsa rypyssä lausui hänelle
kysymyksen.

»Mutta, mon cher, mitä tekemistä sinulla on tässä jutussa? Juuri


sitä tarkoitin, kun sanoin toivovani, että olisit tuhansien kilometrien
päässä. Sinä olet ystäväni, meidän kaikkien ystävä, mutta ystävyys
ei vaadi sinua lähtemään tänä yönä mukaamme. Se, että sinä
tarjoutuisit — niin — sehän olikin odotettavissa. Mutta että me
hyväksyisimme tarjoutumisesi — ei! sata kertaa ei! Sinä olet
englantilainen, korkea-arvoinen mies omassa maassasi. Miksi
sekaannut pienten arabialaispäällikköjen heimotaisteluihin — voyez
vous, minulla on vaatimattomuudenhetkeni! Jos jotakin sattuisi —
kuten hyvin todennäköisesti sattuu — niin mitä virkkaa isällinen
brittiläinen hallituksesi? Se vain lisää isäni vaikeuksia selittäessään
juttua meidän yliherroillemme.» Hänen äänessään oli naurun häive,
vaikka hänen katseensa olikin vakava. Craven heilautti kättään,
ikäänkuin pyyhkäisten hänen estelynsä syrjään.

»Englannin hallitus ei vaivaudu minun tähteni», vastasi hän


kuivakiskoisesti. »Minä en ole kyllin tärkeä henkilö.»

Muutamia minuutteja arabialainen istui ääneti ja poltteli vinhasti,


suunnaten sitten tummat silmänsä tutkivasti Cravenin kasvoihin.

»Pariisissa minulle kerrottiin, että olet naimisissa», virkkoi hän


hitaasti, ja sellaisenaan tämä huomautus oli selvä merkki hänen
eurooppalaisesta ajatussuunnastaan.

Craven kääntyi äkkiä toisaalle ja kumartui lampun puoleen,


virittämään piippuaan. »Sinulle puhuttiin totta», myönsi hän hieman
vastahakoisesti kasvot savupilven verhossa. »Pourtant, minä lähden
mukaanne tänä yönä.»

Hänen äänestään soinnahti jyrkkää päättäväisyyttä, jonka Said


tunsi. Nyt arabialainen kohautti olkapäitään mukautumisen merkiksi,
sytyttäen uuden savukkeen.

»Se on melkein varma kuolema», sanoi hän itämaalaisen


huolettoman levolliseen tapaan.

You might also like