前言
本文將給大家簡(jiǎn)單介紹關(guān)于區(qū)塊鏈(BlockChain)的相關(guān)知識(shí),并用Python做一簡(jiǎn)單實(shí)現(xiàn)。下面話不多說(shuō),來(lái)一起看看詳細(xì)的介紹:
什么是區(qū)塊鏈
簡(jiǎn)單來(lái)說(shuō),區(qū)塊鏈就是把加密數(shù)據(jù)(區(qū)塊)按照時(shí)間順序進(jìn)行疊加(鏈)生成的永久、不可逆向修改的記錄。具體來(lái)說(shuō),它區(qū)塊鏈?zhǔn)怯梢淮褂妹艽a學(xué)方法產(chǎn)生的數(shù)據(jù)塊組成的,每一個(gè)區(qū)塊都包含了上一個(gè)區(qū)塊的哈希值(hash),從創(chuàng)始區(qū)塊(genesis block)開始連接到當(dāng)前區(qū)塊,形成塊鏈。每一個(gè)區(qū)塊都確保按照時(shí)間順序在上一個(gè)區(qū)塊之后產(chǎn)生,否則前一個(gè)區(qū)塊的哈希值是未知的。它是比特幣的一個(gè)重要概念。
特點(diǎn)
區(qū)塊鏈有如下特點(diǎn):
去中心化:區(qū)塊鏈不依賴于某個(gè)中心節(jié)點(diǎn),而是依賴于分布式的各個(gè)節(jié)點(diǎn)。
無(wú)須信任系統(tǒng):區(qū)塊鏈中基于密碼學(xué)算法,數(shù)據(jù)需要網(wǎng)絡(luò)內(nèi)其他用戶的批準(zhǔn),所以不需要一套第三方中介結(jié)構(gòu)或信任機(jī)構(gòu)背書。
不可篡改和加密安全性:區(qū)塊鏈采取單向哈希算法,同時(shí)每個(gè)新產(chǎn)生的區(qū)塊嚴(yán)格按照時(shí)間線形順序推進(jìn),時(shí)間的不可逆性導(dǎo)致任何試圖入侵篡改區(qū)塊鏈內(nèi)數(shù)據(jù) 信息的行為都很容易被追溯,導(dǎo)致被其他節(jié)點(diǎn)的排斥,從而可以限制相關(guān)不法行為。
以上特點(diǎn)使得區(qū)塊鏈在銀行、證券市場(chǎng)和金融等諸多領(lǐng)域有著越來(lái)越多的應(yīng)用。
區(qū)塊鏈工作原理
區(qū)塊鏈?zhǔn)揭幌盗屑用艿臄?shù)據(jù)塊。這些區(qū)塊由一個(gè)包含元數(shù)據(jù)的區(qū)塊頭和緊跟其后的構(gòu)成區(qū)塊主體的一長(zhǎng)串交易組成。比特幣中的區(qū)塊結(jié)構(gòu)如下:
區(qū)塊頭
區(qū)塊頭中包含了與區(qū)塊鏈中其它區(qū)塊中的連接信息、時(shí)間戳和nonce等信息,具體如下:
區(qū)塊標(biāo)識(shí)符
區(qū)塊有兩個(gè)標(biāo)示符,一是區(qū)塊頭的哈希值,二是區(qū)塊高度。區(qū)塊頭的哈希值是通過(guò)SHA256算法對(duì)區(qū)塊頭進(jìn)行二次哈希計(jì)算而得到的數(shù)字。區(qū)塊哈希值可以唯一、明確地標(biāo)識(shí)一個(gè)區(qū)塊,并且任何節(jié)點(diǎn)通過(guò)簡(jiǎn)單地對(duì)區(qū)塊頭進(jìn)行哈希計(jì)算都可以獨(dú)立地獲取該區(qū)塊哈希值。區(qū)塊高度是指該區(qū)塊在區(qū)塊鏈中的位置。區(qū)塊高度并不是唯一的標(biāo)識(shí)符。雖然一個(gè)單一的區(qū)塊總是會(huì)有一個(gè)明確的、固定的區(qū)塊高度,但反過(guò)來(lái)卻并不成立,一個(gè)區(qū)塊高度并不總是識(shí)別一個(gè)單一的區(qū)塊。兩個(gè)或兩個(gè)以上的區(qū)塊可能有相同的區(qū)塊高度,在區(qū)塊鏈里爭(zhēng)奪同一位置。
了解了以上基礎(chǔ)后下面開始用Python實(shí)現(xiàn)一個(gè)簡(jiǎn)單的區(qū)塊鏈。
區(qū)塊鏈的Python實(shí)現(xiàn)
一、定義區(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)生唯一標(biāo)示 self.nonce = None # nonce值 self.data = data # 區(qū)塊內(nèi)容 self.previous_hash = previous_hash # 父節(jié)點(diǎn)哈希值 def hash(self, nonce=None): ''' 計(jì)算區(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): ''' 校驗(yàn)區(qū)塊哈希值有否有效 ''' return the_hash.startswith('0000') def __repr__(self): return 'Block<Hash: {}, Nonce: {}>'.format(self.hash(), self.nonce)
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com