# https://medium.com/crypto-currently/lets-build-the-tiniest-blockchain-e70965a248b # http://ruby-for-beginners.rubymonstas.org/writing_classes/self.html # https://stackoverflow.com/questions/33768598/ruby-sha-256-hexidigest-values-are-different-from-what-python-generates require 'rubygems' require 'digest' class Block def initialize(index, timestamp, data, previous_hash) @index = index @timestamp = timestamp @data = data @previous_hash = previous_hash @hash = hash_block end attr_reader :index, :timestamp, :data, :previous_hash, :hash def hash_block sha = Digest::SHA256.new sha.update @index.to_s + @timestamp.to_s + @data.to_s + previous_hash.to_s sha.hexdigest end end def create_genesis_block Block.new(0, Time.now.strftime('%Y-%m-%d %H:%M:%S.%6N'), 'Genesis Block', '0') end def next_block(last_block) this_index = last_block.index + 1 this_timestamp = Time.now.strftime('%Y-%m-%d %H:%M:%S.%6N') this_data = "Hey! I'm a block" + this_index.to_s this_hash = last_block.hash Block.new(this_index, this_timestamp, this_data, this_hash) end # Create the blockchain and add the genesis block blockchain = [create_genesis_block] previous_block = blockchain[0] # How many blocks should we add to the chain # after the genesis block num_of_blocks_to_add = 20 # Add blocks to the chain (0..num_of_blocks_to_add).each do |_i| block_to_add = next_block(previous_block) blockchain.push block_to_add previous_block = block_to_add puts "Block #{block_to_add.index} has been added to blockchain!" puts "Hash: #{block_to_add.hash}\n" end # ➜ Desktop ruby blockchain.rb # Block 1 has been added to blockchain! # Hash: 3654a6a2ae55194b6a2b86930b76bc07c5c86f8ae300d091b8bedfb196ba95e9 # Block 2 has been added to blockchain! # Hash: 006318a8025ad978099364c9c6da08b37bf5976b85110ff9151c198c257aff92 # Block 3 has been added to blockchain! # Hash: fb6a20e87bf0f0bc5d76fc11836987d5dd021fe433432c8be55b44e5928a9cb5 # Block 4 has been added to blockchain! # Hash: 02ddd158610542fa155eb04beba4277a2772cca9e18976a77a77a62ce2fa9b4d # Block 5 has been added to blockchain! # Hash: ed81b4655bf5295c516d927c475494e36d3d615588efa9d2699bfedd8878dc7d # Block 6 has been added to blockchain! # Hash: 5cf495522d07f72f31ff67cace3a7fbb0a59de76785f8de940eac6bb0c119b5d # Block 7 has been added to blockchain! # Hash: 0bd656a8dc661a7ddced16feaf79116cab10f34a0897d0e3fde02b00057ba63d # Block 8 has been added to blockchain! # Hash: 0b7b85dbfdbe8d63cbbe7259e7ac9f0b29c6785f20f41be3b0bce0a695c22598 # Block 9 has been added to blockchain! # Hash: 7dbfe171cc8a5e3ccd08a6e66ee359cef3b5fe19ae2ad5c43ad22f634788c897 # Block 10 has been added to blockchain! # Hash: 97eedf82a0ff9855cb631f23d60281533851d19866cf246cb6c26736f598372e # Block 11 has been added to blockchain! # Hash: ca7aec44cffd6706097755b85f28ff7967aaaa7413f06f2ee6eb91b1329ce88c # Block 12 has been added to blockchain! # Hash: c2a8214340658f627a33a47bb4288e21140a3f176305bff95ac90bd9b9ac4144 # Block 13 has been added to blockchain! # Hash: e16c04a312096f7a5f7a32ea5ecdb3094ef9952e609ebd5d6a16d4e46d4d0d24 # Block 14 has been added to blockchain! # Hash: 31108a7c6a7a6d2bd7dbb4fcdff2a0a1e484b387dc2aabd1be6198f236c918b1 # Block 15 has been added to blockchain! # Hash: a308b514d31d2153f2f482fdd3866aa86ba60e9fb04d12f63c0fadf63d6b82cf # Block 16 has been added to blockchain! # Hash: 8f622622b56ec46240dd039b0eef59185a7bacf3181c8fd4bb242881be8ce164 # Block 17 has been added to blockchain! # Hash: d7fa5e654096741e5f67213db2bb125e6dc5b7b18cdc683642815b32b67edbf8 # Block 18 has been added to blockchain! # Hash: 8f34b6b81d2f226469e26e76f1159774a426e75d27c0c8b080a08ac50aaffe87 # Block 19 has been added to blockchain! # Hash: e2f8d9bf4b8a14abd1e359e8e6a888d553bc55a78395a7dc68b6887cf97ae2e5 # Block 20 has been added to blockchain! # Hash: 86aa169dc0b0acf4eee45a0d6c30b883a1f591e6d2dd530bafa1b80b14fc63eb # Block 21 has been added to blockchain! # Hash: f248f565f8b39da5a688a78e6b60f56e8ad29b01320443e05bb738a043925211