007-046-越寫越快樂之淺談POW算法

比特幣 - 圖片來自網(wǎng)絡

今天的越學越快樂系列文章為大家?guī)鞵OW算法的簡單介紹和基本使用,讓大家對比特幣、以太坊等數(shù)字貨幣的共識算法有個基本的認識。

什么是POW算法

POW是指工作量證明(Proof of Work)的簡稱概漱,也就是剛開始比特幣設(shè)計者中本聰使用的共識算法,也就是激勵人們進行挖礦(證明自己的工作成果)的共識機制喜喂,正是這種機制實現(xiàn)了去中心化的安全瓤摧。

礦工們(人為財死,鳥為食亡)在挖礦(通常會在挖礦節(jié)點玉吁,也就是連接到比特幣網(wǎng)絡中進行哈希計算并得到正確結(jié)果的節(jié)點)過程中得到兩種類型的交易:創(chuàng)建新區(qū)塊的新幣獎勵照弥,以及區(qū)塊中所包含交易的交易費

要說到這個POW,我們必須提一下哈希函數(shù)进副,也就是輸入一個任意長度的數(shù)據(jù)这揣,輸出得到一個固定長度且絕不雷同的值,可以將其視為輸入的數(shù)字指紋影斑。目前比特幣给赞、以太坊等都是SHA256算法來計算某個數(shù)據(jù)的函數(shù)值,也就是通過哈希函數(shù)得到該數(shù)據(jù)的數(shù)字指紋矫户,通過這個數(shù)字指紋來驗證比特幣中的交易等信息片迅。那我們接下來看看在Python中如何簡單地實現(xiàn)POW算法,具體事例如下

#!/usr/bin/env python
# example of proof-of-work algorithm

import hashlib
import time

try:
    long        # Python 2
    xrange
except NameError:
    long = int  # Python 3
    xrange = range

max_nonce = 2 ** 32  # 4 billion

def proof_of_work(header, difficulty_bits):
    # calculate the difficulty target
    target = 2 ** (256 - difficulty_bits)

    for nonce in xrange(max_nonce):
        hash_result = hashlib.sha256(str(header) + str(nonce)).hexdigest()

        # check if this is a valid result, below the target
        if long(hash_result, 16) < target:
            print("Success with nonce %d" % nonce)
            print("Hash is %s" % hash_result)
            return (hash_result, nonce)

    print("Failed after %d (max_nonce) tries" % nonce)
    return nonce

if __name__ == '__main__':
    nonce = 0
    hash_result = ''

    # difficulty from 0 to 31 bits
    for difficulty_bits in xrange(32):
        difficulty = 2 ** difficulty_bits
        print("Difficulty: %ld (%d bits)" % (difficulty, difficulty_bits))
        print("Starting search...")

        # checkpoint the current time
        start_time = time.time()

        # make a new block which includes the hash from the previous block
        # we fake a block of transactions - just a string
        new_block = 'test block with transactions' + hash_result

        # find a valid nonce for the new block
        (hash_result, nonce) = proof_of_work(new_block, difficulty_bits)

        # checkpoint how long it took to find a result
        end_time = time.time()

        elapsed_time = end_time - start_time
        print("Elapsed Time: %.4f seconds" % elapsed_time)

        if elapsed_time > 0:

            # estimate the hashes per second
            hash_power = float(long(nonce) / elapsed_time)
            print("Hashing Power: %ld hashes per second" % hash_power)

以上代碼來自精《通比特幣》書中的POW示例

接下來我在本地運行一下這個示例代碼python proof-of-work-example.py吏垮,執(zhí)行完成后可以看到有如下輸出

執(zhí)行結(jié)果部分輸出 - 圖片來自簡書App

從以上的輸出結(jié)果我們可以看到挖礦難度影響著比特幣產(chǎn)生的效率障涯,這個挖礦難度會根據(jù)整個比特幣網(wǎng)絡的算了進行調(diào)整,也就是說要產(chǎn)生新的區(qū)塊必須擁有更多的算力膳汪,也就是將更多的電力轉(zhuǎn)化為哈希算力唯蝶。

怎么在區(qū)塊鏈的世界里也有能量守恒的規(guī)律呢?

POW算法用在何處

在數(shù)字貨幣領(lǐng)域用在比特幣遗嗽、以太坊等主流的公有鏈上粘我,也可以用在聯(lián)盟鏈和私有鏈上

為什么要使用POW算法

這是最初使用在比特幣網(wǎng)絡上的共識機制,也是比特幣世界中的人們達成的去中心化的規(guī)則或者說協(xié)議痹换,正是這些協(xié)議才使得比特幣安全地運行十年(雖然在這過程中出現(xiàn)了分叉等問題征字,但是這也是比特幣網(wǎng)絡不斷發(fā)展演進的結(jié)果)。我想也正是中本聰基于當時技術(shù)并設(shè)計出一種電子現(xiàn)金系統(tǒng)并應用在當時尚未成熟的電子支付市場娇豫,是一次大膽而具有偉大變革意義的創(chuàng)新吧匙姜。

個人感想

當然現(xiàn)階段,我對于POW算法的理解比較粗淺冯痢,對于比特幣的設(shè)計氮昧、原理和運行機制更是一知半解框杜,我希望在此學習和探索比特幣、以太坊的道路上有更多的人去貢獻自己的一份力量袖肥,我更期待數(shù)字貨幣能帶來前所未有的變革和業(yè)務進化吧咪辱。這也是我第二遍讀《精通比特幣》這本書,我到現(xiàn)在才明白“書讀百遍其義自見”的這樣淺顯的道理椎组。要是我的文章對你有所幫助油狂,那將是我莫大的榮幸。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末寸癌,一起剝皮案震驚了整個濱河市专筷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌灵份,老刑警劉巖仁堪,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異填渠,居然都是意外死亡弦聂,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門氛什,熙熙樓的掌柜王于貴愁眉苦臉地迎上來莺葫,“玉大人,你說我怎么就攤上這事枪眉∞嗝剩” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵贸铜,是天一觀的道長堡纬。 經(jīng)常有香客問我,道長蒿秦,這世上最難降的妖魔是什么烤镐? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮棍鳖,結(jié)果婚禮上炮叶,老公的妹妹穿的比我還像新娘。我一直安慰自己渡处,他們只是感情好镜悉,可當我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著医瘫,像睡著了一般侣肄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上醇份,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天茫孔,我揣著相機與錄音叮喳,去河邊找鬼。 笑死缰贝,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的畔濒。 我是一名探鬼主播剩晴,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼侵状!你這毒婦竟也來了赞弥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤趣兄,失蹤者是張志新(化名)和其女友劉穎绽左,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體艇潭,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡拼窥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蹋凝。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鲁纠。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鳍寂,靈堂內(nèi)的尸體忽然破棺而出改含,到底是詐尸還是另有隱情,我是刑警寧澤迄汛,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布捍壤,位于F島的核電站,受9級特大地震影響鞍爱,放射性物質(zhì)發(fā)生泄漏鹃觉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一硬霍、第九天 我趴在偏房一處隱蔽的房頂上張望帜慢。 院中可真熱鬧,春花似錦唯卖、人聲如沸粱玲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抽减。三九已至,卻和暖如春橄碾,著一層夾襖步出監(jiān)牢的瞬間卵沉,已是汗流浹背颠锉。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留史汗,地道東北人琼掠。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像停撞,于是被迫代替她去往敵國和親瓷蛙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內(nèi)容