-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathBlockchain.py
More file actions
129 lines (81 loc) · 2.81 KB
/
Blockchain.py
File metadata and controls
129 lines (81 loc) · 2.81 KB
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#!/usr/bin/env python
# coding: utf-8
# In[1]:
from hashlib import sha256
from time import time
import json
class Block:
def __init__(self, index, previousHash, transactions, timestamp=time() ):
self.index = index
self.previousHash = previousHash
self.transactions = transactions
self.timestamp = timestamp
self.proof = 0
def __repr__(self):
return 'Index: {}, previous Hash: {}, Transactions: {} '.format(self.index,
self.previousHash,
self.transactions)
def hashBlock(self):
blockToHash = json.dumps(self.__dict__, sort_keys=True)
return( sha256(blockToHash.encode()).hexdigest())
class Blockchain:
def __init__(self):
# genesisBlock = Block(0, '', [], 1, 0)
self.chain = []
self.unconfirmedTransaction = []
self.countIndex = 0
def createGenesisBlock(self):
genesisBlock = {
'index': 0,
'previousHash': '0',
'transactions': []
}
genesisBlock = Block(genesisBlock['index'], genesisBlock['previousHash'], genesisBlock['transactions'])
genesisBlock.hash = genesisBlock.hashBlock()
self.chain.append(genesisBlock)
def addTx(self, sender, receiver, amount):
tx = {
'sender': sender,
'receiver': receiver,
'amount': amount
}
self.unconfirmedTransaction.append(tx)
def addBlock(self, block):
previousHash = self.getLastBlockchainValue.hash
if previousHash != block.previousHash:
return False
block.hash = block.hashBlock()
self.chain.append(block)
return True
def mining(self):
lastBlock = self.getLastBlockchainValue
block = {
'index': lastBlock.index + 1,
'previousHash': lastBlock.hash,
'transactions': self.unconfirmedTransaction
}
newBlock = Block(block['index'], block['previousHash'], block['transactions'])
self.addBlock(newBlock)
self.unconfirmedTransaction = []
return newBlock.index
@property
def getLastBlockchainValue(self):
if len(self.chain) < 1:
return None
return(self.chain[-1])
# In[2]:
block = Blockchain()
# In[3]:
block.createGenesisBlock()
# In[4]:
block.addTx("ibrahim", "John", 3)
# In[5]:
block.unconfirmedTransaction
# In[6]:
block.mining()
# In[7]:
block.addTx("Ahmed", "Alice", 5)
block.unconfirmedTransaction
# In[8]:
for i in (block.chain):
print (' Transaction: ', i.index, i.transactions, i.previousHash, i.hash)