欧美成人午夜免费全部完,亚洲午夜福利精品久久,а√最新版在线天堂,另类亚洲综合区图片小说区,亚洲欧美日韩精品色xxx

扣丁學堂區(qū)塊鏈培訓簡述Python學習入門之區(qū)塊鏈詳解

2019-02-28 14:16:07 1828瀏覽

上篇文章小編已經(jīng)給大家分享了區(qū)塊鏈介紹以及區(qū)塊鏈的工作原理等情況,本篇文章扣丁學堂區(qū)塊鏈培訓小編再給大家分享一下關(guān)于區(qū)塊鏈(BlockChain)的相關(guān)知識,并用Python做一簡單實現(xiàn),下面話不多說,來一起看看詳細的介紹:



扣丁學堂區(qū)塊鏈培訓簡述Python學習入門之區(qū)塊鏈詳解



、定義區(qū)塊結(jié)構(gòu)


In [16]:


# block.py

import hashlib
import uuid


class Block(object):
 def __init__(self, data=None, previous_hash=None):
  self.identifier = uuid.uuid4().hex # 產(chǎn)生唯一標示
  self.nonce = None     # nonce值
  self.data = data      # 區(qū)塊內(nèi)容
  self.previous_hash = previous_hash # 父節(jié)點哈希值
  
 def hash(self, nonce=None):
  '''
  計算區(qū)塊的哈希值
  '''
  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):
  '''
  校驗區(qū)塊哈希值有否有效
  '''
  return the_hash.startswith('0000')

 def __repr__(self):
  return 'Block<Hash: {}, Nonce: {}>'.format(self.hash(), self.nonce)


以上就是一個區(qū)塊結(jié)構(gòu),這里實現(xiàn)的是一個簡化版,沒有完全對應比特幣中的區(qū)塊。這里的區(qū)塊包含一個唯一標識符、父節(jié)點的哈希值、nonce值和該區(qū)塊的內(nèi)容字段。可以看到一個區(qū)塊的哈希值必須滿足一定的條件才是有效的,比如以0000開始。下面對這個區(qū)塊結(jié)構(gòu)進行初始化。



In [37]:


# 創(chuàng)建一個內(nèi)容為hello world的內(nèi)容塊

block = Block('Hello World')
block


Out[37]:


Block<Hash: 238a65a101c8829d7fc406eb78a71cfc19ad702b437e2c1be8d9061ddb81e900, Nonce: None>


以上一個區(qū)塊雖然創(chuàng)建完成,但其哈希值不是有效的。


In [38]:


block.hash_is_valid(block.hash())


Out[38]:


False


改變nonce的值就可以得到一個新的哈希值。


In [39]:


block.hash(1)


Out[39]:


'a6431938ba10270dfcfdf7a2371312446914fedadf79632c2c0adb3b463f4838'


哈希值更新了,但還不是有效的哈希值。為了得到有效哈希值,是一個不斷更新nonce值的過程,或者說一個挖礦(mine)過程。下面添加一個mine函數(shù)用來得到一個合適的nonce值。


In [78]:


# block.py

import hashlib
import uuid


class Block(object):
 def __init__(self, data=None, previous_hash=None):
  self.identifier = uuid.uuid4().hex # 產(chǎn)生唯一標示
  self.nonce = None     # nonce值
  self.data = data      # 區(qū)塊內(nèi)容
  self.previous_hash = previous_hash # 父節(jié)點哈希值
  
 def hash(self, nonce=None):
  '''
  計算區(qū)塊的哈希值
  '''
  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):
  '''
  校驗區(qū)塊哈希值有否有效
  '''
  return the_hash.startswith('0000')

 def __repr__(self):
  return 'Block<Hash: {}, Nonce: {}>'.format(self.hash(self.nonce), self.nonce)
 
 
 '''
  新增挖礦函數(shù)
 '''
 def mine(self):
  # 初始化nonce為0
  cur_nonce = self.nonce or 0

  # 循環(huán)直到生成一個有效的哈希值
  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]:


block = Block('Hello World')

# 挖礦,循環(huán)直至找到合適的nonce
block.mine()

# 打印
block


Out[75]:


Block<Hash: 000087359d5264153d624556f0a0c6f25cba06e453975c1c02587862e823911b, Nonce: 64751>


至此,第一個有效的區(qū)塊生成完成,下面開始定義區(qū)塊鏈。



二、定義區(qū)塊鏈結(jié)構(gòu)


In [81]:


class BlockChain(object):
 def __init__(self):
  self.head = None # 指向最新的一個區(qū)塊
  self.blocks = {} # 包含所有區(qū)塊的一個字典

 '''
  添加區(qū)塊函數(shù)
 '''
 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

 def __repr__(self):
  num_existing_blocks = len(self.blocks)
  return 'Blockchain<{} Blocks, Head: {}>'.format(
   num_existing_blocks,
   self.head.identifier if self.head else None
  )


定義好區(qū)塊鏈結(jié)構(gòu)后,下面就開始初始化一條區(qū)塊鏈。


In [82]:


# 初始化
chain = BlockChain()

# 打印
chain


Out[82]:


Blockchain<0 Blocks, Head: None>


In [83]:


# 添加區(qū)塊
chain.add_block(block)

# 打印
chain


Out[83]:


Blockchain<1 Blocks, Head: 364c0cf963384ca28a2763499a140405>


In [84]:


# 添加更多的區(qū)塊

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>


以上就是一個簡單區(qū)塊鏈,后面還會涉及到區(qū)塊鏈的有效性。當區(qū)塊鏈中一個區(qū)塊被改變后,這個區(qū)塊的哈希就會改變,從而影響到這塊區(qū)塊之后的區(qū)塊,致使這個區(qū)塊鏈不再有效。這些將在后續(xù)繼續(xù)深入。




以上就是一個區(qū)塊結(jié)構(gòu),這里實現(xiàn)的是一個簡化版,沒有完全對應比特幣中的區(qū)塊。這里的區(qū)塊包含一個唯一標識符、父節(jié)點的哈希值、nonce值和該區(qū)塊的內(nèi)容字段??梢钥吹揭粋€區(qū)塊的哈希值必須滿足一定的條件才是有效的,比如以0000開始。下面對這個區(qū)塊結(jié)構(gòu)進行初始化。



想要了解更多關(guān)于區(qū)塊鏈方面內(nèi)容的小伙伴,請關(guān)注扣丁學堂區(qū)塊鏈培訓官網(wǎng)、微信等平臺,扣丁學堂IT職業(yè)在線學習教育平臺為您提供權(quán)威的區(qū)塊鏈視頻教程,此外還有與時俱進的區(qū)塊鏈課程體系和區(qū)塊鏈視頻直播課供大家學習,想要學好區(qū)塊鏈開發(fā)技術(shù)的小伙伴快快行動吧??鄱W堂區(qū)塊鏈交流群:850351616。


區(qū)塊鏈培訓


【關(guān)注微信公眾號獲取更多學習資料】


 

查看更多關(guān)于“區(qū)塊鏈培訓技術(shù)資訊”的相關(guān)文章>>



標簽: 區(qū)塊鏈培訓 區(qū)塊鏈技術(shù) 區(qū)塊鏈開發(fā) 區(qū)塊鏈視頻教程 比特幣 以太坊

熱門專區(qū)

暫無熱門資訊

課程推薦

微信
微博
15311698296

全國免費咨詢熱線

郵箱:codingke@1000phone.com

官方群:148715490

北京千鋒互聯(lián)科技有限公司版權(quán)所有   北京市海淀區(qū)寶盛北里西區(qū)28號中關(guān)村智誠科創(chuàng)大廈4層
京ICP備2021002079號-2   Copyright ? 2017 - 2022
返回頂部 返回頂部