區塊鏈中的共識算法
在比特幣公鏈架構解析中,就曾提到過為了實現去中介化的設計,比特幣設計了一套共識協議,并通過此協議來保證系統的穩定性和防攻擊性。 并且我們知道,截止目前使用最廣泛,也是最被大家接受的共識算法,是我們先前介紹過的POW(proof of work)工作量證明算法。目前市值排名前二的比特幣和以太坊也是采用的此算法。
雖然POW共識算法取得了巨大的成功,但對它的質疑也從來未曾停止過。 其中最主要的一個原因就是電力消耗。據不完全統計,基于POW的挖礦機制所消耗的電量是非常巨大的,甚至比絕大多數國家耗電量還要多。這對我們的資源造成了極大的浪費,此外隨著比特大陸等公司的強勢崛起,造成了算力的高度集中。
基于以上種種原因,更多的共識算法被提出來 POS、DPOS、BPFT等等。 今天我們就來認識POS(proof of stake)算法。
Proof of stake,譯為權益證明。你可能已經猜到了,權益證明簡單理解就是擁有更多token的人,有更大的概率獲得記賬權利,然后獲得獎勵。 這個概率具體有多大呢? 下面我們在代碼實現中會展示,分析也放在后面。 當然,POS是會比POW更好嗎? 會更去中心化嗎? 現在看來未必,所以我們這里也不去對比誰優誰劣。 我們站在中立的角度,單純的來討論討論POS這種算法。
代碼實戰
生成一個Block
既然要實現POS算法,那么就難免要生成一條鏈,鏈又是由一個個Block生成的,所以下面我們首先來看看如何生成Block,當然在前面的內容里面,關于如何生成Block,以及交易、UTXO等等都已經介紹過了。由于今天我們的核心是實現POS,所以關于Block的生成,我們就用最簡單的實現方式,好讓大家把目光聚焦在核心的內容上面。
我們用三個方法來實現生成一個合法的區塊
calculate_hash 計算區塊的hash值 is_block_valid 校驗區塊是否合法 generate_block 生成一個區塊from hashlib import sha256from datetime import datetimedef generate_block(oldblock, bpm, address): """ :param oldblock: :param bpm: :param address: :return: """ newblock = { "Index": oldblock["Index"] + 1, "BPM": bpm, "Timestamp": str(datetime.now()), "PrevHash": oldblock["Hash"], "Validator": address } newblock["Hash"] = calculate_hash(newblock) return newblockdef calculate_hash(block): record = "".join([ str(block["Index"]), str(block["BPM"]), block["Timestamp"], block["PrevHash"] ]) return sha256(record.encode()).hexdigest()def is_block_valid(newblock, oldblock): """ :param newblock: :param oldblock: :return: """ if oldblock["Index"] + 1 != newblock["Index"]: return False if oldblock["Hash"] != newblock["PrevHash"]: return False if calculate_hash(newblock) != newblock["Hash"]: return False return True
新聞熱點
疑難解答