SlideShare a Scribd company logo
1 of 95
Download to read offline
DEVELOPER’S PERSPECTIVE
BLOCKCHAIN
TEXT
HOW TO BECOME RICH
INVESTOR’S PERSPECTIVE
BITCOINAIRE
BLOCKCHAIN, ANYBODY ?
BITCOINAIRE
MtGox Fraud
Initial Whitepaper
Initial Whitepaper
WTF?
TEXT
George Soros
LIBERTARIANS
KILL THE BANKS AND BANKERS
TEXT
INVESTORS
UNCORRELATED ASSET
DEVELOPERS
BLOCKCHAIN TECHNOLOGY
TEXT
TEXT
DOUBLE SPENDING
TEXT
?
TEXT
LEDGER
CENTRALISED
TEXT
TRUST
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
TEXT
P2P (WebSockets)
Interface (HTTP)
P2P (WebSockets)
Interface (HTTP)
P2P (WebSockets)
Interface (HTTP)
class Block {
constructor(index, previousHash, data, hash) {
this.index = index;
this.previousHash = previousHash;
this.hash = hash;
this.data = data;
}
}
BLOCK PART
class Block {
constructor(index, previousHash, data, hash) {
this.index = index;
this.previousHash = previousHash;
this.hash = hash;
this.data = data;
}
}
BLOCK PART
class Block {
constructor(index, previousHash, data, hash) {
this.index = index;
this.previousHash = previousHash;
this.hash = hash;
this.data = data;
}
}
BLOCK PART
class Block {
constructor(index, previousHash, data, hash) {
this.index = index;
this.previousHash = previousHash;
this.hash = hash;
this.data = data;
}
}
BLOCK PART
class Block {
constructor(index, previousHash, data, hash) {
this.index = index;
this.previousHash = previousHash;
this.hash = hash;
this.data = data;
}
}
BLOCK PART
class Chain {
constructor() {
this.blockchain = [GenesisBlock()];
}
chain() {
return this.blockchain
}
latestBlock () {return last(this.blockchain)};
};
CHAIN PART
class Chain {
constructor() {
this.blockchain = [GenesisBlock()];
}
chain() {
return this.blockchain
}
latestBlock () {return last(this.blockchain)};
};
CHAIN PART
class Chain {
constructor() {
this.blockchain = [GenesisBlock()];
}
chain() {
return this.blockchain
}
latestBlock () {return last(this.blockchain)};
};
CHAIN PART
GENESIS BLOCK
const GenesisBlock = () => {
return new Block(
index: 0,
previousHash: ”0",
data: "my genesis block!!",
hash: ”816534932c2b7154836da6afc”
);
};
MINING BLOCK
let chain = new Chain();
const mineBlock = (data) => {
const newBlock = NextBlock(chain.latestBlock(), data);
return chain.add(newBlock);
};
MINING BLOCK
let chain = new Chain();
const mineBlock = (data) => {
const newBlock = NextBlock(chain.latestBlock(), data);
return chain.add(newBlock);
};
MINING BLOCK
const NextBlock = (prevBlock, blockData) => {
const index = prevBlock.index + 1;
const prevHash = prevBlock.hash
const hash = calculateHash(index, prevHash, blockData);
return new Block(index, prevHash, ts, blockData, hash);
};
MINING BLOCK
const NextBlock = (prevBlock, blockData) => {
const index = prevBlock.index + 1;
const prevHash = prevBlock.hash
const hash = calculateHash(index, prevHash, blockData);
return new Block(index, prevHash, ts, blockData, hash);
};
MINING BLOCK
const NextBlock = (prevBlock, blockData) => {
const index = prevBlock.index + 1;
const prevHash = prevBlock.hash
const hash = calculateHash(index, prevHash, blockData);
return new Block(index, prevHash, ts, blockData, hash);
};
MINING BLOCK
const NextBlock = (prevBlock, blockData) => {
const index = prevBlock.index + 1;
const prevHash = prevBlock.hash
const hash = calculateHash(index, prevHash, blockData);
return new Block(index, prevHash, ts, blockData, hash);
};
CALCULATE HASH
const calculateHash = (index, prevHash, data) => {
return CryptoJS.SHA256(`${index} ${prevHash} ${data}`)
};
MINING BLOCK
const NextBlock = (prevBlock, blockData) => {
const index = prevBlock.index + 1;
const prevHash = prevBlock.hash
const hash = calculateHash(index, prevHash, blockData);
return new Block(index, prevHash, blockData, hash);
};
MINING BLOCK
let chain = new Chain();
const mineBlock = (data) => {
const newBlock = NextBlock(chain.latestBlock(), data);
return chain.add(newBlock);
};
ADDING BLOCK TO CHAIN
class Chain {
(…)
add(newBlock) {
if (isValidNewBlock(newBlock, this.latestBlock())) {
this.blockchain.push(newBlock)
}
return {
'type': RESPONSE_BLOCKCHAIN,
‘data':[latestBlock()]}
}
}
latestBlock () {return last(this.blockchain)};
};
ADDING BLOCK TO CHAIN
class Chain {
(…)
add(newBlock) {
if (isValidNewBlock(newBlock, this.latestBlock())) {
this.blockchain.push(newBlock)
}
return {
'type': RESPONSE_BLOCKCHAIN,
‘data':[latestBlock()]}
}
}
latestBlock () {return last(this.blockchain)};
};
BLOCK VALIDATION
const isValidNewBlock = (newBlock, previousBlock) => {
if (previousBlock.index + 1 !== newBlock.index) {
return false;
}
if (previousBlock.hash !== newBlock.previousHash) {
return false;
}
if (calculateHashForBlock(newBlock) !== newBlock.hash) {
return false;
}
return true;
};
BLOCK VALIDATION
const isValidNewBlock = (newBlock, previousBlock) => {
if (previousBlock.index + 1 !== newBlock.index) {
return false;
}
if (previousBlock.hash !== newBlock.previousHash) {
return false;
}
if (calculateHashForBlock(newBlock) !== newBlock.hash) {
return false;
}
return true;
};
BLOCK VALIDATION
const isValidNewBlock = (newBlock, previousBlock) => {
if (previousBlock.index + 1 !== newBlock.index) {
return false;
}
if (previousBlock.hash !== newBlock.previousHash) {
return false;
}
if (calculateHashForBlock(newBlock) !== newBlock.hash) {
return false;
}
return true;
};
BLOCK VALIDATION
const isValidNewBlock = (newBlock, previousBlock) => {
if (previousBlock.index + 1 !== newBlock.index) {
return false;
}
if (previousBlock.hash !== newBlock.previousHash) {
return false;
}
if (calculateHashForBlock(newBlock) !== newBlock.hash) {
return false;
}
return true;
};
ADDING BLOCK TO CHAIN
class Chain {
(…)
add(newBlock) {
if (isValidNewBlock(newBlock, this.latestBlock())) {
this.blockchain.push(newBlock)
}
return {
'type': RESPONSE_BLOCKCHAIN,
‘data':[latestBlock()]}
}
}
latestBlock () {return last(this.blockchain)};
};
TEXT
Hash #0
Genesis Block
Hash #1
PrevHash #0
Hash #2
PrevHash #1
BLOCKCHAIN
ADDING BLOCK TO CHAIN
class Chain {
(…)
add(newBlock) {
if (isValidNewBlock(newBlock, this.latestBlock())) {
this.blockchain.push(newBlock)
}
return {
'type': RESPONSE_BLOCKCHAIN,
‘data':[latestBlock()]}
}
}
latestBlock () {return last(this.blockchain)};
};
TEXT
New Block
New Block
NEW BLOCK HANDLING
const handleBlockchainResponse = (message) => {
const receivedBlocks = message;
if (last(receivedBlocks).index > chain.latestBlock().index) {
if (last(receivedBlocks).previousHash === chain.latestBlock().hash) {
chain.add(latestBlockReceived);
return {'type': RESPONSE_BLOCKCHAIN, ‘data':[chain.latestBlock()]}
}
return {'type': EXCHANGE_CHAINS};
}
};
NEW BLOCK HANDLING
const handleBlockchainResponse = (message) => {
const receivedBlocks = message;
if (last(receivedBlocks).index > chain.latestBlock().index) {
if (last(receivedBlocks).previousHash === chain.latestBlock().hash) {
chain.add(latestBlockReceived);
return {'type': RESPONSE_BLOCKCHAIN, ‘data':[chain.latestBlock()]}
}
return {'type': EXCHANGE_CHAINS};
}
};
NEW BLOCK HANDLING
const handleBlockchainResponse = (message) => {
const receivedBlocks = message;
if (last(receivedBlocks).index > chain.latestBlock().index) {
if (last(receivedBlocks).previousHash === chain.latestBlock().hash) {
chain.add(latestBlockReceived);
return {'type': RESPONSE_BLOCKCHAIN, ‘data':[chain.latestBlock()]}
}
return {'type': EXCHANGE_CHAINS};
}
};
NEW BLOCK HANDLING
const handleBlockchainResponse = (message) => {
const receivedBlocks = message;
if (last(receivedBlocks).index > chain.latestBlock().index) {
if (last(receivedBlocks).previousHash === chain.latestBlock().hash) {
chain.add(latestBlockReceived);
return {'type': RESPONSE_BLOCKCHAIN, ‘data':[chain.latestBlock()]}
}
return {'type': EXCHANGE_CHAINS};
}
};
TEXT
Hash #2
EXCHANGE CHAINS
TEXT
New Chain
New Chain
REPLACING CHAIN
const replaceChain = (newChain) => {
if (newChain.isValidChain() &&
newChain.size() > this.chain.size()){
this.chain = newBlockchain;
return {
'type': RESPONSE_BLOCKCHAIN,
‘data':[chain.latestBlock()]}
}
};
REPLACING CHAIN
const replaceChain = (newChain) => {
if (newChain.isValidChain() &&
newChain.size() > this.chain.size()){
this.chain = newBlockchain;
return {
‘type': RESPONSE_BLOCKCHAIN,
‘data’: [chain.latestBlock()]}
}
};
REPLACING CHAIN
const replaceChain = (newChain) => {
if (newChain.isValidChain() &&
newChain.size() > this.chain.size()){
this.chain = newBlockchain;
return {
'type': RESPONSE_BLOCKCHAIN,
‘data':[chain.latestBlock()]}
}
};
VALIDATING CHAIN
isValidChain () {
if (!isEqual(this.genesisBlock(), GenesisBlock())) {
return false;
}
for (let i = 1; i < this.size(); i++) {
if (!isValidNewBlock(this.get(i), this.get[i - 1])) {
return false;
}
}
return true;
};
VALIDATING CHAIN
isValidChain () {
if (!isEqual(this.genesisBlock(), GenesisBlock())) {
return false;
}
for (let i = 1; i < this.size(); i++) {
if (!isValidNewBlock(this.get(i), this.get[i - 1])) {
return false;
}
}
return true;
};
VALIDATING CHAIN
isValidChain () {
if (!isEqual(this.genesisBlock(), GenesisBlock())) {
return false;
}
for (let i = 1; i < this.size(); i++) {
if (!isValidNewBlock(this.get(i), this.get[i - 1])) {
return false;
}
}
return true;
};
REPLACING CHAIN
const replaceChain = (newChain) => {
if (newChain.isValidChain() &&
newChain.size() > this.chain.size()){
this.chain = newBlockchain;
return {
'type': RESPONSE_BLOCKCHAIN,
‘data':[chain.latestBlock()]}
}
};
TEXT
LONGER HASH WINS
TEXT
SPINNING NEW BLOCKS
PROOF-OF-WORK
PROOF-OF-WORK
const calculateHash = (index, prevHash, data) => {
let nonce = 0;
while(true){
nonce++;
seed = `${index} ${prevHash} ${data} ${nonce}`
const value = CryptoJS.SHA256(seed)
if (startsWith(value, "000000")) {
return value;
}
}
};
PROOF-OF-WORK
const calculateHash = (index, prevHash, data) => {
let nonce = 0;
while(true){
nonce++;
seed = `${index} ${prevHash} ${data} ${nonce}`
const value = CryptoJS.SHA256(seed)
if (startsWith(value, "000000")) {
return value;
}
}
};
PROOF-OF-WORK
const calculateHash = (index, prevHash, data) => {
let nonce = 0;
while(true){
nonce++;
seed = `${index} ${prevHash} ${data} ${nonce}`
const value = CryptoJS.SHA256(seed)
if (startsWith(value, "000000")) {
return value;
}
}
};
PROOF-OF-WORK
const calculateHash = (index, prevHash, data) => {
let nonce = 0;
while(true){
nonce++;
seed = `${index} ${prevHash} ${data} ${nonce}`
const value = CryptoJS.SHA256(seed)
if (startsWith(value, "000000")) {
return value;
}
}
};
PROOF-OF-WORK
const calculateHash = (index, prevHash, data) => {
let nonce = 0;
while(true){
nonce++;
seed = `${index} ${prevHash} ${data} ${nonce}`
const value = CryptoJS.SHA256(seed)
if (startsWith(value, "000000")) {
return value;
}
}
};
PROOF-OF-WORK
const calculateHash = (index, prevHash, data) => {
let nonce = 0;
while(true){
nonce++;
seed = `${index} ${prevHash} ${data} ${nonce}`
const value = CryptoJS.SHA256(seed)
if (startsWith(value, "000000")) {
return value;
}
}
};
PROOF-OF-WORK
const calculateHash = (index, prevHash, data) => {
let nonce = 0;
while(true){
nonce++;
seed = `${index} ${prevHash} ${data} ${nonce}`
const value = CryptoJS.SHA256(seed)
if (startsWith(value, "000000")) {
return value;
}
}
};
PROOF-OF-WORK
const calculateHash = (index, prevHash, data) => {
let nonce = 0;
while(true){
nonce++;
seed = `${index} ${prevHash} ${data} ${nonce}`
const value = CryptoJS.SHA256(seed)
if (startsWith(value, "000000")) {
return 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

Websockets, Ruby y Pusher Webprendedor 2010
Websockets, Ruby y Pusher Webprendedor 2010Websockets, Ruby y Pusher Webprendedor 2010
Websockets, Ruby y Pusher Webprendedor 2010Ismael Celis
 
MongoDB Performance Tuning
MongoDB Performance TuningMongoDB Performance Tuning
MongoDB Performance TuningPuneet Behl
 
Descargar datos con JSON en Android
Descargar datos con JSON en AndroidDescargar datos con JSON en Android
Descargar datos con JSON en Android★ Raúl Laza
 
“Technical Intro to Blockhain” by Yurijs Pimenovs from Paybis at CryptoCurren...
“Technical Intro to Blockhain” by Yurijs Pimenovs from Paybis at CryptoCurren...“Technical Intro to Blockhain” by Yurijs Pimenovs from Paybis at CryptoCurren...
“Technical Intro to Blockhain” by Yurijs Pimenovs from Paybis at CryptoCurren...Dace Barone
 
MongoDB Performance Debugging
MongoDB Performance DebuggingMongoDB Performance Debugging
MongoDB Performance DebuggingMongoDB
 
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
 
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
 
20110514 mongo dbチューニング
20110514 mongo dbチューニング20110514 mongo dbチューニング
20110514 mongo dbチューニングYuichi Matsuo
 
WebSocket JSON Hackday
WebSocket JSON HackdayWebSocket JSON Hackday
WebSocket JSON HackdaySomay Nakhal
 
apidays LIVE New York - WT* is JWT? by Maciej Treder
apidays LIVE New York -  WT* is JWT? by Maciej Trederapidays LIVE New York -  WT* is JWT? by Maciej Treder
apidays LIVE New York - WT* is JWT? by Maciej Trederapidays
 
Cryptography In Silverlight
Cryptography In SilverlightCryptography In Silverlight
Cryptography In SilverlightBarry Dorrans
 
はじめてのMongoDB
はじめてのMongoDBはじめてのMongoDB
はじめてのMongoDBTakahiro Inoue
 
Mongodb debugging-performance-problems
Mongodb debugging-performance-problemsMongodb debugging-performance-problems
Mongodb debugging-performance-problemsMongoDB
 
Ebook Pembuatan Aplikasi tiket kapal 2012
Ebook Pembuatan Aplikasi tiket kapal 2012Ebook Pembuatan Aplikasi tiket kapal 2012
Ebook Pembuatan Aplikasi tiket kapal 2012yantoit2011
 

What's hot (17)

Websockets, Ruby y Pusher Webprendedor 2010
Websockets, Ruby y Pusher Webprendedor 2010Websockets, Ruby y Pusher Webprendedor 2010
Websockets, Ruby y Pusher Webprendedor 2010
 
MongoDB Performance Tuning
MongoDB Performance TuningMongoDB Performance Tuning
MongoDB Performance Tuning
 
Descargar datos con JSON en Android
Descargar datos con JSON en AndroidDescargar datos con JSON en Android
Descargar datos con JSON en Android
 
“Technical Intro to Blockhain” by Yurijs Pimenovs from Paybis at CryptoCurren...
“Technical Intro to Blockhain” by Yurijs Pimenovs from Paybis at CryptoCurren...“Technical Intro to Blockhain” by Yurijs Pimenovs from Paybis at CryptoCurren...
“Technical Intro to Blockhain” by Yurijs Pimenovs from Paybis at CryptoCurren...
 
MongoDB Performance Debugging
MongoDB Performance DebuggingMongoDB Performance Debugging
MongoDB Performance Debugging
 
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
 
Blockchain - a simple implementation
Blockchain - a simple implementationBlockchain - a simple implementation
Blockchain - a simple implementation
 
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
 
20110514 mongo dbチューニング
20110514 mongo dbチューニング20110514 mongo dbチューニング
20110514 mongo dbチューニング
 
WebSocket JSON Hackday
WebSocket JSON HackdayWebSocket JSON Hackday
WebSocket JSON Hackday
 
apidays LIVE New York - WT* is JWT? by Maciej Treder
apidays LIVE New York -  WT* is JWT? by Maciej Trederapidays LIVE New York -  WT* is JWT? by Maciej Treder
apidays LIVE New York - WT* is JWT? by Maciej Treder
 
Mongo db dla administratora
Mongo db dla administratoraMongo db dla administratora
Mongo db dla administratora
 
Di and Dagger
Di and DaggerDi and Dagger
Di and Dagger
 
Cryptography In Silverlight
Cryptography In SilverlightCryptography In Silverlight
Cryptography In Silverlight
 
はじめてのMongoDB
はじめてのMongoDBはじめてのMongoDB
はじめてのMongoDB
 
Mongodb debugging-performance-problems
Mongodb debugging-performance-problemsMongodb debugging-performance-problems
Mongodb debugging-performance-problems
 
Ebook Pembuatan Aplikasi tiket kapal 2012
Ebook Pembuatan Aplikasi tiket kapal 2012Ebook Pembuatan Aplikasi tiket kapal 2012
Ebook Pembuatan Aplikasi tiket kapal 2012
 

Viewers also liked

Blockchain Consensus Protocols
Blockchain Consensus ProtocolsBlockchain Consensus Protocols
Blockchain Consensus ProtocolsMelanie Swan
 
CBGTBT - Part 5 - Blockchains 102
CBGTBT - Part 5 - Blockchains 102CBGTBT - Part 5 - Blockchains 102
CBGTBT - Part 5 - Blockchains 102Blockstrap.com
 
State of Bitcoin and Blockchain 2016
State of Bitcoin and Blockchain 2016State of Bitcoin and Blockchain 2016
State of Bitcoin and Blockchain 2016CoinDesk
 
Introduction to bitcoin
Introduction to bitcoinIntroduction to bitcoin
Introduction to bitcoinWolf McNally
 
Bitcoin: The Internet of Money
Bitcoin: The Internet of MoneyBitcoin: The Internet of Money
Bitcoin: The Internet of Moneywinklevosscap
 
CBGTBT - Part 1 - Workshop introduction & primer
CBGTBT - Part 1 - Workshop introduction & primerCBGTBT - Part 1 - Workshop introduction & primer
CBGTBT - Part 1 - Workshop introduction & primerBlockstrap.com
 
Blockchain: The Information Technology of the Future
Blockchain: The Information Technology of the FutureBlockchain: The Information Technology of the Future
Blockchain: The Information Technology of the FutureMelanie Swan
 

Viewers also liked (7)

Blockchain Consensus Protocols
Blockchain Consensus ProtocolsBlockchain Consensus Protocols
Blockchain Consensus Protocols
 
CBGTBT - Part 5 - Blockchains 102
CBGTBT - Part 5 - Blockchains 102CBGTBT - Part 5 - Blockchains 102
CBGTBT - Part 5 - Blockchains 102
 
State of Bitcoin and Blockchain 2016
State of Bitcoin and Blockchain 2016State of Bitcoin and Blockchain 2016
State of Bitcoin and Blockchain 2016
 
Introduction to bitcoin
Introduction to bitcoinIntroduction to bitcoin
Introduction to bitcoin
 
Bitcoin: The Internet of Money
Bitcoin: The Internet of MoneyBitcoin: The Internet of Money
Bitcoin: The Internet of Money
 
CBGTBT - Part 1 - Workshop introduction & primer
CBGTBT - Part 1 - Workshop introduction & primerCBGTBT - Part 1 - Workshop introduction & primer
CBGTBT - Part 1 - Workshop introduction & primer
 
Blockchain: The Information Technology of the Future
Blockchain: The Information Technology of the FutureBlockchain: The Information Technology of the Future
Blockchain: The Information Technology of the Future
 

Similar to Blockchain: Developer Perspective

Blockchain: Developer's Perspective (Java Edition)
Blockchain: Developer's Perspective (Java Edition)Blockchain: Developer's Perspective (Java Edition)
Blockchain: Developer's Perspective (Java Edition)Artur Skowroński
 
BlockChain implementation by python
BlockChain implementation by pythonBlockChain implementation by python
BlockChain implementation by pythonwonyong hwang
 
  package Chapter_20;import ToolKit.PostfixNotation;import javaf.pdf
  package Chapter_20;import ToolKit.PostfixNotation;import javaf.pdf  package Chapter_20;import ToolKit.PostfixNotation;import javaf.pdf
  package Chapter_20;import ToolKit.PostfixNotation;import javaf.pdfsudhirchourasia86
 
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
 
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
 
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
 
Implementing STM in Java
Implementing STM in JavaImplementing STM in Java
Implementing STM in JavaMisha Kozik
 
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
 
JJUG CCC 2011 Spring
JJUG CCC 2011 SpringJJUG CCC 2011 Spring
JJUG CCC 2011 SpringKiyotaka Oku
 
Kamil Chmielewski, Jacek Juraszek - "Hadoop. W poszukiwaniu złotego młotka."
Kamil Chmielewski, Jacek Juraszek - "Hadoop. W poszukiwaniu złotego młotka."Kamil Chmielewski, Jacek Juraszek - "Hadoop. W poszukiwaniu złotego młotka."
Kamil Chmielewski, Jacek Juraszek - "Hadoop. W poszukiwaniu złotego młotka."sjabs
 
I have created a class hasdhedDictionary that implements the Diction.pdf
I have created a class hasdhedDictionary that implements the Diction.pdfI have created a class hasdhedDictionary that implements the Diction.pdf
I have created a class hasdhedDictionary that implements the Diction.pdfallystraders
 
Meta X Blockchain Bootcamp
Meta X Blockchain BootcampMeta X Blockchain Bootcamp
Meta X Blockchain BootcampMetaX
 
Improving the java type system
Improving the java type systemImproving the java type system
Improving the java type systemJoão Loff
 
Scalaで実装してみる簡易ブロックチェーン
Scalaで実装してみる簡易ブロックチェーンScalaで実装してみる簡易ブロックチェーン
Scalaで実装してみる簡易ブロックチェーンHiroshi Ito
 

Similar to Blockchain: Developer Perspective (20)

Blockchain: Developer's Perspective (Java Edition)
Blockchain: Developer's Perspective (Java Edition)Blockchain: Developer's Perspective (Java Edition)
Blockchain: Developer's Perspective (Java Edition)
 
BlockChain implementation by python
BlockChain implementation by pythonBlockChain implementation by python
BlockChain implementation by python
 
Blockchain
BlockchainBlockchain
Blockchain
 
  package Chapter_20;import ToolKit.PostfixNotation;import javaf.pdf
  package Chapter_20;import ToolKit.PostfixNotation;import javaf.pdf  package Chapter_20;import ToolKit.PostfixNotation;import javaf.pdf
  package Chapter_20;import ToolKit.PostfixNotation;import javaf.pdf
 
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...
 
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
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
 
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...
 
H base programming
H base programmingH base programming
H base programming
 
Implementing STM in Java
Implementing STM in JavaImplementing STM in Java
Implementing STM in Java
 
Building real-time apps with WebSockets
Building real-time apps with WebSocketsBuilding real-time apps with WebSockets
Building real-time apps with WebSockets
 
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
 
JJUG CCC 2011 Spring
JJUG CCC 2011 SpringJJUG CCC 2011 Spring
JJUG CCC 2011 Spring
 
Kamil Chmielewski, Jacek Juraszek - "Hadoop. W poszukiwaniu złotego młotka."
Kamil Chmielewski, Jacek Juraszek - "Hadoop. W poszukiwaniu złotego młotka."Kamil Chmielewski, Jacek Juraszek - "Hadoop. W poszukiwaniu złotego młotka."
Kamil Chmielewski, Jacek Juraszek - "Hadoop. W poszukiwaniu złotego młotka."
 
I have created a class hasdhedDictionary that implements the Diction.pdf
I have created a class hasdhedDictionary that implements the Diction.pdfI have created a class hasdhedDictionary that implements the Diction.pdf
I have created a class hasdhedDictionary that implements the Diction.pdf
 
Meta X Blockchain Bootcamp
Meta X Blockchain BootcampMeta X Blockchain Bootcamp
Meta X Blockchain Bootcamp
 
Improving the java type system
Improving the java type systemImproving the java type system
Improving the java type system
 
Google Guava
Google GuavaGoogle Guava
Google Guava
 
Php sql-android
Php sql-androidPhp sql-android
Php sql-android
 
Scalaで実装してみる簡易ブロックチェーン
Scalaで実装してみる簡易ブロックチェーンScalaで実装してみる簡易ブロックチェーン
Scalaで実装してみる簡易ブロックチェーン
 

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

TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxLoriGlavin3
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfRankYa
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piececharlottematthew16
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxNavinnSomaal
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 

Recently uploaded (20)

TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 
DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special EditionDMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdf
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piece
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptx
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 

Blockchain: Developer Perspective

  • 2. TEXT HOW TO BECOME RICH INVESTOR’S PERSPECTIVE
  • 6.
  • 10. TEXT
  • 11. TEXT
  • 12.
  • 13.
  • 15. TEXT
  • 16. ?
  • 24. TEXT LET’S CODEBASED ON NAIVECHAIN BY @LHARTIKK @ARTURSKOWRONSKI/NAIVECHAIN
  • 25. TEXT P2P (WebSockets) Interface (HTTP) P2P (WebSockets) Interface (HTTP) P2P (WebSockets) Interface (HTTP)
  • 26. class Block { constructor(index, previousHash, data, hash) { this.index = index; this.previousHash = previousHash; this.hash = hash; this.data = data; } } BLOCK PART
  • 27. class Block { constructor(index, previousHash, data, hash) { this.index = index; this.previousHash = previousHash; this.hash = hash; this.data = data; } } BLOCK PART
  • 28. class Block { constructor(index, previousHash, data, hash) { this.index = index; this.previousHash = previousHash; this.hash = hash; this.data = data; } } BLOCK PART
  • 29. class Block { constructor(index, previousHash, data, hash) { this.index = index; this.previousHash = previousHash; this.hash = hash; this.data = data; } } BLOCK PART
  • 30. class Block { constructor(index, previousHash, data, hash) { this.index = index; this.previousHash = previousHash; this.hash = hash; this.data = data; } } BLOCK PART
  • 31. class Chain { constructor() { this.blockchain = [GenesisBlock()]; } chain() { return this.blockchain } latestBlock () {return last(this.blockchain)}; }; CHAIN PART
  • 32. class Chain { constructor() { this.blockchain = [GenesisBlock()]; } chain() { return this.blockchain } latestBlock () {return last(this.blockchain)}; }; CHAIN PART
  • 33. class Chain { constructor() { this.blockchain = [GenesisBlock()]; } chain() { return this.blockchain } latestBlock () {return last(this.blockchain)}; }; CHAIN PART
  • 34. GENESIS BLOCK const GenesisBlock = () => { return new Block( index: 0, previousHash: ”0", data: "my genesis block!!", hash: ”816534932c2b7154836da6afc” ); };
  • 35. MINING BLOCK let chain = new Chain(); const mineBlock = (data) => { const newBlock = NextBlock(chain.latestBlock(), data); return chain.add(newBlock); };
  • 36. MINING BLOCK let chain = new Chain(); const mineBlock = (data) => { const newBlock = NextBlock(chain.latestBlock(), data); return chain.add(newBlock); };
  • 37. MINING BLOCK const NextBlock = (prevBlock, blockData) => { const index = prevBlock.index + 1; const prevHash = prevBlock.hash const hash = calculateHash(index, prevHash, blockData); return new Block(index, prevHash, ts, blockData, hash); };
  • 38. MINING BLOCK const NextBlock = (prevBlock, blockData) => { const index = prevBlock.index + 1; const prevHash = prevBlock.hash const hash = calculateHash(index, prevHash, blockData); return new Block(index, prevHash, ts, blockData, hash); };
  • 39. MINING BLOCK const NextBlock = (prevBlock, blockData) => { const index = prevBlock.index + 1; const prevHash = prevBlock.hash const hash = calculateHash(index, prevHash, blockData); return new Block(index, prevHash, ts, blockData, hash); };
  • 40. MINING BLOCK const NextBlock = (prevBlock, blockData) => { const index = prevBlock.index + 1; const prevHash = prevBlock.hash const hash = calculateHash(index, prevHash, blockData); return new Block(index, prevHash, ts, blockData, hash); };
  • 41. CALCULATE HASH const calculateHash = (index, prevHash, data) => { return CryptoJS.SHA256(`${index} ${prevHash} ${data}`) };
  • 42. MINING BLOCK const NextBlock = (prevBlock, blockData) => { const index = prevBlock.index + 1; const prevHash = prevBlock.hash const hash = calculateHash(index, prevHash, blockData); return new Block(index, prevHash, blockData, hash); };
  • 43. MINING BLOCK let chain = new Chain(); const mineBlock = (data) => { const newBlock = NextBlock(chain.latestBlock(), data); return chain.add(newBlock); };
  • 44. ADDING BLOCK TO CHAIN class Chain { (…) add(newBlock) { if (isValidNewBlock(newBlock, this.latestBlock())) { this.blockchain.push(newBlock) } return { 'type': RESPONSE_BLOCKCHAIN, ‘data':[latestBlock()]} } } latestBlock () {return last(this.blockchain)}; };
  • 45. ADDING BLOCK TO CHAIN class Chain { (…) add(newBlock) { if (isValidNewBlock(newBlock, this.latestBlock())) { this.blockchain.push(newBlock) } return { 'type': RESPONSE_BLOCKCHAIN, ‘data':[latestBlock()]} } } latestBlock () {return last(this.blockchain)}; };
  • 46. BLOCK VALIDATION const isValidNewBlock = (newBlock, previousBlock) => { if (previousBlock.index + 1 !== newBlock.index) { return false; } if (previousBlock.hash !== newBlock.previousHash) { return false; } if (calculateHashForBlock(newBlock) !== newBlock.hash) { return false; } return true; };
  • 47. BLOCK VALIDATION const isValidNewBlock = (newBlock, previousBlock) => { if (previousBlock.index + 1 !== newBlock.index) { return false; } if (previousBlock.hash !== newBlock.previousHash) { return false; } if (calculateHashForBlock(newBlock) !== newBlock.hash) { return false; } return true; };
  • 48. BLOCK VALIDATION const isValidNewBlock = (newBlock, previousBlock) => { if (previousBlock.index + 1 !== newBlock.index) { return false; } if (previousBlock.hash !== newBlock.previousHash) { return false; } if (calculateHashForBlock(newBlock) !== newBlock.hash) { return false; } return true; };
  • 49. BLOCK VALIDATION const isValidNewBlock = (newBlock, previousBlock) => { if (previousBlock.index + 1 !== newBlock.index) { return false; } if (previousBlock.hash !== newBlock.previousHash) { return false; } if (calculateHashForBlock(newBlock) !== newBlock.hash) { return false; } return true; };
  • 50. ADDING BLOCK TO CHAIN class Chain { (…) add(newBlock) { if (isValidNewBlock(newBlock, this.latestBlock())) { this.blockchain.push(newBlock) } return { 'type': RESPONSE_BLOCKCHAIN, ‘data':[latestBlock()]} } } latestBlock () {return last(this.blockchain)}; };
  • 51. TEXT Hash #0 Genesis Block Hash #1 PrevHash #0 Hash #2 PrevHash #1 BLOCKCHAIN
  • 52. ADDING BLOCK TO CHAIN class Chain { (…) add(newBlock) { if (isValidNewBlock(newBlock, this.latestBlock())) { this.blockchain.push(newBlock) } return { 'type': RESPONSE_BLOCKCHAIN, ‘data':[latestBlock()]} } } latestBlock () {return last(this.blockchain)}; };
  • 54. NEW BLOCK HANDLING const handleBlockchainResponse = (message) => { const receivedBlocks = message; if (last(receivedBlocks).index > chain.latestBlock().index) { if (last(receivedBlocks).previousHash === chain.latestBlock().hash) { chain.add(latestBlockReceived); return {'type': RESPONSE_BLOCKCHAIN, ‘data':[chain.latestBlock()]} } return {'type': EXCHANGE_CHAINS}; } };
  • 55. NEW BLOCK HANDLING const handleBlockchainResponse = (message) => { const receivedBlocks = message; if (last(receivedBlocks).index > chain.latestBlock().index) { if (last(receivedBlocks).previousHash === chain.latestBlock().hash) { chain.add(latestBlockReceived); return {'type': RESPONSE_BLOCKCHAIN, ‘data':[chain.latestBlock()]} } return {'type': EXCHANGE_CHAINS}; } };
  • 56. NEW BLOCK HANDLING const handleBlockchainResponse = (message) => { const receivedBlocks = message; if (last(receivedBlocks).index > chain.latestBlock().index) { if (last(receivedBlocks).previousHash === chain.latestBlock().hash) { chain.add(latestBlockReceived); return {'type': RESPONSE_BLOCKCHAIN, ‘data':[chain.latestBlock()]} } return {'type': EXCHANGE_CHAINS}; } };
  • 57. NEW BLOCK HANDLING const handleBlockchainResponse = (message) => { const receivedBlocks = message; if (last(receivedBlocks).index > chain.latestBlock().index) { if (last(receivedBlocks).previousHash === chain.latestBlock().hash) { chain.add(latestBlockReceived); return {'type': RESPONSE_BLOCKCHAIN, ‘data':[chain.latestBlock()]} } return {'type': EXCHANGE_CHAINS}; } };
  • 60. REPLACING CHAIN const replaceChain = (newChain) => { if (newChain.isValidChain() && newChain.size() > this.chain.size()){ this.chain = newBlockchain; return { 'type': RESPONSE_BLOCKCHAIN, ‘data':[chain.latestBlock()]} } };
  • 61. REPLACING CHAIN const replaceChain = (newChain) => { if (newChain.isValidChain() && newChain.size() > this.chain.size()){ this.chain = newBlockchain; return { ‘type': RESPONSE_BLOCKCHAIN, ‘data’: [chain.latestBlock()]} } };
  • 62. REPLACING CHAIN const replaceChain = (newChain) => { if (newChain.isValidChain() && newChain.size() > this.chain.size()){ this.chain = newBlockchain; return { 'type': RESPONSE_BLOCKCHAIN, ‘data':[chain.latestBlock()]} } };
  • 63. VALIDATING CHAIN isValidChain () { if (!isEqual(this.genesisBlock(), GenesisBlock())) { return false; } for (let i = 1; i < this.size(); i++) { if (!isValidNewBlock(this.get(i), this.get[i - 1])) { return false; } } return true; };
  • 64. VALIDATING CHAIN isValidChain () { if (!isEqual(this.genesisBlock(), GenesisBlock())) { return false; } for (let i = 1; i < this.size(); i++) { if (!isValidNewBlock(this.get(i), this.get[i - 1])) { return false; } } return true; };
  • 65. VALIDATING CHAIN isValidChain () { if (!isEqual(this.genesisBlock(), GenesisBlock())) { return false; } for (let i = 1; i < this.size(); i++) { if (!isValidNewBlock(this.get(i), this.get[i - 1])) { return false; } } return true; };
  • 66. REPLACING CHAIN const replaceChain = (newChain) => { if (newChain.isValidChain() && newChain.size() > this.chain.size()){ this.chain = newBlockchain; return { 'type': RESPONSE_BLOCKCHAIN, ‘data':[chain.latestBlock()]} } };
  • 70. PROOF-OF-WORK const calculateHash = (index, prevHash, data) => { let nonce = 0; while(true){ nonce++; seed = `${index} ${prevHash} ${data} ${nonce}` const value = CryptoJS.SHA256(seed) if (startsWith(value, "000000")) { return value; } } };
  • 71. PROOF-OF-WORK const calculateHash = (index, prevHash, data) => { let nonce = 0; while(true){ nonce++; seed = `${index} ${prevHash} ${data} ${nonce}` const value = CryptoJS.SHA256(seed) if (startsWith(value, "000000")) { return value; } } };
  • 72. PROOF-OF-WORK const calculateHash = (index, prevHash, data) => { let nonce = 0; while(true){ nonce++; seed = `${index} ${prevHash} ${data} ${nonce}` const value = CryptoJS.SHA256(seed) if (startsWith(value, "000000")) { return value; } } };
  • 73. PROOF-OF-WORK const calculateHash = (index, prevHash, data) => { let nonce = 0; while(true){ nonce++; seed = `${index} ${prevHash} ${data} ${nonce}` const value = CryptoJS.SHA256(seed) if (startsWith(value, "000000")) { return value; } } };
  • 74. PROOF-OF-WORK const calculateHash = (index, prevHash, data) => { let nonce = 0; while(true){ nonce++; seed = `${index} ${prevHash} ${data} ${nonce}` const value = CryptoJS.SHA256(seed) if (startsWith(value, "000000")) { return value; } } };
  • 75. PROOF-OF-WORK const calculateHash = (index, prevHash, data) => { let nonce = 0; while(true){ nonce++; seed = `${index} ${prevHash} ${data} ${nonce}` const value = CryptoJS.SHA256(seed) if (startsWith(value, "000000")) { return value; } } };
  • 76. PROOF-OF-WORK const calculateHash = (index, prevHash, data) => { let nonce = 0; while(true){ nonce++; seed = `${index} ${prevHash} ${data} ${nonce}` const value = CryptoJS.SHA256(seed) if (startsWith(value, "000000")) { return value; } } };
  • 77. PROOF-OF-WORK const calculateHash = (index, prevHash, data) => { let nonce = 0; while(true){ nonce++; seed = `${index} ${prevHash} ${data} ${nonce}` const value = CryptoJS.SHA256(seed) if (startsWith(value, "000000")) { return value; } } };
  • 79. TEXT I HAVE HASH! 000004CEEF5782B82C212CE725F15594! 00000ee187308970bb63446f3f910e98000004ceef5782b82c212ce725f15594
  • 80. 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
  • 81. ▸ = 50% OF WHOLE NETWORK
  • 82. TEXT BLOCKCHAIN Hash #1
 Prev #2 Hash #2
 Prev #3 Hash #0
 Prev #1 Hash #0 $ $ $
  • 92. TEXT SMART CONTRACTS INITIAL COIN OFFERINGS SOFT & HARD FORKS
  • 94. TEXT
  • 95. THANK YOU AND WAITING FOR QUESTIONS @ArturSkowronski arturskowronski.com