Skip to content

Commit 823d8bf

Browse files
verification of the signature when a transaction is being submitted, UI JS code for blockchain_client
1 parent 597ccbc commit 823d8bf

File tree

3 files changed

+67
-9
lines changed

3 files changed

+67
-9
lines changed

blockchain/blockchain.py

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
1+
from Crypto.Hash import SHA
2+
from Crypto.PublicKey import RSA
13
from flask import Flask, render_template, jsonify, request
24
from time import time
35
from flask_cors import CORS
46
from collections import OrderedDict
7+
import binascii
8+
from Crypto.Signature import PKCS1_v1_5
9+
10+
MINING_SENDER = "blockchain"
511

612

713
class Blockchain:
@@ -26,22 +32,36 @@ def create_block(self, nonce, previous_hash):
2632
self.transactions = []
2733
self.chain.append(block)
2834

29-
def submit_transaction(self, sender_public_key, recipient_public_key, signature, amount):
30-
# TODO: reward miner
31-
# TODO: Signature validation
35+
def verify_transaction_signature(self, sender_public_key, signature, transaction):
36+
public_key = RSA.importKey(binascii.unhexlify(sender_public_key))
37+
verifier = PKCS1_v1_5.new(public_key)
38+
hash = SHA.new(str(transaction).encode('utf8'))
39+
try:
40+
verifier.verify(hash, binascii.unhexlify(signature))
41+
return True
42+
except ValueError:
43+
return False
3244

45+
def submit_transaction(self, sender_public_key, recipient_public_key, signature, amount):
46+
# Signature validation
3347
transaction = OrderedDict({
3448
'sender_public_key': sender_public_key,
3549
'recipient_public_key': recipient_public_key,
36-
'signature': signature,
3750
'amount': amount,
3851
})
39-
signature_verification = True
40-
if signature_verification:
52+
53+
# reward for miner
54+
if sender_public_key == MINING_SENDER:
4155
self.transactions.append(transaction)
4256
return len(self.chain) + 1
4357
else:
44-
return False
58+
# Transaction from wallet to another wallet
59+
signature_verification = self.verify_transaction_signature(sender_public_key, signature, transaction)
60+
if signature_verification:
61+
self.transactions.append(transaction)
62+
return len(self.chain) + 1
63+
else:
64+
return False
4565

4666

4767
blockchain = Blockchain()
@@ -60,7 +80,12 @@ def index():
6080
def transactions_new():
6181
values = request.form
6282

63-
# TODO: check required fields
83+
# check required fields [Notes: This is just a demo, not production code, so not checking thoroughly, just doing
84+
# basic checks]
85+
required = ['confirmation_sender_public_key', 'confirmation_recipient_public_key', 'transaction_signature', 'confirmation_amount']
86+
if not all(k in values for k in required):
87+
return 'Missing Values', 400
88+
6489
transaction_results = blockchain.submit_transaction(values['confirmation_sender_public_key'],
6590
values['confirmation_recipient_public_key'],
6691
values['transaction_signature'], values['confirmation_amount'])

blockchain_client/blockchain_client.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ def __init__(self, sender_public_key, sender_private_key, recipient_public_key,
1818
def to_dict(self):
1919
return OrderedDict({
2020
'sender_public_key': self.sender_public_key,
21-
'sender_private_key': self.sender_private_key,
2221
'recipient_public_key': self.recipient_public_key,
2322
'amount': self.amount,
2423
})
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<!doctype html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<meta name="viewport"
6+
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
7+
<meta http-equiv="X-UA-Compatible" content="ie=edge">
8+
<title>Blockchain Front</title>
9+
<link rel="stylesheet" href="static/vendor/bootstrap/css/bootstrap.min.css">
10+
<link rel="stylesheet" href="/static/vendor/DataTables/css/datatables.min.css">
11+
<link rel="stylesheet" href="/static/vendor/font-awesome/font-awesome.min.css">
12+
<link rel="stylesheet" href="/static/css/custom.css">
13+
14+
</head>
15+
<body style="background: linear-gradient(110deg, #fdcd3b 60%, #ffed4b 60%);">
16+
<nav class="navbar navbar-expand-lg navbar-dark bg-dark fixed-top">
17+
<div class="container">
18+
<a href="#" class="navbar-brand">Blockchain Client</a>
19+
20+
<div class="collapse navbar-collapse">
21+
<ul class="navbar-nav ml-auto">
22+
<li class="nav-item">
23+
<a href="/" class="nav-link">Wallet Generator</a>
24+
</li>
25+
<li class="nav-item active">
26+
<a href="/make_transaction" class="nav-link">Make Transaction</a>
27+
</li>
28+
<li class="nav-item">
29+
<a href="/view_transactions" class="nav-link">View transactions</a>
30+
</li>
31+
</ul>
32+
</div>
33+
</div>
34+
</nav>

0 commit comments

Comments
 (0)