Skip to content

Instantly share code, notes, and snippets.

@nontone
Forked from chrisallick/blockchain.rb
Last active November 6, 2017 07:42
Show Gist options
  • Save nontone/3372b4810c60313ac1c59cd32f23f4fc to your computer and use it in GitHub Desktop.
Save nontone/3372b4810c60313ac1c59cd32f23f4fc to your computer and use it in GitHub Desktop.
tiny blockchain in ruby
# 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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment