今天的越學越快樂系列文章為大家?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í)行完成后可以看到有如下輸出
從以上的輸出結(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)在才明白“書讀百遍其義自見”的這樣淺顯的道理椎组。要是我的文章對你有所幫助油狂,那將是我莫大的榮幸。