
今天的越學(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í)行完成后可以看到有如下輸出

從以上的輸出結(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ì)你有所幫助,那將是我莫大的榮幸。