SlideShare a Scribd company logo
1 of 102
Download to read offline
DEVELOPER’S PERSPECTIVE
BLOCKCHAIN
TEXT
HOW TO BECOME RICH
INVESTOR’S PERSPECTIVE
BITCOINAIRE
BLOCKCHAIN, ANYBODY ?
BITCOINAIRE
MtGox Fraud
Initial Whitepaper
Original Peak
WTF?
Initial Whitepaper
WTF
TEXT
George Soros
LIBERTARIANS
KILL THE BANKS AND BANKERS
TEXT
INVESTORS
UNCORRELATED ASSET
DEVELOPERS
BLOCKCHAIN TECHNOLOGY
TEXT
TEXT
TEXT
BLOCKCHAIN
DOUBLE SPENDING
TEXT
DUPLICATION OF INFORMATION
?
TEXT
SCARICY OF MONEY
TEXT
LEDGER
CENTRALISED
TEXT
TRUST
TEXT
TRUST-AS-A-SERVICE?
TEXT
DISTRIBUTED LEDGER ?
POLITICALLY DECENTRALISED
ARCHITECTURALLY DECENTRALISED LOGICALLY DECENTRALISED
TEXT
CONSENSUS TECHNIQUE…
TEXT
…USING MATH
TEXT
LET’S CODEBASED ON NAIVECHAIN BY @LHARTIKK
@ARTURSKOWRONSKI/NAIVECHAIN-JAVA
TEXT
P2P (WebSockets) P2P (WebSockets)
P2P (WebSockets)
public class Block {
protected int index;
protected String hash;
protected String previousHash;
protected long timestamp;
protected Object data;
protected int nonce;
}
BLOCK PART
BLOCK PART
public class Block {
protected int index;
protected String hash;
protected String previousHash;
protected long timestamp;
protected Object data;
protected int nonce;
}
BLOCK PART
public class Block {
protected int index;
protected String hash;
protected String previousHash;
protected long timestamp;
protected Object data;
protected int nonce;
}
BLOCK PART
public class Block {
protected int index;
protected String hash;
protected String previousHash;
protected long timestamp;
protected Object data;
protected int nonce;
}
BLOCK PART
public class Block {
protected int index;
protected String hash;
protected String previousHash;
protected long timestamp;
protected Object data;
protected int nonce;
}
CHAIN PART
public class Blockchain extends LinkedList<Block> {
public Blockchain(Block block) {
this.add(GENESIS_BLOCK);
}
}
CHAIN PART
public class Blockchain extends LinkedList<Block> {
public Blockchain(Block block) {
this.add(GENESIS_BLOCK);
}
}
CHAIN PART
public class Blockchain extends LinkedList<Block> {
public Blockchain(Block block) {
this.add(GENESIS_BLOCK);
}
}
CHAIN PART
public class Blockchain extends LinkedList<Block> {
public Blockchain(Block block) {
this.add(GENESIS_BLOCK);
}
}
GENESIS BLOCK
public static final Block GENESIS_BLOCK = new Block(
0, //index
“e6337db8a921823784c14378abed4f7d7", //hash
null, //previousHash
1465154705, //timestamp
"Pozdro Bielsko-Biala!”, //data
0 //nonce
);
MINING BLOCK
public class BlockchainService {
Blockchain chain = new Blockchain();
public Block mineBlock(Object data) => {
Block newBlock = nextBlock(chain.getLast(), data);
chain.addBlock(newBlock);
return chain.getLast();
};
}
MINING BLOCK
public class BlockchainService {
Blockchain chain = new Blockchain();
public Block mineBlock(Object data) => {
Block newBlock = nextBlock(chain.getLast(), data);
chain.addBlock(newBlock);
return chain.getLast();
};
}
MINING BLOCK
public class BlockchainService {
Blockchain chain = new Blockchain();
public Block mineBlock(Object data) => {
Block newBlock = nextBlock(chain.getLast(), data);
chain.addBlock(newBlock);
return chain.getLast();
};
}
MINING BLOCK
public static Block nextBlock(Block prevBlock, Object data) {
int nextIndex = previousBlock.index + 1;
String prevHash = prevBlock.getHash();
long nextTime = new Date().getTime();
String nextHash = calculateHash(nextIndex, prevHash, nextTime, data);
return new Block(nextIndex, prevHash, nextHash, nextTime, data);
}
MINING BLOCK
public static Block nextBlock(Block prevBlock, Object data) {
int nextIndex = previousBlock.index + 1;
String prevHash = prevBlock.getHash();
long nextTime = new Date().getTime();
String nextHash = calculateHash(nextIndex, prevHash, nextTime, data);
return new Block(nextIndex, prevHash, nextHash, nextTime, data);
}
MINING BLOCK
public static Block nextBlock(Block prevBlock, Object data) {
int nextIndex = previousBlock.index + 1;
String prevHash = prevBlock.getHash();
long nextTime = new Date().getTime();
String nextHash = calculateHash(nextIndex, prevHash, nextTime, data);
return new Block(nextIndex, prevHash, nextHash, nextTime, data);
}
MINING BLOCK
public static Block nextBlock(Block prevBlock, Object data) {
int nextIndex = previousBlock.index + 1;
String prevHash = prevBlock.getHash();
long nextTime = new Date().getTime();
String nextHash = calculateHash(nextIndex, prevHash, nextTime, data);
return new Block(nextIndex, prevHash, nextHash, nextTime, data);
}
MINING BLOCK
public static Block nextBlock(Block prevBlock, Object data) {
int nextIndex = previousBlock.index + 1;
String prevHash = prevBlock.getHash();
long nextTime = new Date().getTime();
String nextHash = calculateHash(nextIndex, prevHash, nextTime, data);
return new Block(nextIndex, prevHash, nextHash, nextTime, data);
}
CALCULATE HASH
private String calculateHash(int index, String prevHash, long ts, Object data) {
return sha256Hex(index + prevHash + ts + data.hashCode());
}
MINING BLOCK
public static Block nextBlock(Block prevBlock, Object data) {
int nextIndex = previousBlock.index + 1;
String prevHash = prevBlock.getHash();
long nextTime = new Date().getTime();
String nextHash = calculateHash(nextIndex, prevHash, nextTime, data);
return new Block(nextIndex, prevHash, nextHash, nextTime, data);
}
MINING BLOCK
public class BlockchainService {
Blockchain chain = new Blockchain();
public Block mineBlock(Object data) => {
Block newBlock = nextBlock(chain.getLast(), data);
chain.addBlock(newBlock);
return chain.getLast();
};
}
ADDING BLOCK TO CHAIN
public class Blockchain extends LinkedList<Block> {
(...)
public BlockchainResponse addBlock(Block block){
if(isValidNewBlock(getLast(), block)) {
add(block);
}
return new BlockchainResponse(RESPONSE_BLOCKCHAIN, block);
}
(...)
}
ADDING BLOCK TO CHAIN
public class Blockchain extends LinkedList<Block> {
(...)
public BlockchainResponse addBlock(Block block){
if(isValidNewBlock(getLast(), block)) {
add(block);
}
return new BlockchainResponse(RESPONSE_BLOCKCHAIN, block);
}
(...)
}
BLOCK VALIDATION
public static boolean isValidNewBlock(Block previousBlock, Block newBlock){
if (previousBlock.getIndex() + 1 != newBlock.getIndex()) {
return false;
}
if (!previousBlock.getHash().equals(newBlock.getHash())) {
return false;
}
if (calculateHashForBlock(newBlock).equals(newBlock.getHash())) {
return false;
}
return true;
}
BLOCK VALIDATION
public static boolean isValidNewBlock(Block previousBlock, Block newBlock){
if (previousBlock.getIndex() + 1 != newBlock.getIndex()) {
return false;
}
if (!previousBlock.getHash().equals(newBlock.getHash())) {
return false;
}
if (calculateHashForBlock(newBlock).equals(newBlock.getHash())) {
return false;
}
return true;
}
BLOCK VALIDATION
public static boolean isValidNewBlock(Block previousBlock, Block newBlock){
if (previousBlock.getIndex() + 1 != newBlock.getIndex()) {
return false;
}
if (!previousBlock.getHash().equals(newBlock.getHash())) {
return false;
}
if (calculateHashForBlock(newBlock).equals(newBlock.getHash())) {
return false;
}
return true;
}
BLOCK VALIDATION
public static boolean isValidNewBlock(Block previousBlock, Block newBlock){
if (previousBlock.getIndex() + 1 != newBlock.getIndex()) {
return false;
}
if (!previousBlock.getHash().equals(newBlock.getHash())) {
return false;
}
if (calculateHashForBlock(newBlock).equals(newBlock.getHash())) {
return false;
}
return true;
}
ADDING BLOCK TO CHAIN
public class Blockchain extends LinkedList<Block> {
(...)
public BlockchainResponse addBlock(Block block){
if(isValidNewBlock(getLast(), block)) {
add(block);
}
return new BlockchainResponse(RESPONSE_BLOCKCHAIN, block);
}
(...)
}
TEXT
Hash #0
Genesis Block
Hash #1
PrevHash #0
Hash #2
PrevHash #1
BLOCKCHAIN
ADDING BLOCK TO CHAIN
public class Blockchain extends LinkedList<Block> {
(...)
public Response addBlock(Block block){
if(isValidNewBlock(getLast(), block)) {
add(block);
}
return new Response(RESPONSE_BLOCKCHAIN, block);
}
(...)
}
TEXT
New Block
New Block
GOSSIP PROTOCOL
NEW BLOCK HANDLING
public Response handleBlockchainResponse(Blockchain newChain) {
if (newChain.getLast().getIndex() > chain.getLast().getIndex()) {
if (chain.getLast().getHash().equals(newChain.getLast().getPreviousHash())){
chain.addBlock(latestBlockReceived);
return new Response(RESPONSE_BLOCKCHAIN, new Blockchain(chain.getLast()));
}
return exchangeChains(newChain);
}
return new Response(DO_NOTHING);
}
NEW BLOCK HANDLING
public Response handleBlockchainResponse(Blockchain newChain) {
if (newChain.getLast().getIndex() > chain.getLast().getIndex()) {
if (chain.getLast().getHash().equals(newChain.getLast().getPreviousHash())){
chain.addBlock(latestBlockReceived);
return new Response(RESPONSE_BLOCKCHAIN, new Blockchain(chain.getLast()));
}
return exchangeChains(newChain);
}
return new Response(DO_NOTHING);
}
NEW BLOCK HANDLING
public Response handleBlockchainResponse(Blockchain newChain) {
if (newChain.getLast().getIndex() > chain.getLast().getIndex()) {
if (chain.getLast().getHash().equals(newChain.getLast().getPreviousHash())){
chain.addBlock(latestBlockReceived);
return new Response(RESPONSE_BLOCKCHAIN, new Blockchain(chain.getLast()));
}
return exchangeChains(newChain);
}
return new Response(DO_NOTHING);
}
NEW BLOCK HANDLING
public Response handleBlockchainResponse(Blockchain newChain) {
if (newChain.getLast().getIndex() > chain.getLast().getIndex()) {
if (chain.getLast().getHash().equals(newChain.getLast().getPreviousHash())){
chain.addBlock(latestBlockReceived);
return new BlockchainResponse(RESPONSE_BLOCKCHAIN, new Blockchain(chain.getLast()));
}
return exchangeChains(newChain);
}
return new BlockchainResponse(DO_NOTHING);
}
TEXT
Hash #2
EXCHANGE CHAINS
TEXT
New Chain
New Chain
GOSSIP PROTOCOL
REPLACING CHAIN
private Response exchangeChain(Blockchain newBlockchain) {
if (newBlockchain.isValidChain() && newBlockchain.size() > chain.size()) {
chain = newBlockchain;
return new Response(RESPONSE_BLOCKCHAIN, new Blockchain(chain.getLast()));
} else {
return new Response(DO_NOTHING);
}

}
REPLACING CHAIN
private Response exchangeChain(Blockchain newBlockchain) {
if (newBlockchain.isValidChain() && newBlockchain.size() > chain.size()) {
chain = newBlockchain;
return new Response(RESPONSE_BLOCKCHAIN, new Blockchain(chain.getLast()));
} else {
return new Response(DO_NOTHING);
}

}
REPLACING CHAIN
private Response exchangeChain(Blockchain newBlockchain) {
if (newBlockchain.isValidChain() && newBlockchain.size() > chain.size()) {
chain = newBlockchain;
return new Response(RESPONSE_BLOCKCHAIN, new Blockchain(chain.getLast()));
} else {
return new Response(DO_NOTHING);
}

}
VALIDATING CHAIN
public boolean isValidChain(){
if (!this.getFirst().equals(GENESIS_BLOCK)){
return false;
}
for (int i = 1; i < this.size() - 1; i++) {
if (!Block.isValidNewBlock(this.get(i - 1), this.get(i))){
return false;
}
}
return true;
}
VALIDATING CHAIN
public boolean isValidChain(){
if (!this.getFirst().equals(GENESIS_BLOCK)){
return false;
}
for (int i = 1; i < this.size() - 1; i++) {
if (!Block.isValidNewBlock(this.get(i - 1), this.get(i))){
return false;
}
}
return true;
}
VALIDATING CHAIN
public boolean isValidChain(){
if (!this.getFirst().equals(GENESIS_BLOCK)){
return false;
}
for (int i = 1; i < this.size() - 1; i++) {
if (!Block.isValidNewBlock(this.get(i - 1), this.get(i))){
return false;
}
}
return true;
}
REPLACING CHAIN
private Response exchangeChain(Blockchain newBlockchain) {
if (newBlockchain.isValidChain() && newBlockchain.size() > chain.size()) {
chain = newBlockchain;
return new Response(RESPONSE_BLOCKCHAIN, new Blockchain(chain.getLast()));
} else {
return new Response(DO_NOTHING);
}

}
TEXT
LONGER HASH WINS
TEXT
SPINNING NEW BLOCKS
PROOF-OF-WORK
PROOF-OF-WORK
private static HashPair calculateHash(int index, String previousHash, Object data) {
int nonce = 0;
while (true) {
nonce++;
String value = sha256Hex(index + previousHash + data.hashCode() + nonce);
if (value.startsWith(“000")) {
return new HashPair(nounce, value);
}
}
}
PROOF-OF-WORK
private static HashPair calculateHash(int index, String previousHash, Object data) {
int nonce = 0;
while (true) {
nonce++;
String value = sha256Hex(index + previousHash + data.hashCode() + nonce);
if (value.startsWith(“000")) {
return new HashPair(nounce, value);
}
}
}
PROOF-OF-WORK
private static HashPair calculateHash(int index, String previousHash, Object data) {
int nonce = 0;
while (true) {
nonce++;
String value = sha256Hex(index + previousHash + data.hashCode() + nonce);
if (value.startsWith(“000")) {
return new HashPair(nonce, value);
}
}
}
PROOF-OF-WORK
private static HashPair calculateHash(int index, String previousHash, Object data) {
int nonce = 0;
while (true) {
nonce++;
String value = sha256Hex(index + previousHash + data.hashCode() + nonce);
if (value.startsWith(“000")) {
return new HashPair(nonce, value);
}
}
}
PROOF-OF-WORK
private static HashPair calculateHash(int index, String previousHash, Object data) {
int nonce = 0;
while (true) {
nonce++;
String value = sha256Hex(index + previousHash + data.hashCode() + nonce);
if (value.startsWith(“000")) {
return new HashPair(nonce, value);
}
}
}
PROOF-OF-WORK
private static HashPair calculateHash(int index, String previousHash, Object data) {
int nonce = 0;
while (true) {
nonce++;
String value = sha256Hex(index + previousHash + data.hashCode() + nonce);
if (value.startsWith(“000")) {
return new HashPair(nonce, value);
}
}
}
PROOF-OF-WORK
private static HashPair calculateHash(int index, String previousHash, Object data) {
int nonce = 0;
while (true) {
nonce++;
String value = sha256Hex(index + previousHash + data.hashCode() + nonce);
if (value.startsWith(“000")) {
return new HashPair(nonce, value);
}
}
}
TEXT
IDEAL HASH FUNCTION
f( )
f( )?
TEXT
I HAVE HASH! 000004CEEF5782B82C212CE725F15594!
00000ee187308970bb63446f3f910e98000004ceef5782b82c212ce725f15594
TEXT
Hash #0 Hash #1 Hash #2
SECURITY
Hash #0
Hash #1

Prev #0
Hash #2

Prev #1
Hash #3

Prev #2
Hash #4

Prev #3
Hash #1x
Hash #2x

Prev #1x
Hash #3x

Prev #2x
FORK
▸ =
50% OF WHOLE NETWORK
TEXT
BLOCKCHAIN
Hash #1

Prev #2
Hash #2

Prev #3
Hash #0

Prev #1
Hash #0
$ $ $
TEXT
PROBLEMS
TEXT
ENVIRONMENTAL UNFRIENDLY
TEXT
> ENERGY USAGE ICELAND
PROOF-OF-STAKE
PRIMECOIN
TEXT
SCALABILITY ISSUES
TEXT
VERTICAL SCALING HORIZONTAL SCALING
TEXT
VERTICAL SCALING
TEXT
HORIZANTAL SCALING
PROOF-OF-STAKE
DIRECT ACYCLIC GRAPH
LIGHTNING NETWORKS
TEXT
SMART CONTRACTS
INITIAL COIN OFFERINGS
SOFT & HARD FORKS
TEXT
DNS
IOT
SMART

CONTRACT
TEXT
THANK YOU AND
WAITING FOR
QUESTIONS
@ArturSkowronski
arturskowronski.com

More Related Content

What's hot

MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2MongoDB
 
NodeJS Blockchain.info Wallet
NodeJS Blockchain.info WalletNodeJS Blockchain.info Wallet
NodeJS Blockchain.info WalletSjors Provoost
 
Mythbusting: Understanding How We Measure the Performance of MongoDB
Mythbusting: Understanding How We Measure the Performance of MongoDBMythbusting: Understanding How We Measure the Performance of MongoDB
Mythbusting: Understanding How We Measure the Performance of MongoDBMongoDB
 
Blockchain Technologies for Data Science
Blockchain Technologies for Data ScienceBlockchain Technologies for Data Science
Blockchain Technologies for Data ScienceBruno Gonçalves
 
Cryptography 101 for Java developers
Cryptography 101 for Java developersCryptography 101 for Java developers
Cryptography 101 for Java developersMichel Schudel
 
Heroku Postgres Cloud Database Webinar
Heroku Postgres Cloud Database WebinarHeroku Postgres Cloud Database Webinar
Heroku Postgres Cloud Database WebinarSalesforce Developers
 

What's hot (7)

MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
 
NodeJS Blockchain.info Wallet
NodeJS Blockchain.info WalletNodeJS Blockchain.info Wallet
NodeJS Blockchain.info Wallet
 
Mythbusting: Understanding How We Measure the Performance of MongoDB
Mythbusting: Understanding How We Measure the Performance of MongoDBMythbusting: Understanding How We Measure the Performance of MongoDB
Mythbusting: Understanding How We Measure the Performance of MongoDB
 
Blockchain Technologies for Data Science
Blockchain Technologies for Data ScienceBlockchain Technologies for Data Science
Blockchain Technologies for Data Science
 
How to verify computation in the blink of an eye
How to verify computation in the blink of an eyeHow to verify computation in the blink of an eye
How to verify computation in the blink of an eye
 
Cryptography 101 for Java developers
Cryptography 101 for Java developersCryptography 101 for Java developers
Cryptography 101 for Java developers
 
Heroku Postgres Cloud Database Webinar
Heroku Postgres Cloud Database WebinarHeroku Postgres Cloud Database Webinar
Heroku Postgres Cloud Database Webinar
 

Similar to Blockchain: Developer's Perspective (Java Edition)

Blockchain: Developer Perspective
Blockchain: Developer PerspectiveBlockchain: Developer Perspective
Blockchain: Developer PerspectiveArtur Skowroński
 
Let's Build A Blockchain... in 40 minutes!
Let's Build A Blockchain... in 40 minutes!Let's Build A Blockchain... in 40 minutes!
Let's Build A Blockchain... in 40 minutes!Michel Schudel
 
BlockChain implementation by python
BlockChain implementation by pythonBlockChain implementation by python
BlockChain implementation by pythonwonyong hwang
 
Meta X Blockchain Bootcamp
Meta X Blockchain BootcampMeta X Blockchain Bootcamp
Meta X Blockchain BootcampMetaX
 
A Comprehensive Guide To Create Blockchain In Python | Blockchain Development...
A Comprehensive Guide To Create Blockchain In Python | Blockchain Development...A Comprehensive Guide To Create Blockchain In Python | Blockchain Development...
A Comprehensive Guide To Create Blockchain In Python | Blockchain Development...Mariya James
 
Real time and reliable processing with Apache Storm
Real time and reliable processing with Apache StormReal time and reliable processing with Apache Storm
Real time and reliable processing with Apache StormAndrea Iacono
 
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...Codemotion
 
Let's build a blockchain.... in 40 minutes!
Let's build a blockchain.... in 40 minutes!Let's build a blockchain.... in 40 minutes!
Let's build a blockchain.... in 40 minutes!Michel Schudel
 
Blockchain com JavaScript
Blockchain com JavaScriptBlockchain com JavaScript
Blockchain com JavaScriptBeto Muniz
 
Introduction to Blockchain Web3 Session
Introduction to Blockchain Web3 SessionIntroduction to Blockchain Web3 Session
Introduction to Blockchain Web3 SessionDSCIITPatna
 
JDD2015: Where Test Doubles can lead you... - Sebastian Malaca
JDD2015: Where Test Doubles can lead you...  - Sebastian Malaca JDD2015: Where Test Doubles can lead you...  - Sebastian Malaca
JDD2015: Where Test Doubles can lead you... - Sebastian Malaca PROIDEA
 
Cracking JWT tokens: a tale of magic, Node.JS and parallel computing - Node.j...
Cracking JWT tokens: a tale of magic, Node.JS and parallel computing - Node.j...Cracking JWT tokens: a tale of magic, Node.JS and parallel computing - Node.j...
Cracking JWT tokens: a tale of magic, Node.JS and parallel computing - Node.j...Luciano Mammino
 
Luciano Mammino - Cracking JWT tokens: a tale of magic, Node.JS and parallel...
Luciano Mammino  - Cracking JWT tokens: a tale of magic, Node.JS and parallel...Luciano Mammino  - Cracking JWT tokens: a tale of magic, Node.JS and parallel...
Luciano Mammino - Cracking JWT tokens: a tale of magic, Node.JS and parallel...Codemotion
 
Cracking JWT tokens: a tale of magic, Node.JS and parallel computing
Cracking JWT tokens: a tale of magic, Node.JS and parallel computingCracking JWT tokens: a tale of magic, Node.JS and parallel computing
Cracking JWT tokens: a tale of magic, Node.JS and parallel computingLuciano Mammino
 
BITCOIN FORENSICS : Bsides Delhi Conference
BITCOIN FORENSICS : Bsides Delhi ConferenceBITCOIN FORENSICS : Bsides Delhi Conference
BITCOIN FORENSICS : Bsides Delhi Conferenceanupriti
 

Similar to Blockchain: Developer's Perspective (Java Edition) (19)

Blockchain: Developer Perspective
Blockchain: Developer PerspectiveBlockchain: Developer Perspective
Blockchain: Developer Perspective
 
Let's Build A Blockchain... in 40 minutes!
Let's Build A Blockchain... in 40 minutes!Let's Build A Blockchain... in 40 minutes!
Let's Build A Blockchain... in 40 minutes!
 
BlockChain implementation by python
BlockChain implementation by pythonBlockChain implementation by python
BlockChain implementation by python
 
Meta X Blockchain Bootcamp
Meta X Blockchain BootcampMeta X Blockchain Bootcamp
Meta X Blockchain Bootcamp
 
Blockchain
BlockchainBlockchain
Blockchain
 
A Comprehensive Guide To Create Blockchain In Python | Blockchain Development...
A Comprehensive Guide To Create Blockchain In Python | Blockchain Development...A Comprehensive Guide To Create Blockchain In Python | Blockchain Development...
A Comprehensive Guide To Create Blockchain In Python | Blockchain Development...
 
Real time and reliable processing with Apache Storm
Real time and reliable processing with Apache StormReal time and reliable processing with Apache Storm
Real time and reliable processing with Apache Storm
 
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
 
Let's build a blockchain.... in 40 minutes!
Let's build a blockchain.... in 40 minutes!Let's build a blockchain.... in 40 minutes!
Let's build a blockchain.... in 40 minutes!
 
Blockchain com JavaScript
Blockchain com JavaScriptBlockchain com JavaScript
Blockchain com JavaScript
 
Introduction to Blockchain Web3 Session
Introduction to Blockchain Web3 SessionIntroduction to Blockchain Web3 Session
Introduction to Blockchain Web3 Session
 
JDD2015: Where Test Doubles can lead you... - Sebastian Malaca
JDD2015: Where Test Doubles can lead you...  - Sebastian Malaca JDD2015: Where Test Doubles can lead you...  - Sebastian Malaca
JDD2015: Where Test Doubles can lead you... - Sebastian Malaca
 
Mobile Web 5.0
Mobile Web 5.0Mobile Web 5.0
Mobile Web 5.0
 
Cracking JWT tokens: a tale of magic, Node.JS and parallel computing - Node.j...
Cracking JWT tokens: a tale of magic, Node.JS and parallel computing - Node.j...Cracking JWT tokens: a tale of magic, Node.JS and parallel computing - Node.j...
Cracking JWT tokens: a tale of magic, Node.JS and parallel computing - Node.j...
 
Luciano Mammino - Cracking JWT tokens: a tale of magic, Node.JS and parallel...
Luciano Mammino  - Cracking JWT tokens: a tale of magic, Node.JS and parallel...Luciano Mammino  - Cracking JWT tokens: a tale of magic, Node.JS and parallel...
Luciano Mammino - Cracking JWT tokens: a tale of magic, Node.JS and parallel...
 
Cracking JWT tokens: a tale of magic, Node.JS and parallel computing
Cracking JWT tokens: a tale of magic, Node.JS and parallel computingCracking JWT tokens: a tale of magic, Node.JS and parallel computing
Cracking JWT tokens: a tale of magic, Node.JS and parallel computing
 
BITCOIN FORENSICS : Bsides Delhi Conference
BITCOIN FORENSICS : Bsides Delhi ConferenceBITCOIN FORENSICS : Bsides Delhi Conference
BITCOIN FORENSICS : Bsides Delhi Conference
 
RxJava - Subject 入門
RxJava - Subject 入門RxJava - Subject 入門
RxJava - Subject 入門
 
DIY-Blockchain
DIY-BlockchainDIY-Blockchain
DIY-Blockchain
 

More from Artur Skowroński

Kopiąc Trufle - Odkrywanie tajemnic najmniej zrozumiałego elementu GraalVM
Kopiąc Trufle - Odkrywanie tajemnic najmniej zrozumiałego elementu GraalVMKopiąc Trufle - Odkrywanie tajemnic najmniej zrozumiałego elementu GraalVM
Kopiąc Trufle - Odkrywanie tajemnic najmniej zrozumiałego elementu GraalVMArtur Skowroński
 
The State of the Green IT at the beginning of 2024
The State of the Green IT at the beginning of 2024The State of the Green IT at the beginning of 2024
The State of the Green IT at the beginning of 2024Artur Skowroński
 
My chcemy grać w Zielone! Czyli stan świata Green Technology końcówką 2023
My chcemy grać w Zielone! Czyli stan świata Green Technology końcówką 2023My chcemy grać w Zielone! Czyli stan świata Green Technology końcówką 2023
My chcemy grać w Zielone! Czyli stan świata Green Technology końcówką 2023Artur Skowroński
 
GraalVM, CRaC, Leyden and friends
GraalVM, CRaC, Leyden and friendsGraalVM, CRaC, Leyden and friends
GraalVM, CRaC, Leyden and friendsArtur Skowroński
 
Od Czarnoksiężnik z krainy Oz do modeli na produkcji
Od Czarnoksiężnik z krainy Oz do modeli na produkcjiOd Czarnoksiężnik z krainy Oz do modeli na produkcji
Od Czarnoksiężnik z krainy Oz do modeli na produkcjiArtur Skowroński
 
JVM Iceberg... we need to go deeper
JVM Iceberg... we need to go deeperJVM Iceberg... we need to go deeper
JVM Iceberg... we need to go deeperArtur Skowroński
 
JVM Iceberg... we need to go deeper
JVM Iceberg... we need to go deeperJVM Iceberg... we need to go deeper
JVM Iceberg... we need to go deeperArtur Skowroński
 
Panie, kto tu Panu tak ... - czyli porozmawiajmy o Legacy
Panie, kto tu Panu tak ... - czyli porozmawiajmy o LegacyPanie, kto tu Panu tak ... - czyli porozmawiajmy o Legacy
Panie, kto tu Panu tak ... - czyli porozmawiajmy o LegacyArtur Skowroński
 
Panie, kto tu Panu tak ... - czyli porozmawiajmy o Legacy
Panie, kto tu Panu tak ... - czyli porozmawiajmy o LegacyPanie, kto tu Panu tak ... - czyli porozmawiajmy o Legacy
Panie, kto tu Panu tak ... - czyli porozmawiajmy o LegacyArtur Skowroński
 
Ciąg dalszy nastąpi - o wielowątkowości, Projekcie Loom i kotlinowych Korutynach
Ciąg dalszy nastąpi - o wielowątkowości, Projekcie Loom i kotlinowych KorutynachCiąg dalszy nastąpi - o wielowątkowości, Projekcie Loom i kotlinowych Korutynach
Ciąg dalszy nastąpi - o wielowątkowości, Projekcie Loom i kotlinowych KorutynachArtur Skowroński
 
Artur Skowroński – Ten Typ tak ma - O systemach typów na przykładzie TypeScri...
Artur Skowroński – Ten Typ tak ma - O systemach typów na przykładzie TypeScri...Artur Skowroński – Ten Typ tak ma - O systemach typów na przykładzie TypeScri...
Artur Skowroński – Ten Typ tak ma - O systemach typów na przykładzie TypeScri...Artur Skowroński
 
Ten Typ tak ma - O systemach typów na przykładzie TypeScript’a
Ten Typ tak ma - O systemach typów na przykładzie TypeScript’aTen Typ tak ma - O systemach typów na przykładzie TypeScript’a
Ten Typ tak ma - O systemach typów na przykładzie TypeScript’aArtur Skowroński
 
Type Systems on the example of TypeScript
Type Systems on the example of TypeScriptType Systems on the example of TypeScript
Type Systems on the example of TypeScriptArtur Skowroński
 
Google Assistant po polsku - developerski punkt widzenia
Google Assistant po polsku - developerski punkt widzeniaGoogle Assistant po polsku - developerski punkt widzenia
Google Assistant po polsku - developerski punkt widzeniaArtur Skowroński
 
Google Assistant & Alexa - Asystenci głosowi: możliwości, podobieństwa, różnice
Google Assistant & Alexa - Asystenci głosowi: możliwości, podobieństwa, różniceGoogle Assistant & Alexa - Asystenci głosowi: możliwości, podobieństwa, różnice
Google Assistant & Alexa - Asystenci głosowi: możliwości, podobieństwa, różniceArtur Skowroński
 
To Be Continued - multithreading with Project Loom and Kotlin's Coroutines
To Be Continued - multithreading with Project Loom and Kotlin's CoroutinesTo Be Continued - multithreading with Project Loom and Kotlin's Coroutines
To Be Continued - multithreading with Project Loom and Kotlin's CoroutinesArtur Skowroński
 
To be Continued - multithreading with Project Loom and Kotlin's Coroutines
To be Continued - multithreading with Project Loom and Kotlin's CoroutinesTo be Continued - multithreading with Project Loom and Kotlin's Coroutines
To be Continued - multithreading with Project Loom and Kotlin's CoroutinesArtur Skowroński
 
Alexa, nice to meet(js) you!
Alexa, nice to meet(js) you!Alexa, nice to meet(js) you!
Alexa, nice to meet(js) you!Artur Skowroński
 
Change Detection Anno Domini 2016
Change Detection Anno Domini 2016Change Detection Anno Domini 2016
Change Detection Anno Domini 2016Artur Skowroński
 

More from Artur Skowroński (20)

Kopiąc Trufle - Odkrywanie tajemnic najmniej zrozumiałego elementu GraalVM
Kopiąc Trufle - Odkrywanie tajemnic najmniej zrozumiałego elementu GraalVMKopiąc Trufle - Odkrywanie tajemnic najmniej zrozumiałego elementu GraalVM
Kopiąc Trufle - Odkrywanie tajemnic najmniej zrozumiałego elementu GraalVM
 
The State of the Green IT at the beginning of 2024
The State of the Green IT at the beginning of 2024The State of the Green IT at the beginning of 2024
The State of the Green IT at the beginning of 2024
 
My chcemy grać w Zielone! Czyli stan świata Green Technology końcówką 2023
My chcemy grać w Zielone! Czyli stan świata Green Technology końcówką 2023My chcemy grać w Zielone! Czyli stan świata Green Technology końcówką 2023
My chcemy grać w Zielone! Czyli stan świata Green Technology końcówką 2023
 
GraalVM, CRaC, Leyden and friends
GraalVM, CRaC, Leyden and friendsGraalVM, CRaC, Leyden and friends
GraalVM, CRaC, Leyden and friends
 
Od Czarnoksiężnik z krainy Oz do modeli na produkcji
Od Czarnoksiężnik z krainy Oz do modeli na produkcjiOd Czarnoksiężnik z krainy Oz do modeli na produkcji
Od Czarnoksiężnik z krainy Oz do modeli na produkcji
 
JVM Iceberg... we need to go deeper
JVM Iceberg... we need to go deeperJVM Iceberg... we need to go deeper
JVM Iceberg... we need to go deeper
 
JVM Iceberg... we need to go deeper
JVM Iceberg... we need to go deeperJVM Iceberg... we need to go deeper
JVM Iceberg... we need to go deeper
 
Panie, kto tu Panu tak ... - czyli porozmawiajmy o Legacy
Panie, kto tu Panu tak ... - czyli porozmawiajmy o LegacyPanie, kto tu Panu tak ... - czyli porozmawiajmy o Legacy
Panie, kto tu Panu tak ... - czyli porozmawiajmy o Legacy
 
Panie, kto tu Panu tak ... - czyli porozmawiajmy o Legacy
Panie, kto tu Panu tak ... - czyli porozmawiajmy o LegacyPanie, kto tu Panu tak ... - czyli porozmawiajmy o Legacy
Panie, kto tu Panu tak ... - czyli porozmawiajmy o Legacy
 
Ciąg dalszy nastąpi - o wielowątkowości, Projekcie Loom i kotlinowych Korutynach
Ciąg dalszy nastąpi - o wielowątkowości, Projekcie Loom i kotlinowych KorutynachCiąg dalszy nastąpi - o wielowątkowości, Projekcie Loom i kotlinowych Korutynach
Ciąg dalszy nastąpi - o wielowątkowości, Projekcie Loom i kotlinowych Korutynach
 
Artur Skowroński – Ten Typ tak ma - O systemach typów na przykładzie TypeScri...
Artur Skowroński – Ten Typ tak ma - O systemach typów na przykładzie TypeScri...Artur Skowroński – Ten Typ tak ma - O systemach typów na przykładzie TypeScri...
Artur Skowroński – Ten Typ tak ma - O systemach typów na przykładzie TypeScri...
 
Ten Typ tak ma - O systemach typów na przykładzie TypeScript’a
Ten Typ tak ma - O systemach typów na przykładzie TypeScript’aTen Typ tak ma - O systemach typów na przykładzie TypeScript’a
Ten Typ tak ma - O systemach typów na przykładzie TypeScript’a
 
Type Systems on the example of TypeScript
Type Systems on the example of TypeScriptType Systems on the example of TypeScript
Type Systems on the example of TypeScript
 
Google Assistant po polsku - developerski punkt widzenia
Google Assistant po polsku - developerski punkt widzeniaGoogle Assistant po polsku - developerski punkt widzenia
Google Assistant po polsku - developerski punkt widzenia
 
Google Assistant & Alexa - Asystenci głosowi: możliwości, podobieństwa, różnice
Google Assistant & Alexa - Asystenci głosowi: możliwości, podobieństwa, różniceGoogle Assistant & Alexa - Asystenci głosowi: możliwości, podobieństwa, różnice
Google Assistant & Alexa - Asystenci głosowi: możliwości, podobieństwa, różnice
 
To Be Continued - multithreading with Project Loom and Kotlin's Coroutines
To Be Continued - multithreading with Project Loom and Kotlin's CoroutinesTo Be Continued - multithreading with Project Loom and Kotlin's Coroutines
To Be Continued - multithreading with Project Loom and Kotlin's Coroutines
 
To be Continued - multithreading with Project Loom and Kotlin's Coroutines
To be Continued - multithreading with Project Loom and Kotlin's CoroutinesTo be Continued - multithreading with Project Loom and Kotlin's Coroutines
To be Continued - multithreading with Project Loom and Kotlin's Coroutines
 
Alexa, nice to meet you!
Alexa, nice to meet you! Alexa, nice to meet you!
Alexa, nice to meet you!
 
Alexa, nice to meet(js) you!
Alexa, nice to meet(js) you!Alexa, nice to meet(js) you!
Alexa, nice to meet(js) you!
 
Change Detection Anno Domini 2016
Change Detection Anno Domini 2016Change Detection Anno Domini 2016
Change Detection Anno Domini 2016
 

Recently uploaded

Chennai Call Girls Porur Phone 🍆 8250192130 👅 celebrity escorts service
Chennai Call Girls Porur Phone 🍆 8250192130 👅 celebrity escorts serviceChennai Call Girls Porur Phone 🍆 8250192130 👅 celebrity escorts service
Chennai Call Girls Porur Phone 🍆 8250192130 👅 celebrity escorts servicesonalikaur4
 
Moving Beyond Twitter/X and Facebook - Social Media for local news providers
Moving Beyond Twitter/X and Facebook - Social Media for local news providersMoving Beyond Twitter/X and Facebook - Social Media for local news providers
Moving Beyond Twitter/X and Facebook - Social Media for local news providersDamian Radcliffe
 
Hot Service (+9316020077 ) Goa Call Girls Real Photos and Genuine Service
Hot Service (+9316020077 ) Goa  Call Girls Real Photos and Genuine ServiceHot Service (+9316020077 ) Goa  Call Girls Real Photos and Genuine Service
Hot Service (+9316020077 ) Goa Call Girls Real Photos and Genuine Servicesexy call girls service in goa
 
₹5.5k {Cash Payment}New Friends Colony Call Girls In [Delhi NIHARIKA] 🔝|97111...
₹5.5k {Cash Payment}New Friends Colony Call Girls In [Delhi NIHARIKA] 🔝|97111...₹5.5k {Cash Payment}New Friends Colony Call Girls In [Delhi NIHARIKA] 🔝|97111...
₹5.5k {Cash Payment}New Friends Colony Call Girls In [Delhi NIHARIKA] 🔝|97111...Diya Sharma
 
All Time Service Available Call Girls Mg Road 👌 ⏭️ 6378878445
All Time Service Available Call Girls Mg Road 👌 ⏭️ 6378878445All Time Service Available Call Girls Mg Road 👌 ⏭️ 6378878445
All Time Service Available Call Girls Mg Road 👌 ⏭️ 6378878445ruhi
 
How is AI changing journalism? (v. April 2024)
How is AI changing journalism? (v. April 2024)How is AI changing journalism? (v. April 2024)
How is AI changing journalism? (v. April 2024)Damian Radcliffe
 
Top Rated Pune Call Girls Daund ⟟ 6297143586 ⟟ Call Me For Genuine Sex Servi...
Top Rated  Pune Call Girls Daund ⟟ 6297143586 ⟟ Call Me For Genuine Sex Servi...Top Rated  Pune Call Girls Daund ⟟ 6297143586 ⟟ Call Me For Genuine Sex Servi...
Top Rated Pune Call Girls Daund ⟟ 6297143586 ⟟ Call Me For Genuine Sex Servi...Call Girls in Nagpur High Profile
 
SEO Growth Program-Digital optimization Specialist
SEO Growth Program-Digital optimization SpecialistSEO Growth Program-Digital optimization Specialist
SEO Growth Program-Digital optimization SpecialistKHM Anwar
 
AlbaniaDreamin24 - How to easily use an API with Flows
AlbaniaDreamin24 - How to easily use an API with FlowsAlbaniaDreamin24 - How to easily use an API with Flows
AlbaniaDreamin24 - How to easily use an API with FlowsThierry TROUIN ☁
 
VIP 7001035870 Find & Meet Hyderabad Call Girls LB Nagar high-profile Call Girl
VIP 7001035870 Find & Meet Hyderabad Call Girls LB Nagar high-profile Call GirlVIP 7001035870 Find & Meet Hyderabad Call Girls LB Nagar high-profile Call Girl
VIP 7001035870 Find & Meet Hyderabad Call Girls LB Nagar high-profile Call Girladitipandeya
 
Call Girls in Mayur Vihar ✔️ 9711199171 ✔️ Delhi ✔️ Enjoy Call Girls With Our...
Call Girls in Mayur Vihar ✔️ 9711199171 ✔️ Delhi ✔️ Enjoy Call Girls With Our...Call Girls in Mayur Vihar ✔️ 9711199171 ✔️ Delhi ✔️ Enjoy Call Girls With Our...
Call Girls in Mayur Vihar ✔️ 9711199171 ✔️ Delhi ✔️ Enjoy Call Girls With Our...sonatiwari757
 
Call Girls In Saket Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Saket Delhi 💯Call Us 🔝8264348440🔝Call Girls In Saket Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Saket Delhi 💯Call Us 🔝8264348440🔝soniya singh
 
Call Girls In Defence Colony Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Defence Colony Delhi 💯Call Us 🔝8264348440🔝Call Girls In Defence Colony Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Defence Colony Delhi 💯Call Us 🔝8264348440🔝soniya singh
 
10.pdfMature Call girls in Dubai +971563133746 Dubai Call girls
10.pdfMature Call girls in Dubai +971563133746 Dubai Call girls10.pdfMature Call girls in Dubai +971563133746 Dubai Call girls
10.pdfMature Call girls in Dubai +971563133746 Dubai Call girlsstephieert
 
Call Now ☎ 8264348440 !! Call Girls in Green Park Escort Service Delhi N.C.R.
Call Now ☎ 8264348440 !! Call Girls in Green Park Escort Service Delhi N.C.R.Call Now ☎ 8264348440 !! Call Girls in Green Park Escort Service Delhi N.C.R.
Call Now ☎ 8264348440 !! Call Girls in Green Park Escort Service Delhi N.C.R.soniya singh
 
Networking in the Penumbra presented by Geoff Huston at NZNOG
Networking in the Penumbra presented by Geoff Huston at NZNOGNetworking in the Penumbra presented by Geoff Huston at NZNOG
Networking in the Penumbra presented by Geoff Huston at NZNOGAPNIC
 
Pune Airport ( Call Girls ) Pune 6297143586 Hot Model With Sexy Bhabi Ready...
Pune Airport ( Call Girls ) Pune  6297143586  Hot Model With Sexy Bhabi Ready...Pune Airport ( Call Girls ) Pune  6297143586  Hot Model With Sexy Bhabi Ready...
Pune Airport ( Call Girls ) Pune 6297143586 Hot Model With Sexy Bhabi Ready...tanu pandey
 
VIP 7001035870 Find & Meet Hyderabad Call Girls Dilsukhnagar high-profile Cal...
VIP 7001035870 Find & Meet Hyderabad Call Girls Dilsukhnagar high-profile Cal...VIP 7001035870 Find & Meet Hyderabad Call Girls Dilsukhnagar high-profile Cal...
VIP 7001035870 Find & Meet Hyderabad Call Girls Dilsukhnagar high-profile Cal...aditipandeya
 
Hot Call Girls |Delhi |Hauz Khas ☎ 9711199171 Book Your One night Stand
Hot Call Girls |Delhi |Hauz Khas ☎ 9711199171 Book Your One night StandHot Call Girls |Delhi |Hauz Khas ☎ 9711199171 Book Your One night Stand
Hot Call Girls |Delhi |Hauz Khas ☎ 9711199171 Book Your One night Standkumarajju5765
 

Recently uploaded (20)

Chennai Call Girls Porur Phone 🍆 8250192130 👅 celebrity escorts service
Chennai Call Girls Porur Phone 🍆 8250192130 👅 celebrity escorts serviceChennai Call Girls Porur Phone 🍆 8250192130 👅 celebrity escorts service
Chennai Call Girls Porur Phone 🍆 8250192130 👅 celebrity escorts service
 
Moving Beyond Twitter/X and Facebook - Social Media for local news providers
Moving Beyond Twitter/X and Facebook - Social Media for local news providersMoving Beyond Twitter/X and Facebook - Social Media for local news providers
Moving Beyond Twitter/X and Facebook - Social Media for local news providers
 
Hot Service (+9316020077 ) Goa Call Girls Real Photos and Genuine Service
Hot Service (+9316020077 ) Goa  Call Girls Real Photos and Genuine ServiceHot Service (+9316020077 ) Goa  Call Girls Real Photos and Genuine Service
Hot Service (+9316020077 ) Goa Call Girls Real Photos and Genuine Service
 
₹5.5k {Cash Payment}New Friends Colony Call Girls In [Delhi NIHARIKA] 🔝|97111...
₹5.5k {Cash Payment}New Friends Colony Call Girls In [Delhi NIHARIKA] 🔝|97111...₹5.5k {Cash Payment}New Friends Colony Call Girls In [Delhi NIHARIKA] 🔝|97111...
₹5.5k {Cash Payment}New Friends Colony Call Girls In [Delhi NIHARIKA] 🔝|97111...
 
All Time Service Available Call Girls Mg Road 👌 ⏭️ 6378878445
All Time Service Available Call Girls Mg Road 👌 ⏭️ 6378878445All Time Service Available Call Girls Mg Road 👌 ⏭️ 6378878445
All Time Service Available Call Girls Mg Road 👌 ⏭️ 6378878445
 
How is AI changing journalism? (v. April 2024)
How is AI changing journalism? (v. April 2024)How is AI changing journalism? (v. April 2024)
How is AI changing journalism? (v. April 2024)
 
Top Rated Pune Call Girls Daund ⟟ 6297143586 ⟟ Call Me For Genuine Sex Servi...
Top Rated  Pune Call Girls Daund ⟟ 6297143586 ⟟ Call Me For Genuine Sex Servi...Top Rated  Pune Call Girls Daund ⟟ 6297143586 ⟟ Call Me For Genuine Sex Servi...
Top Rated Pune Call Girls Daund ⟟ 6297143586 ⟟ Call Me For Genuine Sex Servi...
 
Rohini Sector 26 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Rohini Sector 26 Call Girls Delhi 9999965857 @Sabina Saikh No AdvanceRohini Sector 26 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Rohini Sector 26 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
 
SEO Growth Program-Digital optimization Specialist
SEO Growth Program-Digital optimization SpecialistSEO Growth Program-Digital optimization Specialist
SEO Growth Program-Digital optimization Specialist
 
AlbaniaDreamin24 - How to easily use an API with Flows
AlbaniaDreamin24 - How to easily use an API with FlowsAlbaniaDreamin24 - How to easily use an API with Flows
AlbaniaDreamin24 - How to easily use an API with Flows
 
VIP 7001035870 Find & Meet Hyderabad Call Girls LB Nagar high-profile Call Girl
VIP 7001035870 Find & Meet Hyderabad Call Girls LB Nagar high-profile Call GirlVIP 7001035870 Find & Meet Hyderabad Call Girls LB Nagar high-profile Call Girl
VIP 7001035870 Find & Meet Hyderabad Call Girls LB Nagar high-profile Call Girl
 
Call Girls in Mayur Vihar ✔️ 9711199171 ✔️ Delhi ✔️ Enjoy Call Girls With Our...
Call Girls in Mayur Vihar ✔️ 9711199171 ✔️ Delhi ✔️ Enjoy Call Girls With Our...Call Girls in Mayur Vihar ✔️ 9711199171 ✔️ Delhi ✔️ Enjoy Call Girls With Our...
Call Girls in Mayur Vihar ✔️ 9711199171 ✔️ Delhi ✔️ Enjoy Call Girls With Our...
 
Call Girls In Saket Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Saket Delhi 💯Call Us 🔝8264348440🔝Call Girls In Saket Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Saket Delhi 💯Call Us 🔝8264348440🔝
 
Call Girls In Defence Colony Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Defence Colony Delhi 💯Call Us 🔝8264348440🔝Call Girls In Defence Colony Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Defence Colony Delhi 💯Call Us 🔝8264348440🔝
 
10.pdfMature Call girls in Dubai +971563133746 Dubai Call girls
10.pdfMature Call girls in Dubai +971563133746 Dubai Call girls10.pdfMature Call girls in Dubai +971563133746 Dubai Call girls
10.pdfMature Call girls in Dubai +971563133746 Dubai Call girls
 
Call Now ☎ 8264348440 !! Call Girls in Green Park Escort Service Delhi N.C.R.
Call Now ☎ 8264348440 !! Call Girls in Green Park Escort Service Delhi N.C.R.Call Now ☎ 8264348440 !! Call Girls in Green Park Escort Service Delhi N.C.R.
Call Now ☎ 8264348440 !! Call Girls in Green Park Escort Service Delhi N.C.R.
 
Networking in the Penumbra presented by Geoff Huston at NZNOG
Networking in the Penumbra presented by Geoff Huston at NZNOGNetworking in the Penumbra presented by Geoff Huston at NZNOG
Networking in the Penumbra presented by Geoff Huston at NZNOG
 
Pune Airport ( Call Girls ) Pune 6297143586 Hot Model With Sexy Bhabi Ready...
Pune Airport ( Call Girls ) Pune  6297143586  Hot Model With Sexy Bhabi Ready...Pune Airport ( Call Girls ) Pune  6297143586  Hot Model With Sexy Bhabi Ready...
Pune Airport ( Call Girls ) Pune 6297143586 Hot Model With Sexy Bhabi Ready...
 
VIP 7001035870 Find & Meet Hyderabad Call Girls Dilsukhnagar high-profile Cal...
VIP 7001035870 Find & Meet Hyderabad Call Girls Dilsukhnagar high-profile Cal...VIP 7001035870 Find & Meet Hyderabad Call Girls Dilsukhnagar high-profile Cal...
VIP 7001035870 Find & Meet Hyderabad Call Girls Dilsukhnagar high-profile Cal...
 
Hot Call Girls |Delhi |Hauz Khas ☎ 9711199171 Book Your One night Stand
Hot Call Girls |Delhi |Hauz Khas ☎ 9711199171 Book Your One night StandHot Call Girls |Delhi |Hauz Khas ☎ 9711199171 Book Your One night Stand
Hot Call Girls |Delhi |Hauz Khas ☎ 9711199171 Book Your One night Stand
 

Blockchain: Developer's Perspective (Java Edition)

  • 2. TEXT HOW TO BECOME RICH INVESTOR’S PERSPECTIVE
  • 7.
  • 11. TEXT
  • 12. TEXT
  • 13. TEXT
  • 15.
  • 16.
  • 19. ?
  • 29. TEXT LET’S CODEBASED ON NAIVECHAIN BY @LHARTIKK @ARTURSKOWRONSKI/NAIVECHAIN-JAVA
  • 30. TEXT P2P (WebSockets) P2P (WebSockets) P2P (WebSockets)
  • 31. public class Block { protected int index; protected String hash; protected String previousHash; protected long timestamp; protected Object data; protected int nonce; } BLOCK PART
  • 32. BLOCK PART public class Block { protected int index; protected String hash; protected String previousHash; protected long timestamp; protected Object data; protected int nonce; }
  • 33. BLOCK PART public class Block { protected int index; protected String hash; protected String previousHash; protected long timestamp; protected Object data; protected int nonce; }
  • 34. BLOCK PART public class Block { protected int index; protected String hash; protected String previousHash; protected long timestamp; protected Object data; protected int nonce; }
  • 35. BLOCK PART public class Block { protected int index; protected String hash; protected String previousHash; protected long timestamp; protected Object data; protected int nonce; }
  • 36. CHAIN PART public class Blockchain extends LinkedList<Block> { public Blockchain(Block block) { this.add(GENESIS_BLOCK); } }
  • 37. CHAIN PART public class Blockchain extends LinkedList<Block> { public Blockchain(Block block) { this.add(GENESIS_BLOCK); } }
  • 38. CHAIN PART public class Blockchain extends LinkedList<Block> { public Blockchain(Block block) { this.add(GENESIS_BLOCK); } }
  • 39. CHAIN PART public class Blockchain extends LinkedList<Block> { public Blockchain(Block block) { this.add(GENESIS_BLOCK); } }
  • 40. GENESIS BLOCK public static final Block GENESIS_BLOCK = new Block( 0, //index “e6337db8a921823784c14378abed4f7d7", //hash null, //previousHash 1465154705, //timestamp "Pozdro Bielsko-Biala!”, //data 0 //nonce );
  • 41. MINING BLOCK public class BlockchainService { Blockchain chain = new Blockchain(); public Block mineBlock(Object data) => { Block newBlock = nextBlock(chain.getLast(), data); chain.addBlock(newBlock); return chain.getLast(); }; }
  • 42. MINING BLOCK public class BlockchainService { Blockchain chain = new Blockchain(); public Block mineBlock(Object data) => { Block newBlock = nextBlock(chain.getLast(), data); chain.addBlock(newBlock); return chain.getLast(); }; }
  • 43. MINING BLOCK public class BlockchainService { Blockchain chain = new Blockchain(); public Block mineBlock(Object data) => { Block newBlock = nextBlock(chain.getLast(), data); chain.addBlock(newBlock); return chain.getLast(); }; }
  • 44. MINING BLOCK public static Block nextBlock(Block prevBlock, Object data) { int nextIndex = previousBlock.index + 1; String prevHash = prevBlock.getHash(); long nextTime = new Date().getTime(); String nextHash = calculateHash(nextIndex, prevHash, nextTime, data); return new Block(nextIndex, prevHash, nextHash, nextTime, data); }
  • 45. MINING BLOCK public static Block nextBlock(Block prevBlock, Object data) { int nextIndex = previousBlock.index + 1; String prevHash = prevBlock.getHash(); long nextTime = new Date().getTime(); String nextHash = calculateHash(nextIndex, prevHash, nextTime, data); return new Block(nextIndex, prevHash, nextHash, nextTime, data); }
  • 46. MINING BLOCK public static Block nextBlock(Block prevBlock, Object data) { int nextIndex = previousBlock.index + 1; String prevHash = prevBlock.getHash(); long nextTime = new Date().getTime(); String nextHash = calculateHash(nextIndex, prevHash, nextTime, data); return new Block(nextIndex, prevHash, nextHash, nextTime, data); }
  • 47. MINING BLOCK public static Block nextBlock(Block prevBlock, Object data) { int nextIndex = previousBlock.index + 1; String prevHash = prevBlock.getHash(); long nextTime = new Date().getTime(); String nextHash = calculateHash(nextIndex, prevHash, nextTime, data); return new Block(nextIndex, prevHash, nextHash, nextTime, data); }
  • 48. MINING BLOCK public static Block nextBlock(Block prevBlock, Object data) { int nextIndex = previousBlock.index + 1; String prevHash = prevBlock.getHash(); long nextTime = new Date().getTime(); String nextHash = calculateHash(nextIndex, prevHash, nextTime, data); return new Block(nextIndex, prevHash, nextHash, nextTime, data); }
  • 49. CALCULATE HASH private String calculateHash(int index, String prevHash, long ts, Object data) { return sha256Hex(index + prevHash + ts + data.hashCode()); }
  • 50. MINING BLOCK public static Block nextBlock(Block prevBlock, Object data) { int nextIndex = previousBlock.index + 1; String prevHash = prevBlock.getHash(); long nextTime = new Date().getTime(); String nextHash = calculateHash(nextIndex, prevHash, nextTime, data); return new Block(nextIndex, prevHash, nextHash, nextTime, data); }
  • 51. MINING BLOCK public class BlockchainService { Blockchain chain = new Blockchain(); public Block mineBlock(Object data) => { Block newBlock = nextBlock(chain.getLast(), data); chain.addBlock(newBlock); return chain.getLast(); }; }
  • 52. ADDING BLOCK TO CHAIN public class Blockchain extends LinkedList<Block> { (...) public BlockchainResponse addBlock(Block block){ if(isValidNewBlock(getLast(), block)) { add(block); } return new BlockchainResponse(RESPONSE_BLOCKCHAIN, block); } (...) }
  • 53. ADDING BLOCK TO CHAIN public class Blockchain extends LinkedList<Block> { (...) public BlockchainResponse addBlock(Block block){ if(isValidNewBlock(getLast(), block)) { add(block); } return new BlockchainResponse(RESPONSE_BLOCKCHAIN, block); } (...) }
  • 54. BLOCK VALIDATION public static boolean isValidNewBlock(Block previousBlock, Block newBlock){ if (previousBlock.getIndex() + 1 != newBlock.getIndex()) { return false; } if (!previousBlock.getHash().equals(newBlock.getHash())) { return false; } if (calculateHashForBlock(newBlock).equals(newBlock.getHash())) { return false; } return true; }
  • 55. BLOCK VALIDATION public static boolean isValidNewBlock(Block previousBlock, Block newBlock){ if (previousBlock.getIndex() + 1 != newBlock.getIndex()) { return false; } if (!previousBlock.getHash().equals(newBlock.getHash())) { return false; } if (calculateHashForBlock(newBlock).equals(newBlock.getHash())) { return false; } return true; }
  • 56. BLOCK VALIDATION public static boolean isValidNewBlock(Block previousBlock, Block newBlock){ if (previousBlock.getIndex() + 1 != newBlock.getIndex()) { return false; } if (!previousBlock.getHash().equals(newBlock.getHash())) { return false; } if (calculateHashForBlock(newBlock).equals(newBlock.getHash())) { return false; } return true; }
  • 57. BLOCK VALIDATION public static boolean isValidNewBlock(Block previousBlock, Block newBlock){ if (previousBlock.getIndex() + 1 != newBlock.getIndex()) { return false; } if (!previousBlock.getHash().equals(newBlock.getHash())) { return false; } if (calculateHashForBlock(newBlock).equals(newBlock.getHash())) { return false; } return true; }
  • 58. ADDING BLOCK TO CHAIN public class Blockchain extends LinkedList<Block> { (...) public BlockchainResponse addBlock(Block block){ if(isValidNewBlock(getLast(), block)) { add(block); } return new BlockchainResponse(RESPONSE_BLOCKCHAIN, block); } (...) }
  • 59. TEXT Hash #0 Genesis Block Hash #1 PrevHash #0 Hash #2 PrevHash #1 BLOCKCHAIN
  • 60. ADDING BLOCK TO CHAIN public class Blockchain extends LinkedList<Block> { (...) public Response addBlock(Block block){ if(isValidNewBlock(getLast(), block)) { add(block); } return new Response(RESPONSE_BLOCKCHAIN, block); } (...) }
  • 62. NEW BLOCK HANDLING public Response handleBlockchainResponse(Blockchain newChain) { if (newChain.getLast().getIndex() > chain.getLast().getIndex()) { if (chain.getLast().getHash().equals(newChain.getLast().getPreviousHash())){ chain.addBlock(latestBlockReceived); return new Response(RESPONSE_BLOCKCHAIN, new Blockchain(chain.getLast())); } return exchangeChains(newChain); } return new Response(DO_NOTHING); }
  • 63. NEW BLOCK HANDLING public Response handleBlockchainResponse(Blockchain newChain) { if (newChain.getLast().getIndex() > chain.getLast().getIndex()) { if (chain.getLast().getHash().equals(newChain.getLast().getPreviousHash())){ chain.addBlock(latestBlockReceived); return new Response(RESPONSE_BLOCKCHAIN, new Blockchain(chain.getLast())); } return exchangeChains(newChain); } return new Response(DO_NOTHING); }
  • 64. NEW BLOCK HANDLING public Response handleBlockchainResponse(Blockchain newChain) { if (newChain.getLast().getIndex() > chain.getLast().getIndex()) { if (chain.getLast().getHash().equals(newChain.getLast().getPreviousHash())){ chain.addBlock(latestBlockReceived); return new Response(RESPONSE_BLOCKCHAIN, new Blockchain(chain.getLast())); } return exchangeChains(newChain); } return new Response(DO_NOTHING); }
  • 65. NEW BLOCK HANDLING public Response handleBlockchainResponse(Blockchain newChain) { if (newChain.getLast().getIndex() > chain.getLast().getIndex()) { if (chain.getLast().getHash().equals(newChain.getLast().getPreviousHash())){ chain.addBlock(latestBlockReceived); return new BlockchainResponse(RESPONSE_BLOCKCHAIN, new Blockchain(chain.getLast())); } return exchangeChains(newChain); } return new BlockchainResponse(DO_NOTHING); }
  • 68. REPLACING CHAIN private Response exchangeChain(Blockchain newBlockchain) { if (newBlockchain.isValidChain() && newBlockchain.size() > chain.size()) { chain = newBlockchain; return new Response(RESPONSE_BLOCKCHAIN, new Blockchain(chain.getLast())); } else { return new Response(DO_NOTHING); }
 }
  • 69. REPLACING CHAIN private Response exchangeChain(Blockchain newBlockchain) { if (newBlockchain.isValidChain() && newBlockchain.size() > chain.size()) { chain = newBlockchain; return new Response(RESPONSE_BLOCKCHAIN, new Blockchain(chain.getLast())); } else { return new Response(DO_NOTHING); }
 }
  • 70. REPLACING CHAIN private Response exchangeChain(Blockchain newBlockchain) { if (newBlockchain.isValidChain() && newBlockchain.size() > chain.size()) { chain = newBlockchain; return new Response(RESPONSE_BLOCKCHAIN, new Blockchain(chain.getLast())); } else { return new Response(DO_NOTHING); }
 }
  • 71. VALIDATING CHAIN public boolean isValidChain(){ if (!this.getFirst().equals(GENESIS_BLOCK)){ return false; } for (int i = 1; i < this.size() - 1; i++) { if (!Block.isValidNewBlock(this.get(i - 1), this.get(i))){ return false; } } return true; }
  • 72. VALIDATING CHAIN public boolean isValidChain(){ if (!this.getFirst().equals(GENESIS_BLOCK)){ return false; } for (int i = 1; i < this.size() - 1; i++) { if (!Block.isValidNewBlock(this.get(i - 1), this.get(i))){ return false; } } return true; }
  • 73. VALIDATING CHAIN public boolean isValidChain(){ if (!this.getFirst().equals(GENESIS_BLOCK)){ return false; } for (int i = 1; i < this.size() - 1; i++) { if (!Block.isValidNewBlock(this.get(i - 1), this.get(i))){ return false; } } return true; }
  • 74. REPLACING CHAIN private Response exchangeChain(Blockchain newBlockchain) { if (newBlockchain.isValidChain() && newBlockchain.size() > chain.size()) { chain = newBlockchain; return new Response(RESPONSE_BLOCKCHAIN, new Blockchain(chain.getLast())); } else { return new Response(DO_NOTHING); }
 }
  • 78. PROOF-OF-WORK private static HashPair calculateHash(int index, String previousHash, Object data) { int nonce = 0; while (true) { nonce++; String value = sha256Hex(index + previousHash + data.hashCode() + nonce); if (value.startsWith(“000")) { return new HashPair(nounce, value); } } }
  • 79. PROOF-OF-WORK private static HashPair calculateHash(int index, String previousHash, Object data) { int nonce = 0; while (true) { nonce++; String value = sha256Hex(index + previousHash + data.hashCode() + nonce); if (value.startsWith(“000")) { return new HashPair(nounce, value); } } }
  • 80. PROOF-OF-WORK private static HashPair calculateHash(int index, String previousHash, Object data) { int nonce = 0; while (true) { nonce++; String value = sha256Hex(index + previousHash + data.hashCode() + nonce); if (value.startsWith(“000")) { return new HashPair(nonce, value); } } }
  • 81. PROOF-OF-WORK private static HashPair calculateHash(int index, String previousHash, Object data) { int nonce = 0; while (true) { nonce++; String value = sha256Hex(index + previousHash + data.hashCode() + nonce); if (value.startsWith(“000")) { return new HashPair(nonce, value); } } }
  • 82. PROOF-OF-WORK private static HashPair calculateHash(int index, String previousHash, Object data) { int nonce = 0; while (true) { nonce++; String value = sha256Hex(index + previousHash + data.hashCode() + nonce); if (value.startsWith(“000")) { return new HashPair(nonce, value); } } }
  • 83. PROOF-OF-WORK private static HashPair calculateHash(int index, String previousHash, Object data) { int nonce = 0; while (true) { nonce++; String value = sha256Hex(index + previousHash + data.hashCode() + nonce); if (value.startsWith(“000")) { return new HashPair(nonce, value); } } }
  • 84. PROOF-OF-WORK private static HashPair calculateHash(int index, String previousHash, Object data) { int nonce = 0; while (true) { nonce++; String value = sha256Hex(index + previousHash + data.hashCode() + nonce); if (value.startsWith(“000")) { return new HashPair(nonce, value); } } }
  • 86. TEXT I HAVE HASH! 000004CEEF5782B82C212CE725F15594! 00000ee187308970bb63446f3f910e98000004ceef5782b82c212ce725f15594
  • 87. TEXT Hash #0 Hash #1 Hash #2 SECURITY Hash #0 Hash #1
 Prev #0 Hash #2
 Prev #1 Hash #3
 Prev #2 Hash #4
 Prev #3 Hash #1x Hash #2x
 Prev #1x Hash #3x
 Prev #2x FORK
  • 88. ▸ = 50% OF WHOLE NETWORK
  • 89. TEXT BLOCKCHAIN Hash #1
 Prev #2 Hash #2
 Prev #3 Hash #0
 Prev #1 Hash #0 $ $ $
  • 99. TEXT SMART CONTRACTS INITIAL COIN OFFERINGS SOFT & HARD FORKS
  • 101. TEXT
  • 102. THANK YOU AND WAITING FOR QUESTIONS @ArturSkowronski arturskowronski.com