-
Notifications
You must be signed in to change notification settings - Fork 0
/
block.rb
66 lines (54 loc) · 1.62 KB
/
block.rb
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
require 'colorize'
require 'digest'
require_relative 'pki'
require_relative 'transaction'
class Block
NUM_ZEROES = 4
attr_reader :own_hash, :prev_block_hash, :txn
def self.create_genesis_block(pub_key, priv_key)
genesis_txn = Transaction.new(nil, pub_key, 500_000, priv_key)
Block.new(nil, genesis_txn)
end
def initialize(prev_block, txn)
raise TypeError unless txn.is_a?(Transaction)
@txn = txn
@prev_block_hash = prev_block.own_hash if prev_block
mine_block!
end
def mine_block!
@nonce = cal_nonce
@own_hash = hash(full_block(@nonce))
end
def valid?
is_valid_nonce?(@nonce) && txn.is_valid_signature? #belong to Transaction
end
def to_s
[
"Previous hash: ".rjust(15) + @prev_block_hash.to_s.yellow,
"Message: ".rjust(15) + @txn.to_s.green,
"Nonce: ".rjust(15) + @nonce.light_blue,
"Own hash: ".rjust(15) + @own_hash.yellow,
"↓".rjust(40),
].join("\n")
end
private
def hash(contents)
Digest::SHA256.hexdigest(contents)
end
def cal_nonce
nonce = "HELP I'M TRAPPED IN A NONCE FACTORY"
count = 0
until is_valid_nonce?(nonce)
print "." if count % 100_000 == 0
nonce = nonce.next
count += 1
end
nonce
end
def is_valid_nonce?(nonce)
hash(full_block(nonce)).start_with?("0" * NUM_ZEROES)
end
def full_block(nonce)
[@txn, @prev_block_hash, nonce].compact.join
end
end