python构建区块链_用python构建区块链(1)---基本结构
目錄
背景
比特幣從誕生到現在已經10年了,最近一段時間因為工作原因接觸到了區塊鏈相關的技術,為了揭開其背后的神秘面紗,我們就從頭開始構建一個簡單的區塊鏈。在行動之前我們先看一下比特幣的整體結構.
比特幣內部結構
可以看到比特幣主要有四個部分
previous hash(前一個區塊的hash)
merkle root(默克爾樹根節點,內部存儲交易數據)
timestamp(當前區塊生成的時間)
nonce(曠工計算hash值次數)
transaction_structure.png
我們實現的區塊鏈數據結構(簡單實現并不完整)
index 當前第幾個區塊
timestamp 該區塊創建時的時間戳
data 交易信息
previousHash 前一個區塊的hash
hash 當前區塊的hash
注意點
第一個區塊叫做創世區塊(genesis block),區塊鏈創建的時候默認生產的
這里用的是單純的鏈表,不是用默克爾樹存儲
coding
from hashlib import sha256
//區塊schema
class Block:
def __init__(self,index,timestamp,data,previousHash=""):
self.index = index
self.timestamp = timestamp
self.data = data
self.previousHash = previousHash
self.hash = self.calculateHash()
//計算當前區塊的hash值
def calculateHash(self):
plainData = str(self.index)+str(self.timestamp)+str(self.data)
return sha256(plainData.encode('utf-8')).hexdigest()
def __str__(self):
return str(self.__dict__)
//區塊鏈schema
class BlockChain:
//初始化的時候 創建 創世區塊
def __init__(self):
self.chain = [self.createGenesisBlock()]
//構建創世區塊
def createGenesisBlock(self):
return Block(0,"01/01/2018","genesis block","0")
//獲取最后一個區塊
def getLatestBlock(self):
return self.chain[len(self.chain)-1]
//往區塊鏈里面添加區塊
def addBlock(self,newBlock):
newBlock.previousHash = self.getLatestBlock().hash
newBlock.hash = newBlock.calculateHash()
self.chain.append(newBlock)
def __str__(self):
return str(self.__dict__)
//校驗區塊鏈是不是有效的 有沒有人被篡改
def chainIsValid(self):
for index in range(1,len(self.chain)):
currentBlock = self.chain[index]
previousBlock = self.chain[index-1]
if (currentBlock.hash != currentBlock.calculateHash()):
return False
if previousBlock.hash != currentBlock.previousHash:
return False
return True
myCoin = BlockChain()
myCoin.addBlock(Block(1,"02/01/2018","{amount:4}"))
myCoin.addBlock(Block(2,"03/01/2018","{amount:5}"))
#print block info 打印區塊鏈信息
print("print block info ####:")
for block in myCoin.chain:
print(block)
#check blockchain is valid 檢查區塊鏈是不是有效的
print("before tamper block,blockchain is valid ###")
print(myCoin.chainIsValid())
#tamper the blockinfo 篡改區塊2的數據
myCoin.chain[1].data = "{amount:1002}"
print("after tamper block,blockchain is valid ###")
print(myCoin.chainIsValid())
輸出結果
print block info ####:
{'index': 0, 'timestamp': '01/01/2018', 'data': 'genesis block', 'previousHash': '0', 'hash': 'd8d21e5ba33780d5eb77d09d3b407ceb8ade4e5545ef951de1997b209d91e264'}
{'index': 1, 'timestamp': '02/01/2018', 'data': '{amount:4}', 'previousHash': 'd8d21e5ba33780d5eb77d09d3b407ceb8ade4e5545ef951de1997b209d91e264', 'hash': '15426e32db30f4b26aa719ba5e573f372f41e27e4728eb9e9ab0bea8eae63a9d'}
{'index': 2, 'timestamp': '03/01/2018', 'data': '{amount:5}', 'previousHash': '15426e32db30f4b26aa719ba5e573f372f41e27e4728eb9e9ab0bea8eae63a9d', 'hash': '75119e897f21c769acee6e32abcefc5e88e250a1f35cc95946379436050ac2f0'}
before tamper block,blockchain is valid ###
True
after tamper block,blockchain is valid ###
False
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的python构建区块链_用python构建区块链(1)---基本结构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: udhcpd解析域名_Linux作DHC
- 下一篇: 组态王延时启动程序_怎样用组态王软件实现