0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

用不到50行的 Python 2.x代碼實(shí)現(xiàn)一個(gè)簡(jiǎn)單的區(qū)塊鏈

阿銘linux ? 來(lái)源:未知 ? 作者:李倩 ? 2018-03-29 15:29 ? 次閱讀

雖然有些人認(rèn)為區(qū)塊鏈是一個(gè)早晚會(huì)出現(xiàn)問(wèn)題的解決方案,但是毫無(wú)疑問(wèn),這個(gè)創(chuàng)新技術(shù)是一個(gè)計(jì)算機(jī)技術(shù)上的奇跡。那么,究竟什么是區(qū)塊鏈呢?

區(qū)塊鏈

比特幣Bitcoin或其它加密貨幣按時(shí)間順序公開(kāi)地記錄交易的數(shù)字賬本。

更通俗的說(shuō),它是一個(gè)公開(kāi)的數(shù)據(jù)庫(kù),新的數(shù)據(jù)存儲(chǔ)在被稱之為區(qū)塊block的容器中,并被添加到一個(gè)不可變的鏈chain中(因此被稱為區(qū)塊鏈blockchain),之前添加的數(shù)據(jù)也在該鏈中。對(duì)于比特幣或其它加密貨幣來(lái)說(shuō),這些數(shù)據(jù)就是一組組交易,不過(guò),也可以是其它任何類型的數(shù)據(jù)。

區(qū)塊鏈技術(shù)帶來(lái)了全新的、完全數(shù)字化的貨幣,如比特幣和萊特幣Litecoin,它們并不由任何中心機(jī)構(gòu)管理。這給那些認(rèn)為當(dāng)今的銀行系統(tǒng)是騙局并將最終走向失敗的人帶來(lái)了自由。區(qū)塊鏈也革命性地改變了分布式計(jì)算的技術(shù)形式,如以太坊Ethereum就引入了一種有趣的概念:智能合約smart contract。

在這篇文章中,我將用不到 50 行的 Python 2.x 代碼實(shí)現(xiàn)一個(gè)簡(jiǎn)單的區(qū)塊鏈,我把它叫做 SnakeCoin。

不到 50 行代碼的區(qū)塊鏈

我們首先將從定義我們的區(qū)塊是什么開(kāi)始。在區(qū)塊鏈中,每個(gè)區(qū)塊隨同時(shí)間戳及可選的索引一同存儲(chǔ)。在 SnakeCoin 中,我們會(huì)存儲(chǔ)這兩者。為了確保整個(gè)區(qū)塊鏈的完整性,每個(gè)區(qū)塊都會(huì)有一個(gè)自識(shí)別的哈希值。如在比特幣中,每個(gè)區(qū)塊的哈希是該塊的索引、時(shí)間戳、數(shù)據(jù)和前一個(gè)區(qū)塊的哈希值等數(shù)據(jù)的加密哈希值。這里提及的“數(shù)據(jù)”可以是任何你想要的數(shù)據(jù)。

真棒,現(xiàn)在我們有了區(qū)塊的結(jié)構(gòu)了,不過(guò)我們需要?jiǎng)?chuàng)建的是一個(gè)區(qū)塊鏈。我們需要把區(qū)塊添加到一個(gè)實(shí)際的鏈中。如我們之前提到過(guò)的,每個(gè)區(qū)塊都需要前一個(gè)區(qū)塊的信息。但問(wèn)題是,該區(qū)塊鏈中的第一個(gè)區(qū)塊在哪里?好吧,這個(gè)第一個(gè)區(qū)塊,也稱之為創(chuàng)世區(qū)塊,是一個(gè)特別的區(qū)塊。在很多情況下,它是手工添加的,或通過(guò)獨(dú)特的邏輯添加的。

我們將創(chuàng)建一個(gè)函數(shù)來(lái)簡(jiǎn)單地返回一個(gè)創(chuàng)世區(qū)塊解決這個(gè)問(wèn)題。這個(gè)區(qū)塊的索引為 0 ,其包含一些任意的數(shù)據(jù)值,其“前一哈希值”參數(shù)也是任意值。

現(xiàn)在我們可以創(chuàng)建創(chuàng)世區(qū)塊了,我們需要一個(gè)函數(shù)來(lái)生成該區(qū)塊鏈中的后繼區(qū)塊。該函數(shù)將獲取鏈中的前一個(gè)區(qū)塊作為參數(shù),為要生成的區(qū)塊創(chuàng)建數(shù)據(jù),并用相應(yīng)的數(shù)據(jù)返回新的區(qū)塊。新的區(qū)塊的哈希值來(lái)自于之前的區(qū)塊,這樣每個(gè)新的區(qū)塊都提升了該區(qū)塊鏈的完整性。如果我們不這樣做,外部參與者就很容易“改變過(guò)去”,把我們的鏈替換為他們的新鏈了。這個(gè)哈希鏈起到了加密的證明作用,并有助于確保一旦一個(gè)區(qū)塊被添加到鏈中,就不能被替換或移除。

這就是主要的部分。

現(xiàn)在我們能創(chuàng)建自己的區(qū)塊鏈了!在這里,這個(gè)區(qū)塊鏈?zhǔn)且粋€(gè)簡(jiǎn)單的 Python 列表。其第一個(gè)的元素是我們的創(chuàng)世區(qū)塊,我們會(huì)添加后繼區(qū)塊。因?yàn)?SnakeCoin 是一個(gè)極小的區(qū)塊鏈,我們僅僅添加了 20 個(gè)區(qū)塊。我們通過(guò)循環(huán)來(lái)完成它。

讓我們看看我們的成果:

別擔(dān)心,它將一直添加到 20 個(gè)區(qū)塊

很好,我們的區(qū)塊鏈可以工作了。如果你想要在主控臺(tái)查看更多的信息,你可以編輯其完整的源代碼并輸出每個(gè)區(qū)塊的時(shí)間戳或數(shù)據(jù)。

這就是 SnakeCoin 所具有的功能。要使 SnakeCoin 達(dá)到現(xiàn)今的產(chǎn)品級(jí)的區(qū)塊鏈的高度,我們需要添加更多的功能,如服務(wù)器層,以在多臺(tái)機(jī)器上跟蹤鏈的改變,并通過(guò)工作量證明算法(POW)來(lái)限制給定時(shí)間周期內(nèi)可以添加的區(qū)塊數(shù)量。

讓這個(gè)極小區(qū)塊鏈稍微變大些

這個(gè)極小的區(qū)塊鏈及其簡(jiǎn)單,自然也相對(duì)容易完成。但是因其簡(jiǎn)單也帶來(lái)了一些缺陷。首先,SnakeCoin 僅能運(yùn)行在單一的一臺(tái)機(jī)器上,所以它相距分布式甚遠(yuǎn),更別提去中心化了。其次,區(qū)塊添加到區(qū)塊鏈中的速度同在主機(jī)上創(chuàng)建一個(gè) Python 對(duì)象并添加到列表中一樣快。在我們的這個(gè)簡(jiǎn)單的區(qū)塊鏈中,這不是問(wèn)題,但是如果我們想讓 SnakeCoin 成為一個(gè)實(shí)際的加密貨幣,我們就需要控制在給定時(shí)間內(nèi)能創(chuàng)建的區(qū)塊(和幣)的數(shù)量。

從現(xiàn)在開(kāi)始,SnakeCoin 中的“數(shù)據(jù)”將是交易數(shù)據(jù),每個(gè)區(qū)塊的“數(shù)據(jù)”字段都將是一些交易信息的列表。接著我們來(lái)定義“交易”。每個(gè)“交易”是一個(gè) JSON 對(duì)象,其記錄了幣的發(fā)送者、接收者和轉(zhuǎn)移的 SnakeCoin 數(shù)量。注:交易信息是 JSON 格式,原因我很快就會(huì)說(shuō)明。

現(xiàn)在我們知道了交易信息看起來(lái)的樣子了,我們需要一個(gè)辦法來(lái)將其加到我們的區(qū)塊鏈網(wǎng)絡(luò)中的一臺(tái)計(jì)算機(jī)(稱之為節(jié)點(diǎn))中。要做這個(gè)事情,我們會(huì)創(chuàng)建一個(gè)簡(jiǎn)單的 HTTP 服務(wù)器,以便每個(gè)用戶都可以讓我們的節(jié)點(diǎn)知道發(fā)生了新的交易。節(jié)點(diǎn)可以接受 POST 請(qǐng)求,請(qǐng)求數(shù)據(jù)為如上的交易信息。這就是為什么交易信息是 JSON 格式的:我們需要它們可以放在請(qǐng)求信息中傳遞給服務(wù)器。

真棒!現(xiàn)在我們有了一種保存用戶彼此發(fā)送 SnakeCoin 的記錄的方式。這就是為什么人們將區(qū)塊鏈稱之為公共的、分布式賬本:所有的交易信息存儲(chǔ)給所有人看,并被存儲(chǔ)在該網(wǎng)絡(luò)的每個(gè)節(jié)點(diǎn)上。

但是,有個(gè)問(wèn)題:人們從哪里得到 SnakeCoin 呢?現(xiàn)在還沒(méi)有辦法得到,還沒(méi)有一個(gè)稱之為 SnakeCoin 這樣的東西,因?yàn)槲覀冞€沒(méi)有創(chuàng)建和分發(fā)任何一個(gè)幣。要?jiǎng)?chuàng)建新的幣,人們需要“挖”一個(gè)新的 SnakeCoin 區(qū)塊。當(dāng)他們成功地挖到了新區(qū)塊,就會(huì)創(chuàng)建出一個(gè)新的 SnakeCoin ,并獎(jiǎng)勵(lì)給挖出該區(qū)塊的人(礦工)。一旦挖礦的礦工將 SnakeCoin 發(fā)送給別人,這個(gè)幣就流通起來(lái)了。

我們不想讓挖新的 SnakeCoin 區(qū)塊太容易,因?yàn)檫@將導(dǎo)致 SnakeCoin 太多了,其價(jià)值就變低了;同樣,我們也不想讓它變得太難,因?yàn)槿绻麤](méi)有足夠的幣供每個(gè)人使用,它們對(duì)于我們來(lái)說(shuō)就太昂貴了。為了控制挖新的 SnakeCoin 區(qū)塊的難度,我們會(huì)實(shí)現(xiàn)一個(gè)工作量證明Proof-of-Work(PoW)算法。工作量證明基本上就是一個(gè)生成某個(gè)項(xiàng)目比較難,但是容易驗(yàn)證(其正確性)的算法。這個(gè)項(xiàng)目被稱之為“證明”,聽(tīng)起來(lái)就像是它證明了計(jì)算機(jī)執(zhí)行了特定的工作量。

在 SnakeCoin 中,我們創(chuàng)建了一個(gè)簡(jiǎn)單的 PoW 算法。要?jiǎng)?chuàng)建一個(gè)新區(qū)塊,礦工的計(jì)算機(jī)需要遞增一個(gè)數(shù)字,當(dāng)該數(shù)字能被 9 (“SnakeCoin” 這個(gè)單詞的字母數(shù))整除時(shí),這就是最后這個(gè)區(qū)塊的證明數(shù)字,就會(huì)挖出一個(gè)新的 SnakeCoin 區(qū)塊,而該礦工就會(huì)得到一個(gè)新的 SnakeCoin。

我們差不多就要完成了。在運(yùn)行了完整的 SnakeCoin 服務(wù)器代碼之后,在你的終端可以運(yùn)行如下代碼。(假設(shè)你已經(jīng)安裝了 cCUL)。

對(duì)代碼做下美化處理,我們看到挖礦后我們得到的新區(qū)塊的信息:

大功告成!現(xiàn)在 SnakeCoin 可以運(yùn)行在多個(gè)機(jī)器上,從而創(chuàng)建了一個(gè)網(wǎng)絡(luò),而且真實(shí)的 SnakeCoin 也能被挖到了。

你可以根據(jù)你的喜好去修改 SnakeCoin 服務(wù)器代碼,并問(wèn)各種問(wèn)題了。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • python
    +關(guān)注

    關(guān)注

    55

    文章

    4767

    瀏覽量

    84375
  • 區(qū)塊鏈
    +關(guān)注

    關(guān)注

    110

    文章

    15559

    瀏覽量

    105592

原文標(biāo)題:用python構(gòu)建一個(gè)極小的區(qū)塊鏈

文章出處:【微信號(hào):aming_linux,微信公眾號(hào):阿銘linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    教你用Python從0開(kāi)始創(chuàng)建個(gè)區(qū)塊

    對(duì)數(shù)字貨幣的崛起感到新奇的我們,并且想知道其背后的技術(shù)——區(qū)塊是怎樣實(shí)現(xiàn)的。本文通過(guò) Python 構(gòu)建
    的頭像 發(fā)表于 04-20 06:55 ?6160次閱讀
    教你用<b class='flag-5'>Python</b>從0開(kāi)始創(chuàng)建<b class='flag-5'>一</b><b class='flag-5'>個(gè)</b><b class='flag-5'>區(qū)塊</b><b class='flag-5'>鏈</b>

    分享50條經(jīng)典的Python一行代碼

    今天浩道跟大家分享python學(xué)習(xí)過(guò)程中非常經(jīng)典的50一行代碼,讓大家體驗(yàn)它簡(jiǎn)潔而功能強(qiáng)大的特點(diǎn)。同時(shí)給大家分享號(hào)主收集到的所有關(guān)于python
    發(fā)表于 08-16 15:00 ?992次閱讀

    簡(jiǎn)單學(xué)學(xué)之課堂二:區(qū)塊的透明性指的是什么?

    的基礎(chǔ)上教學(xué)習(xí)者如何去查詢轉(zhuǎn)賬信息。 般說(shuō)到透明,大致包括兩個(gè)含義:1)用來(lái)形容物體能透過(guò)光線的,例如水是透明的;2)比喻公開(kāi),不隱藏。如:透明度。此次課堂里說(shuō)的透明就是指公開(kāi)、不隱藏。說(shuō)到
    發(fā)表于 01-05 14:19

    什么是區(qū)塊 區(qū)塊有什么用

    與存儲(chǔ)數(shù)據(jù)、利用分布式節(jié)點(diǎn)共識(shí)算法來(lái)生成和更新數(shù)據(jù)、利用密碼學(xué)的方式保證數(shù)據(jù)傳輸和訪問(wèn)的安全、利用由自動(dòng)化腳本代碼組成的智能合約來(lái)編程和操作數(shù)據(jù)的種全新的分布式基礎(chǔ)架構(gòu)與計(jì)算范式。 簡(jiǎn)單地說(shuō),
    發(fā)表于 03-26 11:31

    區(qū)塊軟件開(kāi)發(fā)公司談未來(lái)區(qū)塊的主要應(yīng)用方向

    。它使用由自動(dòng)腳本代碼組成的智能契約對(duì)數(shù)據(jù)進(jìn)行編程和操作。以下是未來(lái)世界區(qū)塊應(yīng)用的四個(gè)方面?! ?、財(cái)務(wù)管理行業(yè)  區(qū)塊
    發(fā)表于 11-22 16:54

    區(qū)塊將如何優(yōu)化產(chǎn)業(yè)?

    的新區(qū)塊渠道的興起,運(yùn)用和基礎(chǔ)渠道開(kāi)端解耦合,在以太坊開(kāi)發(fā)的更為完善的區(qū)塊基礎(chǔ)協(xié)議上面,開(kāi)發(fā)者可以開(kāi)發(fā)各式各樣的去中心化運(yùn)用(Dap
    發(fā)表于 12-13 15:19

    區(qū)塊在其他領(lǐng)域的些應(yīng)用

    通過(guò)區(qū)塊技術(shù)的匿名性和數(shù)據(jù)公開(kāi)透明性,就可以實(shí)現(xiàn)數(shù)據(jù)的前臺(tái)匿名、后臺(tái)實(shí)名可控,以及區(qū)塊的可溯源、不可篡改等特性,是可以運(yùn)用在法定的數(shù)字貨
    發(fā)表于 01-07 17:42

    企業(yè)結(jié)合區(qū)塊創(chuàng)建區(qū)塊技術(shù)落地應(yīng)用有什么特色

    操作都會(huì)使得賬冊(cè)狀態(tài)發(fā)生改變,比如增加條記錄;(2區(qū)塊(Block):記錄某段時(shí)間內(nèi)發(fā)生的所有交易和狀態(tài)結(jié)果,是對(duì)當(dāng)前賬本狀態(tài)的次共識(shí);(3)
    發(fā)表于 12-19 11:30

    區(qū)塊+從全球50個(gè)案例看區(qū)塊的應(yīng)用與未來(lái)》高清pdf

    區(qū)塊+從全球50個(gè)案例看區(qū)塊的應(yīng)用與未來(lái)》高清pdf百度網(wǎng)盤(pán)鏈接: https://pan
    發(fā)表于 03-13 00:42

    區(qū)塊錢(qián)包軟件開(kāi)發(fā),區(qū)塊錢(qián)包源碼搭建

    什么是區(qū)塊錢(qián)包?區(qū)塊錢(qián)包本質(zhì)上是個(gè)工具,目前絕大多數(shù)的
    發(fā)表于 05-26 16:30

    區(qū)塊分成兩部分, 一個(gè)區(qū)塊,一個(gè)

    就稱之為“區(qū)塊(block)”。以比特幣的區(qū)塊為例,它完整記錄了網(wǎng)絡(luò)上的每筆歷史交易,好比是個(gè)
    發(fā)表于 03-20 08:55

    什么是區(qū)塊?區(qū)塊都有哪些應(yīng)用?

    什么是區(qū)塊?區(qū)塊未來(lái)的應(yīng)用前景怎樣?
    發(fā)表于 06-28 09:20

    如何使用50Python代碼實(shí)現(xiàn)AI的動(dòng)作平衡

    本文將為大家展示如何通過(guò) Numpy 庫(kù)和 50 Python 代碼,使用標(biāo)準(zhǔn)的 OpenAI Gym平臺(tái)創(chuàng)建智能體 (agent),就教會(huì)機(jī)器處理推車桿問(wèn)題 (cart pole
    的頭像 發(fā)表于 06-16 10:40 ?3084次閱讀

    python設(shè)計(jì)個(gè)簡(jiǎn)單推薦系統(tǒng)的資料和完整代碼

    本文檔的主要內(nèi)容詳細(xì)介紹的是python設(shè)計(jì)個(gè)簡(jiǎn)單推薦系統(tǒng)的資料和完整代碼免費(fèi)下載。
    發(fā)表于 03-30 09:32 ?14次下載

    如何在Rust項(xiàng)目中使用InfluxDB 2.x

    Rust是種系統(tǒng)編程語(yǔ)言,它具有高性能、內(nèi)存安全和并發(fā)性等特點(diǎn)。InfluxDB是個(gè)開(kāi)源的時(shí)序數(shù)據(jù)庫(kù),它專門(mén)用于存儲(chǔ)和查詢時(shí)間序列數(shù)據(jù)。InfluxDB 2.x是InfluxDB的
    的頭像 發(fā)表于 09-19 16:33 ?627次閱讀