Skip to content

Commit c68ad6e

Browse files
successfully genrating transactions, signature using RSA, SHA and binascii, able to make a transaction and generate signature
1 parent 49bfb9f commit c68ad6e

File tree

2 files changed

+160
-3
lines changed

2 files changed

+160
-3
lines changed

blockchain_client/blockchain_client.py

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,36 @@
11
import Crypto
22
import Crypto.Random
3-
from flask import Flask, render_template, jsonify
3+
from Crypto.Hash import SHA
4+
from flask import Flask, render_template, jsonify, request
45
from Crypto.PublicKey import RSA
56
import binascii
7+
from collections import OrderedDict
8+
from Crypto.Signature import PKCS1_v1_5
9+
610

711
class Transaction:
8-
def __init__(self, sender_address, sender_private_key, recipient_address, value):
9-
self.sender_address = sender_address
12+
def __init__(self, sender_public_key, sender_private_key, recipient_address, value):
13+
self.sender_public_key = sender_public_key
1014
self.sender_private_key = sender_private_key
1115
self.recipient_address = recipient_address
1216
self.value = value
1317

18+
def to_dict(self):
19+
return OrderedDict({
20+
'sender_public_key': self.sender_public_key,
21+
'sender_private_key': self.sender_private_key,
22+
'recipient_address': self.recipient_address,
23+
'value': self.value,
24+
})
25+
26+
def sign_transaction(self):
27+
private_key = RSA.importKey(binascii.unhexlify(self.sender_private_key))
28+
signer = PKCS1_v1_5.new(private_key)
29+
hash = SHA.new(str(self.to_dict()).encode('utf8'))
30+
return binascii.hexlify(signer.sign(hash)).decode('ascii')
31+
1432

33+
# ======================================================================================================================
1534
app = Flask(__name__)
1635

1736

@@ -25,6 +44,23 @@ def make_transaction():
2544
return render_template('./make_transaction.html')
2645

2746

47+
@app.route("/generate_transaction", methods=['POST'])
48+
def generate_transaction():
49+
sender_public_key = request.form['sender_public_key']
50+
sender_private_key = request.form['sender_private_key']
51+
recipient_public_key = request.form['recipient_public_key']
52+
amount = request.form['amount']
53+
54+
transaction = Transaction(sender_public_key, sender_private_key, recipient_public_key, amount)
55+
56+
response = {
57+
'transaction': transaction.to_dict(),
58+
'signature': transaction.sign_transaction(),
59+
60+
}
61+
return jsonify(response), 200
62+
63+
2864
@app.route("/view_transactions")
2965
def view_transactions():
3066
return render_template('./view_transactions.html')
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
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>
35+
36+
<div class="container">
37+
<div class="row">
38+
<div class="col-lg-12 text-center">
39+
<div class="card-body">
40+
<h4 class="card-title">Send Coins:</h4>
41+
<p class="card-text">Enter transaction details and click on "Generate Transaction" button to generate your transaction</p>
42+
</div>
43+
</div>
44+
</div>
45+
</div>
46+
47+
48+
<div class="container alert alert-secondary">
49+
<form id="transaction_form">
50+
<div class="row">
51+
<label class="col-sm-2">Sender Public Key:</label>
52+
<div class="col-sm-10">
53+
<input type="text" name="sender_public_key" id="sender_public_key" class="form-control">
54+
</div>
55+
</div>
56+
57+
<br>
58+
59+
<div class="row">
60+
<label class="col-sm-2">Sender Private Key:</label>
61+
<div class="col-sm-10">
62+
<input type="text" name="sender_private_key" id="sender_private_key" class="form-control">
63+
</div>
64+
</div>
65+
66+
<br>
67+
68+
<div class="row">
69+
<label class="col-sm-2">Recipient Public Key:</label>
70+
<div class="col-sm-10">
71+
<input type="text" name="recipient_public_key" id="recipient_public_key" class="form-control">
72+
</div>
73+
</div>
74+
75+
<br>
76+
77+
<div class="row">
78+
<label class="col-sm-2">Amount:</label>
79+
<div class="col-sm-10">
80+
<input type="text" name="amount" id="amount" class="form-control">
81+
</div>
82+
</div>
83+
84+
<br>
85+
86+
<div class="row">
87+
<div class="col-sm-12 text-center">
88+
<input type="button" name="generate_transaction" id="generate_transaction" class="btn btn-primary btn-lg" value="Generate Transaction">
89+
</div>
90+
</div>
91+
92+
</form>
93+
94+
95+
</div>
96+
97+
98+
<script src="/static/vendor/jquery/jquery.min.js"></script>
99+
<script src="/static/vendor/DataTables/js/datatables.min.js"></script>
100+
<script src="/static/vendor/bootstrap/js/bootstrap.bundle.js"></script>
101+
<script src="/static/vendor/DataTables/js/ellipsis.js"></script>
102+
<script>
103+
$(function() {
104+
$("#generate_transaction").click(function() {
105+
$.ajax({
106+
url: "/generate_transaction",
107+
type: "POST",
108+
dataType: 'json',
109+
data: $('#transaction_form').serialize(),
110+
success: function(response) {
111+
console.log(response);
112+
},
113+
error: function(error) {
114+
console.log(error);
115+
}
116+
});
117+
});
118+
});
119+
</script>
120+
</body>
121+
</html>

0 commit comments

Comments
 (0)