Skip to content
Snippets Groups Projects
Commit 42421cc5 authored by Prajczer Péter's avatar Prajczer Péter
Browse files

added part 2 of ITKoin

parent 8e7e6e4f
Branches
No related tags found
No related merge requests found
/.idea/
*.pem
*.xml
/machvenv
......@@ -21,7 +21,10 @@ class ITKoin:
# self.my_privatekey
# self.my_publickey
# self.my_id
self.ITKoin_users = ['csmkey_03_id.txt', 'csmkey_04_id.txt'] # Ez egy lista, ahová s résztvevők id-jait tartalmazó file-neveket kell felsorolni
# Ez egy lista, ahová s résztvevők id-jait tartalmazó file-neveket kell felsorolni
# mindegyikben benne van a publikus kulcs lenyomata, ezek az egyenek
self.ITKoin_users = ['csmkey_03_id.txt', 'csmkey_04_id.txt']
self.initial_csaposhi_offering = 100
......@@ -86,10 +89,10 @@ class ITKoin:
signatureobject = pkcs1_15.new(self.my_privatekey) # hozz létre egy signature objektumot
hashobject = self.create_hashobject(data) # az adatot töltsd be egy hash objektumba a create_hashobject(data) használatával
signaturevalue = signatureobject.sign(hashobject) # készítsd el az aláírás értéket a sign függvénnyel
print(signaturevalue)
# print(signaturevalue)
b64signaturevalue = b64encode(signaturevalue) # kódold base64 kódolással
print(b64signaturevalue)
print(b64signaturevalue.decode())
# print(b64signaturevalue)
# print(b64signaturevalue.decode())
return b64signaturevalue.decode()
def verify_signature(self, data, b64signaturevalue, rsapublickey):
......@@ -107,16 +110,21 @@ class ITKoin:
f.close()
return
# ide kell majd irni a hazit, hogy ellenorizuk a betoltott chaint
def load_chain(self):
fileobject = open(self.chain_filename, 'rb')
self.chain = pickle.load(fileobject)
print("\n BETOLTOTT CHAIN \n")
pprint(self.chain)
return
# itt kell ellenorzini, hogy az ossze tranzakcio valid, es a blokkba bekerulhet
def load_pending_transactions(self):
fileobject = open(self.pending_transactions_filename, 'rb')
self.pending_transactions = pickle.load(fileobject)
print("\n BETOLTOTT PENDING TRANSACTIONS \n")
pprint(self.pending_transactions)
# a validated_pending_transactionskell majd belerakni
validated_pending_transactions = []
while len(self.pending_transactions) != 0:
transaction = self.pending_transactions.pop()
......@@ -125,6 +133,8 @@ class ITKoin:
self.pending_transactions = validated_pending_transactions
return
# itt azokat szedjuk ki amelyik szerepel mint bevetel, minden tranzkcion ami a mi ID/nk van,
# tipikusank minden outputban 2 van
def find_unspent_outputs(self):
self.unspent_outputs = []
self.my_unspent_outputs = []
......@@ -140,15 +150,18 @@ class ITKoin:
if output['recipient'] == self.my_id:
self.my_unspent_outputs.append([transaction['txid'], transaction['outputs'].index(output), output['csaposhi']])
for input in transaction['inputs']:
self.unspent_outputs.remove(input) # minden input biztosan szerepelt a lánc korábbi outputjaként
if input in self.my_unspent_outputs: # a remove() hibát dob, ha úgy törlünk a listából valamit, hogy nem is volt benne
self.my_unspent_outputs.remove(input)
self.unspent_outputs.remove(input[0:3]) # minden input biztosan szerepelt a lánc korábbi outputjaként
if input[0:3] in self.my_unspent_outputs: # a remove() hibát dob, ha úgy törlünk a listából valamit, hogy nem is volt benne
self.my_unspent_outputs.remove(input[0:3])
print("\n EL NEM KOLTOTT KIMENETEK \n")
pprint(self.unspent_outputs)
print("\n EN EL NEM KOLTOTT KIMENETEIM")
pprint(self.my_unspent_outputs)
return
def mine(self):
if len(self.chain) == 0:
# legelso blocknak mindig ez lesz az eleje, ez jelzi, hogy az elso: ide lehet ellenorizni, hogy nehogy ilyen legyen a hash lenyomata az uj blokknak
previous_block_header_hash = 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'
else:
previous_block = self.chain[-1]
......@@ -162,6 +175,7 @@ class ITKoin:
'previous_block_header_hash': previous_block_header_hash,
'transactions_hash' : self.create_hashhexvalue(self.pending_transactions),
}
# ez itt a konkret banyaszas, keressuk a jo lenyomatot
while True:
block_header_hash = self.create_hashhexvalue(block_header)
if block_header_hash[:4] == "0000":
......@@ -172,9 +186,11 @@ class ITKoin:
'block_header': block_header,
'transactions': self.pending_transactions
}
print("\n blokkunk: \n")
pprint(block)
self.chain.append(block)
print("\n chain: \n")
pprint (self.chain)
self.save_list(self.chain, self.chain_filename)
self.pending_transactions = []
......@@ -185,7 +201,8 @@ class ITKoin:
self.pending_transactions = []
while len(self.ITKoin_users) > 0:
recipient_id = self.load_id (self.ITKoin_users.pop()) # előveszi a következő id file nevét és beolvassa az id-t
for tr in self.pending_transactions: # nem szerepelhet kétszer ugyanaz a recipient, mert akkor a txid azonos lesz
# csaposhi meg a recipientbol generaljuk a tranzakcio ID-t!!
for tr in self.pending_transactions: # nem szerepelhet kétszer ugyanaz a recipient, mert akkor a tranzakcio azonos lesz
for op in tr['outputs']:
if recipient_id == op['recipient']:
pprint ('HIBA: Ismétlődő recipient adatok az első blokk generálásakor.')
......@@ -198,6 +215,7 @@ class ITKoin:
'outputs': outputs}
transaction ['txid'] = self.create_hashhexvalue(transaction) # a tranzakció lenyomata lesz az azonosítója egyben
self.pending_transactions.append(transaction)
print("\n PENDING TRANSACTIONS \n")
pprint(self.pending_transactions)
self.mine()
return
......@@ -207,16 +225,18 @@ class ITKoin:
used_outputs=[]
while (sum < csaposhi):
next_output=self.my_unspent_outputs.pop()
pprint(next_output)
# pprint(next_output)
used_outputs.append(next_output)
pprint(next_output)
# pprint(next_output)
sum += next_output[2] # ebben a listapozícióban van a hivatkozott outputban kapott összeg
print("\n TELJES OSSZEG \n")
pprint(sum)
inputs = used_outputs
pprint(inputs)
for input in inputs: # az inputsban szándékosan nincs benne az akkori recipient, mert ezt abból a tranzakcióból kell kivenni és ellenőrizni
input.append(self.create_signature(input[0])) # input[3] az aláírás érték base64 kódolással
input.append(self.my_publickey.export_key().decode('ascii')) # input[4] a publikus kulcsom PEM formátumban
print("\n SIGNATURE ELLENORZES \n")
pprint(self.verify_signature(input[0], input[3], RSA.import_key(input[4])))
outputs = [{
'csaposhi': csaposhi,
......@@ -230,22 +250,25 @@ class ITKoin:
'outputs': outputs}
transaction ['txid'] = self.create_hashhexvalue(transaction) # a tranzakció lenyomata lesz az azonosítója egyben
self.pending_transactions.append(transaction)
print("\n PENDING TRANSACTIONS \n")
pprint(self.pending_transactions)
return
if __name__ == '__main__':
mycoin=ITKoin()
# mycoin.generate_rsa_key('csmkey_03')
# mycoin.generate_rsa_key('csmkey_04')
# mycoin.generate_first_block()
mycoin.load_my_private_key()
mycoin.load_chain()
mycoin.find_unspent_outputs()
mycoin.new_transaction(20, 'e64bcaefab6b9e1a88447f399d35959a3f0015e2cf48a9ebb866bfe368d3e55c')
mycoin.mine()
# signature = mycoin.create_signature(2)
# pprint(signature)
# pprint(mycoin.my_publickey)
# print(mycoin.verify_signature(2, signature, mycoin.my_publickey))
mycoin=ITKoin()
# mycoin.generate_rsa_key('csmkey_04')
mycoin.generate_first_block()
mycoin.load_my_private_key()
mycoin.load_chain()
mycoin.find_unspent_outputs()
mycoin.new_transaction(20, 'c5425eda6099b4f481357fb12d17cda62e6f391ac49c83e9d465128dc47109b0')
#signature = mycoin.create_signature(2)
#pprint(signature)
#pprint(mycoin.my_publickey)
#print(mycoin.verify_signature(2, signature, mycoin.my_publickey))
mycoin.mine()
mycoin.mine()
File added
028f631b828c8c5c83f80cd8a195b6dd2e129fd5ff5c6a7f511060aa7e7ff1b0
\ No newline at end of file
e64bcaefab6b9e1a88447f399d35959a3f0015e2cf48a9ebb866bfe368d3e55c
\ No newline at end of file
File added
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment