Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
Rikard Hjort, 24 maj 2019
Blockkedjor
en introduktion för datavetare
Rikard Hjort, 24 maj 2019
Vem är jag?
Rikard Hjort, 24 maj 2019
Varför ska ni lära er om blockkedjor?
Rikard Hjort, 24 maj 2019
Rikard Hjort, 24 maj 2019
Alla ska gå härifrån och kunna ...
❏ … förklara Bitcoin är uppbyggt❏ … bygga en egen blockkedja ❏ … läsa på själva om blockkedjeprojekt
Rikard Hjort, 24 maj 2019
Rikard Hjort, 24 maj 2019
Vad är en blockkedja?
"A persistent, transparent, public, append-only ledger."
-- Finn Brunton
En serie händelser, i tidsordning, som alla kan enas om är den riktiga utan att någon central auktoritet bestämmer.
Konsensus genom algoritmer, inte genom tilltro till andra i nätverket.
Rikard Hjort, 24 maj 2019
Varför Bitcoin?
0
Rikard Hjort, 24 maj 2019
Vad vill vi göra?
Rikard Hjort, 24 maj 2019
Vad är problemet?To Roger,I give this Bitcoin.
Signed, 2019-05-24
Satoshi
Roger
To Vitalik,I give this Bitcoin.
Signed, 2019-05-25
Satoshi
Vitalik
Hur vet Vitalik att Satoshi inte redan gett bort myntet?
Hur ska vi andra veta vem som är myntets rättmätige ägare?
Satoshi
Rikard Hjort, 24 maj 2019
Vad ska vi gå igenom?
Preliminaries
❏ Kryptografiskt säkra hashar❏ Timestamp server❏ Merkle-träd❏ Proof-of-work
Övriga (i mån av tid)
❏ Transaction splitting och combining❏ Hard fork❏ Andra förslag?
Rikard Hjort, 24 maj 2019
Rikard Hjort, 24 maj 2019
S H ASecure Hash Algorithm
SHA Merkle-trädTimestamp
serverProof-of-work Bitcoin
Timestamp server
Merkle-träd
"one-way hash functions are the workhorses of modern cryptography"-- Bruce Schneier
Rikard Hjort, 24 maj 2019 SHA Proof-of-work BitcoinTimestamp
serverMerkle-träd
Rikard Hjort, 24 maj 2019
Hashing-algoritmer
Algoritm H, range = N
Input: godtyckliga bitar, {0,1}*Output: tal i {0, 1, …, N-1}, {0,1}log N
Egenskaper:
❏ Deterministisk❏ "Bra" om den är uniform, d.v.s.
Prob(H(x)) ≈ Prob(H(x) ≈ … ≈ 1/N
SHA S, range N, t.ex. N=2256
En hashing-algoritm med två extra egenskaper:
❏ Givet S(x) kan du inte gissa x, på annat sätt än att testa olika värden
❏ En liten ändring av input ger en kraftig ändring i output.
SHA Proof-of-work BitcoinTimestamp
serverMerkle-träd
Rikard Hjort, 24 maj 2019
SHA-256
SHA Proof-of-work BitcoinTimestamp
serverMerkle-träd
Rikard Hjort, 24 maj 2019 SHA Proof-of-work BitcoinTimestamp
serverMerkle-träd
Rikard Hjort, 24 maj 2019
Hur stort är 2256?Hur länge behöver jag leta efter en kollision?
SHA Proof-of-work BitcoinTimestamp
serverMerkle-träd
Rikard Hjort, 24 maj 2019
Förklaring av hur stort 52! är
SHA Proof-of-work BitcoinTimestamp
serverMerkle-träd
Rikard Hjort, 24 maj 2019
52! = 8.1*1067
2256 = 1.2*1077
SHA Proof-of-work BitcoinTimestamp
serverMerkle-träd
Rikard Hjort, 24 maj 2019
Timestamp server
SHATimestamp
serverMerkle-träd Proof-of-work Bitcoin
Rikard Hjort, 24 maj 2019 SHATimestamp
serverMerkle-träd Proof-of-work Bitcoin
Rikard Hjort, 24 maj 2019
Problem
Jag är en forskare som genererar data från mätningar, som jag delar med kollegor. Jag är rädd att den ska läcka ut innan jag publicerat den, eller bli stulen. Jag genererar nya dataset då och då.
Om någon stjäl min data och publicerar mina resultat i deras namn vill jag kunna bevisa det.
Men jag vill hålla datan hemlig tills vidare.
Jag vill kunna bevisa i framtiden att jag haft en viss data sedan en viss tidpunkt …
… men jag vill inte avslöja vad det är för data just nu.
SHATimestamp
serverMerkle-träd Proof-of-work Bitcoin
Rikard Hjort, 24 maj 2019 SHATimestamp
serverMerkle-träd Proof-of-work Bitcoin
Rikard Hjort, 24 maj 2019
Merkle-träd
SHA Merkle-trädTimestamp
serverProof-of-work Bitcoin
Timestamp server
Merkle-träd
Rikard Hjort, 24 maj 2019
Vad är problemet med en timestamp server?
Rikard Hjort, 24 maj 2019 SHA Proof-of-work BitcoinTimestamp
serverMerkle-träd
Rikard Hjort, 24 maj 2019
P O WProof-of-work
SHA Merkle-trädTimestamp
serverProof-of-work Bitcoin
Timestamp server
Merkle-träd
Rikard Hjort, 24 maj 2019
ddddHej Erland,
Jag skulle vilja ….
hash(email)
nonce = 0
hash(emailHash + nonce)
Ok?
nonce++
No
Yes
send email + nonce
BigInt emailHash := hash(email)int nonce = 0BigInt hash;do {
hash = hash(emailHash + nonce)} while (hash % 100000 != 0);
SHA Proof-of-work BitcoinTimestamp
serverMerkle-träd
Rikard Hjort, 24 maj 2019
Bitcoin
SHA Merkle-trädTimestamp
serverProof-of-work Bitcoin
Timestamp server
Merkle-träd
"Vires in numeris"
(Latin: Strength in numbers)
Rikard Hjort, 24 maj 2019
Påminnelse: Vad vill vi göra?
Rikard Hjort, 24 maj 2019
Påminnelse: Vad vill vi göra?Roger
Vitalik
Satoshi
Rikard Hjort, 24 maj 2019
Rikard Hjort, 24 maj 2019
Timestamp server + Merkle-träd +Proof of work⇒ Bitcoin
Rikard Hjort, 24 maj 2019
Rikard Hjort, 24 maj 2019
Mining
Det är i snitt 10 minuter mellan varje nytt block.
Om det skapas för många block för fort, ökar svårighetsgraden (måste börja med fler 0:or)
Den som lyckas skapa ett block får
❏ Transaktionsavgiften för varje transaktion i blocket (frivillig)❏ 12.5 Bitcoin
Rikard Hjort, 24 maj 2019
Field Size Description Data type Comments
4 version int32_t Block version information (note, this is signed)
32 prev_block char[32] The hash value of the previous block this particular block references
32 merkle_root
char[32] The reference to a Merkle tree collection which is a hash of all transactions related to this block
4 timestamp uint32_t A timestamp recording when this block was created (Will overflow in 2106[2])
4 bits uint32_t The calculated difficulty target being used for this block
4 nonce uint32_t The nonce used to generate this block… to allow variations of the header and compute different hashes
1 txn_count var_int Number of transaction entries, this value is always 0
Rikard Hjort, 24 maj 2019
Rikard Hjort, 24 maj 2019
Vad krävs för att någon ska kunna modifiera en gammal transaktion?
Rikard Hjort, 24 maj 2019
Alla ska gå härifrån och kunna ...
❏ … förklara Bitcoin är uppbyggt❏ … bygga en egen blockkedja ❏ … läsa på själva om blockkedjeprojekt
Rikard Hjort, 24 maj 2019
❏ Transaction splitting/combining
❏ Hard fork❏ Annat?
Rikard Hjort, 24 maj 2019
Övningar- Implementera, med träd eller fält som underliggande struktur, ett merkle-träd med följande metoder (det går bra att använda inbyggda hashfunktioner i Java för ändamålet):
● void insert(Object data)● int getTopHash()● boolean verify() // Kollar att alla
hashar stämmer överens med datan.● List<Object> getData() // Hämtar alla
data-objekt
Implementera en enkel blockkedja som en länkad lista. Vid insert behöver proof-of-work utföras, med en förutbestämd svårighetsgrad. Bra att ha:
● class Block med instansvariabler för previous hash, data, merkleRoot, nonce.
● Metoden: makeBlock(MerkleTree dataTree) // Baseras på senaste blocket i kedjan, utför proof-of-work.
● Metoden: boolean appendBlock(Block) // returnerar false om verifieringen inte gick igenom, returnerar annars true och lägger till blocket i kedjan.