Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
import hashlib as hasher
import datetime as date
# Define what a Snakecoin block is
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()
# Generate genesis block
def create_genesis_block():
# Manually construct a block with
# index zero and arbitrary previous hash
return Block(0, date.datetime.now(), "Genesis Block", "0")
# Generate all later blocks in the blockchain
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)
# 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
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)

Boom16 commented Jul 18, 2017

I am trying to use/learn this code and I keep getting the error "Unicode-objects must be encoded before hashing". Do you know what needs to be encoded/ how to encode them? Thanks in advance for any help you can offer.

I modified line 15 as below and it worked just fine:

sha.update(str(self.index).encode('utf-8') + str(self.timestamp).encode('utf-8') + str(self.data).encode('utf-8') + str(self.previous_hash).encode('utf-8'))

tbrooke commented Jul 19, 2017

I am using Python 3 which may be the problem but I get the following error:

File "/Users/tmb/python/SnakeCoin/Snake.py", line 24, in create_genesis_block
return Block(0, date.datetime.now(), "Genesis Block", "0")
TypeError: object() takes no parameters

This is my Block:

Define what a Snakecoin block is

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()

This is my Create Genesis Block:

Generate genesis block

def create_genesis_block():
# Manually construct a block with
# index zero and arbitrary previous hash
return Block(0, date.datetime.now(), "Genesis Block", "0")

rdsteed commented Jul 21, 2017

@tbrooke
It's hard to tell the problem from the code you included, but your error is often due to Python indentation problems. Because indentation in Python determines block nesting, proper indentation is critical. Even if the indentation looks right, there can be problems if you mix tabs and spaces.

Owner

aunyks commented Jul 23, 2017

@Boom16 See @joeblankenship1 's comment under yours for help

Hello there,

I am getting the below error:

blockchain = [create_genesis_block()]

NameError: name 'create_genesis_block' is not defined

I am using Python 3.6.0 and IDLE 3.6.0

Thanks in advance

JS/nodejs version

const sha256 = require('js-sha256');

// Define the Block Class
class Block {
  constructor(index, data, previousHash) {
    this.index = index;
    this.timestamp = new Date();
    this.data = data;
    this.previousHash = previousHash;
    this.hash = this.generateHash();

  }

  generateHash() {
    return sha256.hex(`${this.index}${this.timestamp}${this.data}${this.previousHash}`);
  }
}

// Create genesis block
function createGenesisBlock() {
  return new Block(0, 'Genesis Block', '0');
}

// Create all other blocks
function createNextBlock(previousBlock, data=null) {
  const index = previousBlock.index + 1;
  const previousHash = previousBlock.hash;
  return new Block(index, data, previousHash);
}

// Demo
// Create the Blockchain
const blockchain = [createGenesisBlock()];
let previousBlock = blockchain[0];

for (let i=0; i<20; i++) {
  const block = createNextBlock(previousBlock);
  blockchain.push(block);
  previousBlock = block;

  console.log(`Block #${block.index} has been added to the blockchain!.`);
  console.log(`Hash: ${block.hash}\n`);
}

wowkin2 commented Aug 8, 2017

I think that index should be autoincremented to avoid case there are blocks with the same index.

wowkin2 commented Aug 8, 2017

Made some updates (see my gist).
Created separate class for blockchain, as result got simple interface to create blocks and retrieve information about them.
In future, we can add there more functionality there.

wowkin2 commented Aug 8, 2017

@aunyks, found other gist-files about Snakecoin, maybe it is good idea to join them in a single gist or create a repo for that?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment