-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathserver.rb
More file actions
123 lines (95 loc) · 2.99 KB
/
Copy pathserver.rb
File metadata and controls
123 lines (95 loc) · 2.99 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
require './blockchain'
require 'sinatra'
require 'json'
require './json_ext'
require 'securerandom'
blockchain = Blockchain.new
node_identifier = SecureRandom.uuid.gsub('-', '')
get '/mine' do
last_block = blockchain.last_block
last_proof = last_block[:proof]
proof = blockchain.proof_of_work(last_proof)
# We must receive a reward for finding the proof.
# The sender is "0" to signify that this node has mined a new coin.
blockchain.new_transaction(
sender="0",
recipient=node_identifier,
amount=1
)
# Forge the new Block by adding it to the chain
block = blockchain.new_block(proof)
response = {
:message => "New Block Forged",
:index => block[:index],
:transactions => block[:transactions],
:proof => block[:proof],
:previous_hash => block[:previous_hash]
}
status 200
body response.to_json
end
post '/transactions/new' do
# Check validity of JSON was POST'ed
request.body.rewind
request_body = request.body.read
if !JSON.valid?(request_body) then
status 400
response = { :message => "Error: Please supply a valid JSON" }
body response.to_json
return
end
values = JSON.parse(request_body)
# Check that the required fields are in the POST'ed data
required = ['sender', 'recipient', 'amount']
if !required.all? {|s| values.key? s} then
status 400
response = { :message => 'Error: Missing values' }
body response.to_json
return
end
# Create a new Transaction
index = blockchain.new_transaction(values['sender'], values['recipient'], values['amount'])
response = { :message => "Transaction will be added to Block #{index}" }
status 201
body response.to_json
end
get '/chain' do
response = {
:chain => blockchain.chain,
:length => blockchain.chain.size
}
status 200
body response.to_json
end
post '/nodes/register' do
request.body.rewind
request_body = request.body.read
if !JSON.valid?(request_body) then
status 400
body "Error: Please supply a valid JSON"
return
end
values = JSON.parse(request_body)
nodes = values["nodes"]
if !nodes then
status 400
body "Error: Please supply a valid list of nodes"
return
end
nodes.each do |node|
blockchain.register_node(node)
end
response = { :message => 'New nodes have been added', :total_nodes => blockchain.nodes }
status 201
body response.to_json
end
get '/nodes/resolve' do
replaced = blockchain.resolve_conflicts
if replaced then
response = { message: 'Our chain was replaced', new_chain: blockchain.chain }
else
response = { message: 'Our chain is authoritative', chain: blockchain.chain }
end
status 200
body response.to_json
end