比特幣漲瘋了,區(qū)塊鏈是什么鬼?

文 |?太陽雪
來源:Python 技術(shù)「ID: pythonall」

2020 年底,數(shù)字貨幣鼻祖,比特幣,高歌猛進,突破了驚人的 3萬美元,直逼4萬美元,再一次引起世人的眼球,又是一場褒貶不一,血雨腥風……

我們作為有頭腦、有理智、有技術(shù)的人,不能像大多數(shù)人那樣趨之若鶩,看個熱鬧就完了。那么這么厲害的、建立在計算機和網(wǎng)絡(luò)之上的比特幣,它的底層技術(shù)是什么呢?又,是如何才能實現(xiàn)的呢?
今天,我們用不到 50 行的代碼,了解和領(lǐng)略一下比特幣底層技術(shù) —— 區(qū)塊鏈的魅力吧,另外還有在實際項目中的應用噢,讓同事刮目相看的機會來了,開干
什么是區(qū)塊鏈
簡單來說,區(qū)塊鏈就是一系列的記錄的集合,可以理解成數(shù)據(jù)庫,不同的是,這些記錄直接都通過一種類型鏈的東西串聯(lián)在一起
如果鏈上的一個環(huán)節(jié)出了問題,那么它后面的記錄就有問題,因此必須保證鏈上的記錄都是真實可靠的鏈在一起的
也就是,后面的記錄加入之前,需要和前面的數(shù)據(jù)關(guān)聯(lián)起來才能加入
可想而知,這樣的方式可以有效地防止數(shù)據(jù)被篡改,比如前面的數(shù)據(jù)被修改后,后面的數(shù)據(jù)與前面的數(shù)據(jù)將不匹配,很快就可以發(fā)現(xiàn)
這就是區(qū)塊鏈的基本概念,就在這個簡單的概念上,區(qū)塊鏈催生了新的、完全數(shù)字化的貨幣,這些貨幣并不是由中心控制系統(tǒng)控制的,而是分布在整個互聯(lián)網(wǎng)上,如比特幣和萊特幣。
而且區(qū)塊鏈技術(shù)還在不斷地革新,例如以太坊,Mixin 等等
區(qū)塊鏈的原理
區(qū)塊鏈的概念看起來挺簡單的,實現(xiàn)原理是什么呢?
這里就需要了解一個概念,那就是 數(shù)字簽名,也可以叫做 不對稱加密
因為信息是由一系列字符成的,對于一個區(qū)塊的記錄來說,也可以看出一系列的字符,比如一個表示姓名和年齡的字符串:
name:Tom;age:18
對這個字符串進行 Md5 加密(一種常用的數(shù)字簽名算法),會得到類似這樣的字符串:
from?hashlib?import?md5
m?=?md5()
m.update(b"name:Tom;age:18")
m.hexdigest()
#?'ca8d85b134922fe48d17bf36ceb38046'??當前記錄的特征碼
可以理解為記錄的一個特征碼
如果再來一條記錄:name:Jim;age:19
特征碼很好計算,不過怎么和上一條記錄鏈接起來呢?
方法就是將上一個記錄的特征碼,一起編織在這一條的特征碼中,例如:
lastHash:ca8d85b134922fe48d17bf36ceb38046;name:Jim;age:19
然后得到特征碼:
from?hashlib?import?md5
m?=?md5()
m.update(b"lastHash:ca8d85b134922fe48d17bf36ceb38046;name:Jim;age:19")
m.hexdigest()
#?'82391695a3760b2de1c92d512b83cc14'??當前記錄的特征碼
這樣就完成了記錄直接的鏈接
經(jīng)驗一條記錄是否被修改,或者連續(xù),只需要對這條記錄和其上一記錄一起重算一次特征碼就好了

當然,比特幣,或者由實際應用的區(qū)塊鏈會更為復雜,比如字段、加密算法等
實現(xiàn)一個區(qū)塊鏈
下面,我們來實現(xiàn)一個比較完整的區(qū)塊鏈
首先定義一個區(qū)塊類:
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)).encode("utf-8"))
????????return?sha.hexdigest()
初始化方法中,初始化了當前區(qū)塊的索引、時間戳、數(shù)據(jù)(業(yè)務相關(guān)的信息)、緊前區(qū)塊(上一個區(qū)塊)的特征值,和當前區(qū)塊的特征值 hash_block根據(jù)初始化中的一些信息,得到一個特征值,就是用它來計算當前區(qū)塊的特征值
接下來,區(qū)塊鏈中的第一個區(qū)塊的特征值如何計算,它的緊前特征值是什么?
我們來定義一個產(chǎn)生 起始區(qū)塊 的方法:
def?create_genesis_block():
????#?手工創(chuàng)建第一個區(qū)塊,其索引為?0,且隨意取給緊前特征值?'0'
????return?Block(0,?date.datetime.now(),?"Genesis?Block",?"0")
然后,我們定義一個生成新區(qū)塊的方法:
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)
參數(shù)是 緊前區(qū)塊對象對索引做遞增處理 得到當前時間戳 產(chǎn)生區(qū)塊業(yè)務數(shù)據(jù)(為了簡便只做了相對固定的內(nèi)容) 記錄上個區(qū)塊的特征值 最后根據(jù)以上信息,得到一個新區(qū)塊
現(xiàn)在所有的基礎(chǔ)工作已經(jīng)完成了,我們建立一個區(qū)塊數(shù)據(jù)庫,即區(qū)塊鏈,并計入第一個區(qū)塊
blockchain?=?[create_genesis_block()]
最后我們模擬一個產(chǎn)生區(qū)塊的過程:
#?設(shè)置產(chǎn)生區(qū)塊的個數(shù)
num_of_blocks_to_add?=?20
#?產(chǎn)生區(qū)塊并加入?yún)^(qū)塊鏈
for?i?in?range(0,?num_of_blocks_to_add):
????previous_block?=?blockchain[-1]
????block_to_add?=?next_block(previous_block)
????blockchain.append(block_to_add)
????#?發(fā)布當前區(qū)塊的信息
????print("Block?#{}?has?been?added?to?the?blockchain!".format(block_to_add.index))
????print("Hash:?{}\n".format(block_to_add.hash))
運行后,我們可以得到如下結(jié)果:
Block #1 has been added to the blockchain!
Hash: 788ec79310315740f7df959e03c8788f102c3e02d6b6ce6488ed7b7d04cc3e01
Block #2 has been added to the blockchain!
Hash: 5b6c6e0be9659ae359356015ffe9ba9e4645f181d848bfd5127dd24d29f1747c
Block #3 has been added to the blockchain!
Hash: c40e3accb5de25728770754f24d7504cc72b8138d465f5d8f1b84ad149c9b59c
Block #4 has been added to the blockchain!
Hash: 9a118b7c8b90aaab2fe6a59dd84224adb90ba4af8aaa03bf4c9b08799cc81d9b
Block #5 has been added to the blockchain!
Hash: f8fbd5b6684d926fb96dd36b89f61db3c868...<省略>...
顯示的結(jié)果就是區(qū)塊鏈上的信息
實際當中,是在分布式環(huán)境下運行的,需要考慮更多的因素,如調(diào)度,合并,以及選舉等,加密算法也需要更為安全,例如常用的是 橢圓曲線加密算法(ECC), 來加強區(qū)塊鏈的安全性和可靠性,但最基本的實現(xiàn)邏輯是一樣的。
應用
有句虐心的話:
明白了很多道理,卻還是過不好這一生
雖然粗淺地了解了區(qū)塊鏈的基本概念和實現(xiàn),然而有什么用呢?
既不能取改比特幣(再說也不需要改),也不能創(chuàng)建一個區(qū)塊鏈應用(雖然不是不可能)
不過這種思想可以在很多地方得到應用
這里我列舉一個我實際工作中的例子:
在一個項目上,需要實現(xiàn)一個審計日志功能,基本要求就是需要連續(xù)并防篡改
如果不了解區(qū)塊鏈的算法的話,可能需要考慮半天,然后得到一個蹩腳的方式,比如用額外的記錄來控制日志記錄,或者記錄關(guān)聯(lián)關(guān)系(之前確實這么干過)
現(xiàn)在,只需要在記錄中增加兩個字段:上一個記錄的特征碼 和 當前特征碼
再實現(xiàn)一個,根據(jù)指定字段,計算特征碼的方法
為了便于識別,再加一個檢驗方法,就好了
除了這樣的應用,你還能想到哪些應用呢?歡迎留言交流
總結(jié)
截至寫稿(2021年1月9日),比特幣的價格已經(jīng)接近 27 萬了,如此受熱捧(也不是一直這么熱,理財有風險,投資需謹慎),而其內(nèi)在原理竟然如此簡單
基于加密算法就可以完成可以承載巨大信息量的數(shù)據(jù)貨幣世界,這就是所謂 越簡單的, 就越有效和穩(wěn)定 的恰當解釋
無論什么事物,總有其內(nèi)在的基本原理和理論做支撐,只有了解和掌握了其內(nèi)部原理,才能更好地認識一個事物,我們只需要多一些好奇心,多一點耐心就好,比心
參考
區(qū)塊鏈白皮書: https://bitcoin.org/bitcoin.pdf https://zhuanlan.zhihu.com/p/28595570 https://zhuanlan.zhihu.com/p/101907402
PS:公號內(nèi)回復「Python」即可進入Python 新手學習交流群,一起 100 天計劃!
老規(guī)矩,兄弟們還記得么,右下角的 “在看” 點一下,如果感覺文章內(nèi)容不錯的話,記得分享朋友圈讓更多的人知道!


【代碼獲取方式】
