-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrubychain.rb
More file actions
103 lines (87 loc) · 2.43 KB
/
rubychain.rb
File metadata and controls
103 lines (87 loc) · 2.43 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
require 'sinatra'
require 'json'
require_relative 'blockchain.rb'
# set :port, 9494
# Generate a globally unique address for this node
node_identifier = SecureRandom.uuid.gsub! '-', ''
# Instantiate the Blockchain
blockchain = Blockchain.new
get '/identifier' do
[200, node_identifier]
end
get '/mine' do
# We run the proof of work algorithm to get the next proof...
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
previous_hash = Blockchain.hash(last_block)
block = blockchain.new_block(previous_hash, proof)
response = {
:message => "New Block Forged",
:index => block[:index],
:transactions => block[:transactions],
:proof => block[:proof],
:previous_hash => block[:previous_hash],
}
[200, response.to_json]
end
post '/transactions/new' do
values = JSON.parse(request.body.read)
keys = values.keys
# Check that the required fields are in the POST'ed data
required = Array.new
required << 'sender' << 'recipient' << 'amount'
unless (required - keys).empty?
return [400, 'missing values']
end
index = blockchain.new_transaction(values['sender'], values['recipient'], values['amount'])
response = {
:message => "Transaction will be added to Block #{index}"
}
[201, response.to_json]
end
get '/chain' do
response = {
:chain => blockchain.chain,
:length => blockchain.chain.length,
}
[200, response.to_json]
end
post '/nodes/register' do
values = JSON.parse(request.body.read)
nodes = values["nodes"]
if nodes == nil
return [400, "Error: Please supply a valid list of nodes"]
end
nodes.each {|node|
blockchain.register_node(node)
}
response = {
:message => 'New nodes have been added',
:total_nodes => blockchain.nodes.to_a,
}
[201, response.to_json]
end
get '/nodes/resolve' do
replaced = blockchain.resolve_conflicts
if replaced
response = {
:message => 'Our chain was replaced',
:new_chain => blockchain.chain
}
else
response = {
:message => 'Our chain is authoritative',
:chain => blockchain.chain
}
end
[200, response.to_json]
end