class StephanyCryptodemo::Blockchain
Attributes
chain[R]
Public Class Methods
hash(block)
click to toggle source
# File lib/stephany_cryptodemo.rb, line 92 def self.hash(block) block_string = block.to_json # return SHA256 for the given block Digest::SHA256.hexdigest(block_string) end
new()
click to toggle source
# File lib/stephany_cryptodemo.rb, line 11 def initialize @chain = [] @current_transactions = [] # Generating First Block of Blockchain (the first block is called 'Genesis Block') new_block(100, 1) end
valid_proof(last_proof, new_proof)
click to toggle source
# File lib/stephany_cryptodemo.rb, line 101 def self.valid_proof(last_proof, new_proof) # return true if the resulting hash has 4 zeros at the end guess = "#{last_proof}#{new_proof}" guess_hash = Digest::SHA256.hexdigest(guess) guess_hash.to_s[-4..-1] == '0000' end
Public Instance Methods
hash(block)
click to toggle source
# File lib/stephany_cryptodemo.rb, line 86 def hash(block) # If we need to create a hash for the block Blockchain.hash(block) end
last_block()
click to toggle source
# File lib/stephany_cryptodemo.rb, line 81 def last_block @chain[-1] end
new_block(proof_of_work, previous_hash = nil)
click to toggle source
# File lib/stephany_cryptodemo.rb, line 40 def new_block(proof_of_work, previous_hash = nil) # To generate a new block, we need: # - proof of work # - the previous hash to control the blocks chain creation previous_hash ||= self.hash(@chain[-1]) block = { :index => @chain.count + 1, :timestamp => Time.now.to_i, :transactions => @current_transactions, :proof => proof_of_work, :previous_hash => previous_hash, } # The chain must restart the transactions being stored # to store the transactions coming for the new block @current_transactions = [] @chain.push(block) block end
new_transaction(sender, recipient, amount)
click to toggle source
# File lib/stephany_cryptodemo.rb, line 64 def new_transaction(sender, recipient, amount) # Just like a Bank Transaction # You need a sender, a recipient and the amount to transfer transaction = { :sender => sender, :recipient => recipient, :amount => amount } @current_transactions.push(transaction) @chain.index(last_block) end
proof_of_work(last_proof)
click to toggle source
# File lib/stephany_cryptodemo.rb, line 19 def proof_of_work(last_proof) # Piece of data hard to generate but easy to validate # Generate it, could take some time (X hours to generate a new block) # It allow us to validate if the person using this gem is actually spending time to mining a new block # It will calculate a number that concatenated to the last_proof # will return a hash with 4 zeros at the end # Ex: # efc26373838..0000 proof = 0 while !Blockchain.valid_proof(last_proof, proof) do proof += 1 end proof end