007-046-越寫越快樂(lè)之淺談POW算法

比特幣 - 圖片來(lái)自網(wǎng)絡(luò)

今天的越學(xué)越快樂(lè)系列文章為大家?guī)?lái)POW算法的簡(jiǎn)單介紹和基本使用,讓大家對(duì)比特幣、以太坊等數(shù)字貨幣的共識(shí)算法有個(gè)基本的認(rèn)識(shí)。

什么是POW算法

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

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

要說(shuō)到這個(gè)POW,我們必須提一下哈希函數(shù),也就是輸入一個(gè)任意長(zhǎng)度的數(shù)據(jù),輸出得到一個(gè)固定長(zhǎng)度且絕不雷同的值,可以將其視為輸入的數(shù)字指紋。目前比特幣、以太坊等都是SHA256算法來(lái)計(jì)算某個(gè)數(shù)據(jù)的函數(shù)值,也就是通過(guò)哈希函數(shù)得到該數(shù)據(jù)的數(shù)字指紋,通過(guò)這個(gè)數(shù)字指紋來(lái)驗(yàn)證比特幣中的交易等信息。那我們接下來(lái)看看在Python中如何簡(jiǎn)單地實(shí)現(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)

以上代碼來(lái)自精《通比特幣》書中的POW示例

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

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

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

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

POW算法用在何處

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

為什么要使用POW算法

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

個(gè)人感想

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容