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?

ssabat commented Sep 14, 2017 edited

I tried js/nodejs version on my Mac.

I saved code in a file called snakecoin.js. Then, I did following.

brew install node ( it will install dependency icu4c )
npm install js-sha256
node snakecoin.js

20 blocks were created and added. Last few lines of output are:

..............
...................
Block #18 has been added to the blockchain!.
Hash: af71818c33d461d5ccb58902df4ac56b5774ebf533e43fd3fe18d66a44073f8c

Block #19 has been added to the blockchain!.
Hash: 650fedbb88c13e3a2cb45e5a35b08c8d4ac907137cd8d810a09a2c53815943b8

Block #20 has been added to the blockchain!.
Hash: 7317a8c58a031c23e032e947c54f28dcac9b076274992d7b486d6558d35ff86f

Thanks @thinkholic for sharing the code.

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