<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 4383字,需瀏覽 9分鐘

           ·

          2021-01-13 18:10

          文 |?太陽雪

          來源: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)容不錯的話,記得分享朋友圈讓更多的人知道!

          代碼獲取方式

          識別文末二維碼,回復:210112

          瀏覽 49
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  伊人久久久大香蕉 | 久久久久99精品欧美成人 | 国产女人18水真多18精品一级做 | 日本黄色视频免费在线 | 久久久人体 |