代碼の區塊鏈跑起來的發動機 ~

活學區塊鏈

活到老,學到老!

之前的文章中我們有提到過區塊鏈的幾大基本要素,其中很重要的一個就是有唯一開源代碼,區塊鏈密碼學中,代碼也是成為區塊鏈防火牆的重要組成部分

昨天的文章中給大家所展示的,就是最簡單的區塊鏈代碼,但只要是生成真正意義的區塊鏈,區塊鏈的所有元素都將具備,我們今天一起來解讀一下。

代碼の區塊鏈跑起來的發動機 ~

這種只有50行代碼的最簡區塊鏈,

稱為SnakeCoin。

代碼の區塊鏈跑起來的發動機 ~

在區塊鏈中看,我們首先定義區塊,在一個區塊中,存儲著一個時間戳和一個(可選的)索引。為了保證整個區塊鏈的完整性,每個區塊有一個標記自己身份的哈希值,像萊特幣,每個區塊的哈希值都是由一個密碼學算法根據區塊的索引、時間戳、數據以及前一個區塊的哈希值生成的。區塊的數據可以是任何你想要的東西。

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

通過以上源代碼我們有自己的區塊結構了,但我們需要創建一個區塊鏈。我們需要開始把區塊附加到實際的鏈條上。因為每個區塊需要前面區塊的信息,但第一個區塊鏈又是怎麼產生的呢?

這裡有一個概念,叫做第一區塊,或者叫創世區塊,這是一個特殊的區塊,在許多情況下,這是通過手工或者一個唯一的邏輯添加上去的。

代碼の區塊鏈跑起來的發動機 ~

▼▼

這裡我們創建一個函數,為了簡化起見,簡單地返回一個創世區塊。這個區塊的索引是0,它的數據值和previous hash參數是任意指定的。

import datetime as date

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

代碼の區塊鏈跑起來的發動機 ~

▼▼▼▼

這就是主要的工作了,現在我們可以創建我們的區塊鏈了。在我們這個例子裡,區塊鏈本身是一個簡單的Python list。list的第一個元素就是創世區塊,當然,我們需要繼續添加區塊。因為SnakeCoin是一個最簡區塊鏈,只有20個新的區塊,我們可以在一個for循環裡搞定。

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

當我們的區塊鏈跑起來之後,如果你想在console上看到更多信息,你可以稍微修改一下代碼,把每個區塊的時間戳或者數據打印出來。

代碼の區塊鏈跑起來的發動機 ~

這就是SnakeCoin能夠提供的所有功能了,如果要讓SnakeCoin擴展到實際的生產環境的區塊鏈的規模,還需要添加類似服務器層的功能,在多臺機器上追蹤對鏈條的變更,加上一個工作證明算法(proof-of-work algorithm)來限制在一個給定的時間段之內添加的區塊的數量。那就是區塊鏈應用領域的知識點了,因為代碼是區塊鏈跑起來的發動機,而應用則是區塊鏈奔跑的輪子。區塊鏈跑車隨著時代的腳步正在加速奔跑,僅有好的發動機而沒有好的輪胎,自然也跑不遠,這是筆者一直推崇的區塊鏈必須要有應用的理念所在。後面文章中我們將會講到應用領域的關聯事物。

活學區塊鏈,我們明天見!


分享到:


相關文章: