python区块链(Python学习入门之区块链详解)

  python区块链(Python学习入门之区块链详解)

本篇文章小编给大家分享一下关于区块链(BlockChain)的相关知识,并用Python做一简单实现,下面话不多说,来一起看看详细的绍:

  

  

一、定义区块结构

  

In [16]!

  

# block。py

  

import Hashlib

  

import uuid

  

class Block(object)!

  

def __init__(self, data=None, previous_hash=None)!

  

self。identifier = uuid。uuid4()。hex # 产生唯一标示

  

self。nonce = None # nonce值

  

self。data = data # 区块内容

  

self。previous_hash = previous_hash # 父节点哈希值

  

def hash(self, nonce=None)!

  

  

计算区块的哈希值

  

  

message = hashlib。sha256()

  

message。update(self。identifier。encode(utf-8))

  

message。update(str(nonce)。encode(utf-8))

  

message。update(str(self。data)。encode(utf-8))

  

message。update(str(self。previous_hash)。encode(utf-8))

  

return message。hexdigest()

  

def hash_is_valid(self, the_hash)!

  

  

  

校验区块哈希值有否有效

  

  

return the_hash。startswith(0000)

  

def __repr__(self)!

  

return Block<;Hash! {}, Nonce! {}>;。format(self。hash(), self。nonce)

  

以上就是一个区块结构,这里实现的是一个简化版,没有完全对应比特币中的区块。这里的区块包含一个唯一标识符、父节点的哈希值、比特币行情nonce值和该区块的内容字段。可以看到一个区块的哈希值必须满足一定的条件才是有效的,比如以0000开始。下面对这个区块结构进行初始化。

  

In [37]!

  

# 创建一个内容为hello world的内容块

  

block = Block(Hello World)

  

block

  

  

Out[37]!

  

Block<;Hash! 238a65a101c8829d7fc406eb78a71cfc19ad702b437e2c1be8d9061ddb81e900, Nonce! None>;

  

以上一个区块虽然创建完成,但其哈希值不是有效的。

  

In [38]!

  

block。hash_is_valid(block。hash())

  

Out[38]!

  

False

  

改变nonce的值就可以得到一个新的哈希值。

  

In [39]!

  

block。hash(1)

  

Out[39]!

  

a6431938ba10270dfcfdf7a2371312446914fedadf79632c2c0adb3b463f4838

  

哈希值更新了,但还不是有效的哈希值。为了得到有效哈希值,是一个不断更新nonce值的过程,或者说一个挖矿(mine)过程。下面添加一个mine函数用来得到一个合适的nonce值。

  

In [78]!

  

# block。py

  

import uuid

  

  

计算区块的哈希值

  

  

  

  

return Block<;Hash! {}, Nonce! {}>;。format(self。hash(self。nonce), self。nonce)

  

  

新增挖矿函数

  

  

def mine(self)!

  

# 初始化nonce为0

  

cur_nonce = self。nonce or 0

  

# 循环直到生成一个有效的哈希值

  

while True!

  

the_hash = self。hash(nonce=cur_nonce)

  

if self。hash_is_valid(the_hash)! # 如果生成的哈希值有效

  

self。nonce = cur_nonce # 保持当前nonce值

  

break # 并退出

  

else!

  

cur_nonce += 1 # 若当前哈希值无效,更新nonce值,进行加1操作

  

In [75]!

  

# 挖矿,循环直至找到合适的nonce

  

block。mine()

  

# 打印

  

block

  

Out[75]!

  

Block<;Hash! 000087359d5264153d624556f0a0c6f25cba06e453975c1c02587862e823911b, Nonce! 64751>;

  

  

至此,第一个有效的区块生成完成,下面开始定义区块链。

  

二、定义区块链结构

  

In [81]!

  

class BlockChain(object)!

  

def __init__(self)!

  

self。head = None # 指向最新的一个区块

  

self。blocks = {} # 包含所有区块的一个字典

  

  

添加区块函数

  

  

def add_block(self, new_block)!

  

previous_hash = self。head。hash() if self。head else None

  

new_block。previous_hash = previous_hash

  

self。blocks[new_block。identifier] = {

  

block! new_block,

  

previous_hash! previous_hash,

  

previous! self。head,

  

}

  

self。head = new_block

  

num_existing_blocks = len(self。blocks)

  

return Blockchain<;{} Blocks, Head! {}>;。format(

  

num_existing_blocks,

  

self。head。identifier if self。head else None

  

)

  

定义好区块链结构后,下面就开始初始化一条区块链。

  

In [82]!

  

# 初始化

  

chain = BlockChain()

  

# 打印

  

chain

  

Out[82]!

  

Blockchain<;0 Blocks, Head! None>;

  

In [83]!

  

# 添加区块

  

chain。add_block(block)

  

# 打印

  

chain

  

Out[83]!

  

Blockchain<;1 Blocks, Head! 364c0cf963384ca28a2763499a140405>;

  

In [84]!

  

# 添加更多的区块

  

for i in range(6)!

  

new_block = Block(i)

  

new_block。mine()

  

chain。add_block(new_block)

  

# 打印

  

chain

  

Out[84]!

  

Blockchain<;7 Blocks, Head! e7cb24ec7acd42a4aaebe7faee9e0713>;

  

以上就是一个简单区块链,后面还会涉及到区块链的有效性。当区块链中一个区块被改变后,这个区块的哈希就会改变,从而影响到这块区块之后的区块,致使这个区块链不再有效。这些将在后续继续深入。

  

以上便是小编给大家带来的全部内容,转发此文+关注 并私信小编“资料”即可免费领取2019最新python资料和零基础入门教程!

  

  

不定期分享干货,欢迎初学和进阶中的小伙伴!

  

  

  

亲~私信回复【资料】即可获取Python学习资料哦,赶快领取吧!

  

  


  
","content_hash"!"4c6c3dec

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

评论