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
  • Select an option

  • Save nontone/3372b4810c60313ac1c59cd32f23f4fc to your computer and use it in GitHub Desktop.

Select an option

Save nontone/3372b4810c60313ac1c59cd32f23f4fc to your computer and use it in GitHub Desktop.

Revisions

  1. nontone revised this gist Nov 6, 2017. 1 changed file with 0 additions and 2 deletions.
    2 changes: 0 additions & 2 deletions blockchain.rb
    Original file line number Diff line number Diff line change
    @@ -2,8 +2,6 @@
    # 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

    # import hashlib as hasher

    require 'rubygems'
    require 'digest'

  2. nontone revised this gist Nov 6, 2017. 1 changed file with 58 additions and 112 deletions.
    170 changes: 58 additions & 112 deletions blockchain.rb
    Original file line number Diff line number Diff line change
    @@ -1,153 +1,99 @@
    #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
    # 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

    #import hashlib as hasher
    require "rubygems"
    require "digest"
    # import hashlib as hasher

    # class Block:
    # def __init__(self, index, timestamp, data, previous_hash):
    # self.index = index
    # self.timestamp = timestamp
    # self.data = data
    # self.previous_hash = previous_hash
    # self.hash = self.hash_block()

    # def hash_block(self):
    # sha = hasher.sha256()
    # sha.update(str(self.index) +
    # str(self.timestamp) +
    # str(self.data) +
    # str(self.previous_hash))
    # return sha.hexdigest()
    class Block
    def initialize(_index, _timestamp, _data, _previous_hash)
    @index = _index
    @timestamp = _timestamp
    @data = _data
    @previous_hash = _previous_hash
    @hash = self.hash_block
    end

    def index
    @index
    end

    def timestamp
    @timestamp
    end
    require 'rubygems'
    require 'digest'

    def data
    @data
    end

    def previous_hash
    @previous_hash
    end
    class Block
    def initialize(index, timestamp, data, previous_hash)
    @index = index
    @timestamp = timestamp
    @data = data
    @previous_hash = previous_hash
    @hash = hash_block
    end

    def hash
    @hash
    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
    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():
    # # Manually construct a block with
    # # index zero and arbitrary previous hash
    # return Block(0, date.datetime.now(), "Genesis Block", "0")
    def create_genesis_block
    Block.new(0, Time.now.strftime("%Y-%m-%d %H:%M:%S.%6N"), "Genesis Block", "0")
    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 = date.datetime.now()
    # this_data = "Hey! I'm block " + str(this_index)
    # this_hash = last_block.hash
    # return Block(this_index, this_timestamp, this_data, this_hash)
    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)
    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]
    # 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
    # How many blocks should we add to the chain
    # after the genesis block
    num_of_blocks_to_add = 20

    # # Add blocks to the chain
    # for i in range(0, num_of_blocks_to_add):
    # block_to_add = next_block(previous_block)
    # blockchain.append(block_to_add)
    # previous_block = block_to_add
    # # Tell everyone about it!
    # print "Block #{} has been added to the blockchain!".format(block_to_add.index)
    # print "Hash: {}\n".format(block_to_add.hash)
    for i in 0..num_of_blocks_to_add
    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"
    # 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


    # chrisallick@DRO-1367 : ~/Desktop
    # $ ruby blockchain.rb
    # ➜ Desktop ruby blockchain.rb
    # Block 1 has been added to blockchain!
    # Hash: 33e4326c77b75f177b9a69150df66f9a830ba65875b046ff50f29f2982bbba77
    # Hash: 3654a6a2ae55194b6a2b86930b76bc07c5c86f8ae300d091b8bedfb196ba95e9
    # Block 2 has been added to blockchain!
    # Hash: 823435427ebf4d44bd10b89c2ea49079a9930d065955f36dab26b38d1bc3bc2b
    # Hash: 006318a8025ad978099364c9c6da08b37bf5976b85110ff9151c198c257aff92
    # Block 3 has been added to blockchain!
    # Hash: 59c88b788637d4a1695b8c2c2150e5199ddfcb75504474312b584ec2d57d3fbb
    # Hash: fb6a20e87bf0f0bc5d76fc11836987d5dd021fe433432c8be55b44e5928a9cb5
    # Block 4 has been added to blockchain!
    # Hash: 49db4fd4a6a19ee6de952d62afff646f4a41fc17442e0b1144d7543dcc6b8180
    # Hash: 02ddd158610542fa155eb04beba4277a2772cca9e18976a77a77a62ce2fa9b4d
    # Block 5 has been added to blockchain!
    # Hash: 7b1975a2012a67ba115c424e4d2967b6ab241c32ac3ab9fe30909537d5e4865b
    # Hash: ed81b4655bf5295c516d927c475494e36d3d615588efa9d2699bfedd8878dc7d
    # Block 6 has been added to blockchain!
    # Hash: 815e182d53d344ecd964d2ba65dc3e5bb6be8bec8e0eb5f51215756109f4b777
    # Hash: 5cf495522d07f72f31ff67cace3a7fbb0a59de76785f8de940eac6bb0c119b5d
    # Block 7 has been added to blockchain!
    # Hash: 41e5de47ee57d038197d7ecddba9e7a56233e74ac0b0a87d3e7605142b81e941
    # Hash: 0bd656a8dc661a7ddced16feaf79116cab10f34a0897d0e3fde02b00057ba63d
    # Block 8 has been added to blockchain!
    # Hash: 55a6242e12cfec2a9f61962144a1801e162172f21400f8324e22f43143b9fd49
    # Hash: 0b7b85dbfdbe8d63cbbe7259e7ac9f0b29c6785f20f41be3b0bce0a695c22598
    # Block 9 has been added to blockchain!
    # Hash: 33b5722748b860c4a26ce39de80885b26135f16497bdf438da5ffc004bc05a48
    # Hash: 7dbfe171cc8a5e3ccd08a6e66ee359cef3b5fe19ae2ad5c43ad22f634788c897
    # Block 10 has been added to blockchain!
    # Hash: 1d28c921990cec1f4ade76e0385d7ab58d51561394d033ab07582793af1081b1
    # Hash: 97eedf82a0ff9855cb631f23d60281533851d19866cf246cb6c26736f598372e
    # Block 11 has been added to blockchain!
    # Hash: dbff57b6c573595db7a8021e647b14af93d933e50a8f81ee8cb00c2d97bc0ffd
    # Hash: ca7aec44cffd6706097755b85f28ff7967aaaa7413f06f2ee6eb91b1329ce88c
    # Block 12 has been added to blockchain!
    # Hash: c26a2d6c896c694e47f14f17c41ff9225bdd38bca55eb501513208c3ddef0a20
    # Hash: c2a8214340658f627a33a47bb4288e21140a3f176305bff95ac90bd9b9ac4144
    # Block 13 has been added to blockchain!
    # Hash: 512a62acf2a3afc02b347b121ed386826fd991023b8e8d8aa53abbe2e56d16ea
    # Hash: e16c04a312096f7a5f7a32ea5ecdb3094ef9952e609ebd5d6a16d4e46d4d0d24
    # Block 14 has been added to blockchain!
    # Hash: aeedc27ed62d9049a663dbdd8fd4b60a35063d24a07d2e46018f3188c031aaab
    # Hash: 31108a7c6a7a6d2bd7dbb4fcdff2a0a1e484b387dc2aabd1be6198f236c918b1
    # Block 15 has been added to blockchain!
    # Hash: 02e731c32484443e6a202b319af618614241c2dccd4016f4956a6b7664e4ce16
    # Hash: a308b514d31d2153f2f482fdd3866aa86ba60e9fb04d12f63c0fadf63d6b82cf
    # Block 16 has been added to blockchain!
    # Hash: 378be7c5f55884db86d2ad1bed51101ae17b64781c87fb46c8812a3884735e39
    # Hash: 8f622622b56ec46240dd039b0eef59185a7bacf3181c8fd4bb242881be8ce164
    # Block 17 has been added to blockchain!
    # Hash: 378cfae4fdf2e7ee0b8d273425cedbcdd7c0fa726a8be413ddc69a125e870ff1
    # Hash: d7fa5e654096741e5f67213db2bb125e6dc5b7b18cdc683642815b32b67edbf8
    # Block 18 has been added to blockchain!
    # Hash: 4546e7a36a2927d67cc22c827c835a261042d600e658e7dba55fb48726f3dd6a
    # Hash: 8f34b6b81d2f226469e26e76f1159774a426e75d27c0c8b080a08ac50aaffe87
    # Block 19 has been added to blockchain!
    # Hash: 1d6f1962dba3d95f60f8ebbbc434eb5d1bbd455f41c4a780fcfb675fbd60b2b7
    # Hash: e2f8d9bf4b8a14abd1e359e8e6a888d553bc55a78395a7dc68b6887cf97ae2e5
    # Block 20 has been added to blockchain!
    # Hash: 133266bac4bccd76a9f8d0f711f5f67710ce89cd3ab2c8b3739d51c44a6d1691
    # Hash: 86aa169dc0b0acf4eee45a0d6c30b883a1f591e6d2dd530bafa1b80b14fc63eb
    # Block 21 has been added to blockchain!
    # Hash: 2e23d602ab68d4e6105d7c2103ddd9e3d3fc9a74a993fff0028c04f1129a6814
    # Hash: f248f565f8b39da5a688a78e6b60f56e8ad29b01320443e05bb738a043925211
  3. @chrisallick chrisallick created this gist Jul 18, 2017.
    153 changes: 153 additions & 0 deletions blockchain.rb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,153 @@
    #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

    #import hashlib as hasher
    require "rubygems"
    require "digest"

    # class Block:
    # def __init__(self, index, timestamp, data, previous_hash):
    # self.index = index
    # self.timestamp = timestamp
    # self.data = data
    # self.previous_hash = previous_hash
    # self.hash = self.hash_block()

    # def hash_block(self):
    # sha = hasher.sha256()
    # sha.update(str(self.index) +
    # str(self.timestamp) +
    # str(self.data) +
    # str(self.previous_hash))
    # return sha.hexdigest()
    class Block
    def initialize(_index, _timestamp, _data, _previous_hash)
    @index = _index
    @timestamp = _timestamp
    @data = _data
    @previous_hash = _previous_hash
    @hash = self.hash_block
    end

    def index
    @index
    end

    def timestamp
    @timestamp
    end

    def data
    @data
    end

    def previous_hash
    @previous_hash
    end

    def hash
    @hash
    end

    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():
    # # Manually construct a block with
    # # index zero and arbitrary previous hash
    # return Block(0, date.datetime.now(), "Genesis Block", "0")
    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 = date.datetime.now()
    # this_data = "Hey! I'm block " + str(this_index)
    # this_hash = last_block.hash
    # return Block(this_index, this_timestamp, this_data, this_hash)
    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]
    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
    num_of_blocks_to_add = 20

    # # Add blocks to the chain
    # for i in range(0, num_of_blocks_to_add):
    # block_to_add = next_block(previous_block)
    # blockchain.append(block_to_add)
    # previous_block = block_to_add
    # # Tell everyone about it!
    # print "Block #{} has been added to the blockchain!".format(block_to_add.index)
    # print "Hash: {}\n".format(block_to_add.hash)
    for i in 0..num_of_blocks_to_add
    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


    # chrisallick@DRO-1367 : ~/Desktop
    # $ ruby blockchain.rb
    # Block 1 has been added to blockchain!
    # Hash: 33e4326c77b75f177b9a69150df66f9a830ba65875b046ff50f29f2982bbba77
    # Block 2 has been added to blockchain!
    # Hash: 823435427ebf4d44bd10b89c2ea49079a9930d065955f36dab26b38d1bc3bc2b
    # Block 3 has been added to blockchain!
    # Hash: 59c88b788637d4a1695b8c2c2150e5199ddfcb75504474312b584ec2d57d3fbb
    # Block 4 has been added to blockchain!
    # Hash: 49db4fd4a6a19ee6de952d62afff646f4a41fc17442e0b1144d7543dcc6b8180
    # Block 5 has been added to blockchain!
    # Hash: 7b1975a2012a67ba115c424e4d2967b6ab241c32ac3ab9fe30909537d5e4865b
    # Block 6 has been added to blockchain!
    # Hash: 815e182d53d344ecd964d2ba65dc3e5bb6be8bec8e0eb5f51215756109f4b777
    # Block 7 has been added to blockchain!
    # Hash: 41e5de47ee57d038197d7ecddba9e7a56233e74ac0b0a87d3e7605142b81e941
    # Block 8 has been added to blockchain!
    # Hash: 55a6242e12cfec2a9f61962144a1801e162172f21400f8324e22f43143b9fd49
    # Block 9 has been added to blockchain!
    # Hash: 33b5722748b860c4a26ce39de80885b26135f16497bdf438da5ffc004bc05a48
    # Block 10 has been added to blockchain!
    # Hash: 1d28c921990cec1f4ade76e0385d7ab58d51561394d033ab07582793af1081b1
    # Block 11 has been added to blockchain!
    # Hash: dbff57b6c573595db7a8021e647b14af93d933e50a8f81ee8cb00c2d97bc0ffd
    # Block 12 has been added to blockchain!
    # Hash: c26a2d6c896c694e47f14f17c41ff9225bdd38bca55eb501513208c3ddef0a20
    # Block 13 has been added to blockchain!
    # Hash: 512a62acf2a3afc02b347b121ed386826fd991023b8e8d8aa53abbe2e56d16ea
    # Block 14 has been added to blockchain!
    # Hash: aeedc27ed62d9049a663dbdd8fd4b60a35063d24a07d2e46018f3188c031aaab
    # Block 15 has been added to blockchain!
    # Hash: 02e731c32484443e6a202b319af618614241c2dccd4016f4956a6b7664e4ce16
    # Block 16 has been added to blockchain!
    # Hash: 378be7c5f55884db86d2ad1bed51101ae17b64781c87fb46c8812a3884735e39
    # Block 17 has been added to blockchain!
    # Hash: 378cfae4fdf2e7ee0b8d273425cedbcdd7c0fa726a8be413ddc69a125e870ff1
    # Block 18 has been added to blockchain!
    # Hash: 4546e7a36a2927d67cc22c827c835a261042d600e658e7dba55fb48726f3dd6a
    # Block 19 has been added to blockchain!
    # Hash: 1d6f1962dba3d95f60f8ebbbc434eb5d1bbd455f41c4a780fcfb675fbd60b2b7
    # Block 20 has been added to blockchain!
    # Hash: 133266bac4bccd76a9f8d0f711f5f67710ce89cd3ab2c8b3739d51c44a6d1691
    # Block 21 has been added to blockchain!
    # Hash: 2e23d602ab68d4e6105d7c2103ddd9e3d3fc9a74a993fff0028c04f1129a6814