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