-
Notifications
You must be signed in to change notification settings - Fork 1
/
caffecoin.py
99 lines (75 loc) · 2.65 KB
/
caffecoin.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import hashlib as hasher
import datetime as date
from warnings import warn
#########################################################################################
#
# Class & Method Definition
#
class Block:
def __init__(self, index, timestamp, data, previous_hash):
self.index = index
self.timestamp = timestamp
self.data = data
self.previous_hash = previous_hash
self.hash = self.hash_block()
def __repr__(self):
return "%04d: %s, %s : %s" % (self.index,str(self.timestamp),str(self.data),str(self.previous_hash))
def hash_block(self):
sha = hasher.sha256()
sha.update(repr(self).encode('ascii'))
return sha.hexdigest()
# Generate genesis block
def create_genesis_block():
# Manually construct a block with
# index zero and arbitrary previous hash
return Block(0, date.datetime.now(), "Genesis Block", "0")
# Generate all later blocks in the blockchain
def next_block(last_block):
this_index = last_block.index + 1
this_timestamp = date.datetime.now()
this_data = "Hey! I'm block " + str(this_index)
this_hash = last_block.hash
return Block(this_index, this_timestamp, this_data, this_hash)
def validate_blockchain(in_blockchain):
for current_position in range(1, len(in_blockchain)):
previous_position = current_position - 1
if in_blockchain[previous_position].hash_block() == in_blockchain[current_position].previous_hash:
print('Block %d is valid' % current_position)
else:
warn('Block %d is invalid! (%s)' % (current_position, repr(in_blockchain[current_position])))
break
#########################################################################################
#
# Let's Play !!
#
# Create the blockchain and add the genesis block
blockchain = [create_genesis_block()]
previous_block = blockchain[0]
# Show the blockchain
blockchain
# Add blocks to the chain
for i in range(0, 20):
block_to_add = next_block(previous_block)
blockchain.append(block_to_add)
previous_block = block_to_add
# Tell everyone about it!
print("Block #{} has been added to the blockchain!".format(block_to_add.index))
print("Hash: {}\n".format(block_to_add.hash))
# Show the blockchain
blockchain
# Validate all
validate_blockchain(blockchain)
#########################################################################################
#
# Let's Break it !!
#
# Data Thanpering test
old_block_10_data = blockchain[10].data
new_block_10_data = "Hey I'm an invalid data"
blockchain[10].data = new_block_10_data
validate_blockchain(blockchain)
# replace the original, so we can try something else
blockchain[10].data = old_block_10_data
# Data Deletion test
del blockchain[5]
validate_blockchain(blockchain)