您現在的位置是:首頁 > 藝術

RPOW,可複用工作量證明

由 umiCash 發表于 藝術2022-08-31
簡介而比特幣網路中的任何一個節點,如果想生成一個新的區塊並寫入區塊鏈,必須解出比特幣網路中工作量證明的數學題,有三個要素:工作量證明函式區塊難度值工作量證明函式:比特幣工作量證明函式使用的是SHA256,SHA是安全雜湊演算法的縮寫,由美國國家

雜湊函式輸出是多少位元

資訊資料採集與隱私洩露已經成為網際網路上屢見不鮮的話題,早已不是當初Berners-Lee期望的那個“自由、平等、開放”的網際網路世界。

密碼學之於整個社會的意義,猶如歐洲中世紀的活字印刷術發明改進的意義。印刷術的興起改變了中世紀教會的社會權力結構,密碼學會從根本上改變企業的本質和隨意干涉經濟交易的本質。

RPOW,可複用工作量證明

Hal finney於1956年5月4 日出生於加利福尼亞的Coalinga,他於1979 年加入加州理工學院,獲得工程學學士學位,從加州理工學院畢業後,finney開始從事計算機遊戲事業。

1990年代初期,Finney與創始人Phil Zimmermann基於RSA共同開發了PGP(Tor的前身)郵件加密系統,它能確保郵件內容不被纂改,並創造性的把RSA公鑰體系結合起來,並在數字簽名和金鑰認證管理機制上有巧妙的設計。

RSA公鑰體系的特點使它非常適合用來滿足隱私性和認證性,其演算法簡單的說就是找兩個很大的質數,一個公開給世界(公鑰),一個不告訴給任何人(私鑰)。兩個金鑰是互補的,公鑰的加密的密文可以用鑰匙解密,反過來也一樣。舉例來說:

A給B傳送一個檔案,他們互相知道對方的公鑰,A用B的公鑰地址傳送。

B收到A傳送的檔案,B可以用自己的私鑰開啟A傳送過來檔案。

沒有人知道B的私鑰,即使傳送者A也無法開啟,因此解決了保密的問題。

但是,由於每個人都知道B的公鑰,任何人都可以給B傳送任何檔案,那麼B就無法確認是不是A傳送過來的,認證問題的出現,就有了數字簽名:

A在給B傳送的檔案上用B的公鑰加密,獲得摘要後,使用A自己的私鑰加密進行數字簽名。

然後,A向B傳送檔案…。

B會接受到A的金鑰檔案和A的數字簽名,B透過B的私鑰進行檔案解密,透過A的公鑰進行解密獲得摘要,最後驗證A簽名摘要的一致性。

RSA是一種非對稱加密演算法,早在1977年由Ron Rivest、AdiShamirh和Len Adleman這三個科學家,在MIT(美國麻省理工學院)發明出來的RSA公鑰加密演算法。RSA取自他們三人的名字,實際上1973年,英國數學家Cliford Cocks就已經提出了一個類似的原理,但被作為最高機密封存了,直到1998年才發表。

1991年,Stuart haber和 Scottstornetta 發表論文: How to TimeStamp a Digital Document,這裡面提出用時間戳確保數字檔案安全的協議,主要處理時間戳的文件化——他們的目的是建立一個“數字公證”的服務,這也是今天比特幣區塊鏈鏈條的雛形。

Wei Dai 的B-money無疑開了一個好頭,任職期間,Finney加入的Cypherpunk的郵件社群,這種思想激盪出的火花無疑會形成了某種牽引。透過與Wei Dai 和 Nick Szabo的廣泛交流,逐漸意識到已經存在讓比特幣成為現實的想法。

到 1999 年,點對點技術(P2P)成熟並大範圍流行( BT下載),從它的定義來看——“網路的參與者共享他們所擁有的一部分硬體資源(處理能力、儲存能力、網路連線能力、印表機等),這些共享資源透過網路提供服務和內容,能被其它對等節點(Peer)直接訪問而無需經過中間實體”。

2005年,Finney設計出了RPOW - 複用工作量證明,這是一種對分散式現金達成共識的機制,Adam Back的Hashcash的問題之一就是它們無法重複使用,RPOW在Hashcash基礎上進行了擴充套件,提供了一種有限按照順序重複使用的方式,使POW創造出來的金錢可以在每個人直接移動並保持等同的價值。

工作量證明主要特徵就是傳送方需要做一定難度工作得出一個結果,接收方卻很容易透過結果來驗證傳送方是不是做了相應的工作,這種方案的設計有個核心的特徵就是非對稱性,我們舉例說明:

給定一個基本的字串“新寶,你好”。

給定的工作量要求:可以在字串後面新增一個叫“Nonce”的整數值,對變更後的(新增Nonce)的字串進行SHA256雜湊運算,如果得到雜湊結果是以”0000” 開頭的(16進位制),則完成該工作。

為了完成這個目標,我們需要做的就是不停的遞增”Nonce”值,並對其SHA256雜湊運算。

按照上述工作要求,我們需要經過4500次以上的計算才能找到恰好前4位為“0000”雜湊雜湊。以上是一個工作量證明的簡單過程,我們將上面的變更為:

SHA256(“新寶,你好“+整數值)

整數值取1到1000,也就是,將輸入變成一個由1000個值組成的陣列:“新寶,你好!1、新寶,你好!2、新寶,你好。。。1000“。

然後對陣列中的每個輸入依次進行上述例子進行工作量證明,找出前“0000”的雜湊雜湊。

預期獲得結果需要2^16次嘗試,才能得到“0000”的雜湊雜湊,進行1000次的實際計算結果,平均每個雜湊雜湊需要計算66958次,這就是我們要求的工作量。

而比特幣網路中的任何一個節點,如果想生成一個新的區塊並寫入區塊鏈,必須解出比特幣網路中工作量證明的數學題,有三個要素:

工作量證明函式

區塊

難度值

工作量證明函式:

比特幣工作量證明函式使用的是SHA256,SHA是安全雜湊演算法的縮寫,由美國國家安全域性(NSA)設計,美國國家標準與技術研究院(NIST)釋出的,主要適用於數字簽名標準,SHA256就是這個函式家族中的一個,是輸出值為 256位的雜湊演算法,到目前為止,還沒有出現對SHA256演算法的有效攻擊。

區塊:

比特幣的區塊由區塊頭及該區塊所包含的交易列表組成,區塊鏈頭的大小為80位元組,由以下部分組成:

4位元組的版本號(Version)

32位元組的上一個區塊的雜湊值(Hash)

32位元組的Merkle Root Hash(Merkle root)

4位元組的時間戳(Timestamp)

4位元組的當前難度(Bits)

4位元組的隨機陣列(Nonce)

擁有80個位元組固定長度的區塊頭,就是用於比特幣工作量證明的輸入字串。因此,為了使區塊頭能體現區塊包含的所有交易,在區塊的構造過程中,需要將該區塊要包含的交易列表,透過Merkle Tree演算法生成Merkle Root Hash,並以此作為交易列表的摘要存在區塊頭中。

區塊包含的交易列表附加在區塊頭後面,其中的第一筆交易是Coinbase交易,這是一筆為了讓礦工獲得獎勵及手續費的特殊交易。

難度值:

難度值是礦工在挖礦的重要參考指標,它決定了礦工大約需要經過多少次雜湊運算才能產生一個合法的區塊。比特幣每10分鐘產生一個區塊,如果要在不同的全網算力條件下,新區塊的產生保持都基本這個速率,難度值必須根據全網算力的變化進行調整。簡單說,難度值被設定在無論挖礦能力如何,新區塊的速率都保持在10分鐘一個。

難度值是在每個完整的節點中獨立自動傳送的,每2016個區塊,所有節點都會按統一的公式自動調整難度,這個公式是由最新2016個區塊所花費的時長與期望時長(期望時長為20160分鐘,按每10分鐘一個區塊的產生速率計算出總時長,兩週時間)比較得出的,根據實際時長與期望時長的比值,進行相應調整(變難或變容易)。也就是說,如果區塊鏈產生的速率比10分鐘快則增加難度,比10分鐘慢則降低難度。總結這個公式如下:

新難度值 = 舊難度值 *(過去2016個區塊話費時長/20160分鐘)

工作量證明需要一個目標值,比特幣工作量證明的目標值計算公式如下:

目標值 = 最大目標值 / 難度值

其中,最大目標值為一個恆定值:

0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

目標值的大小與難度值成反比,比特幣工作量證明達成的區塊雜湊雜湊必須小於目標值。上述例子要求為“0000”的值越多,代表難度越大。

我們簡單梳理上述工作量證明的過程:

1。生產Coinbase交易,並與其他所有準備打包進區塊的交易組成交易列表,透過Merkle Tree演算法生成Merkle Root Hash

2。把Merkle Root Hash及其他相關欄位組裝成區塊頭,將區塊頭的80位元組資料(Block Header)作為工作量輸入

3。不停的變更區塊頭的隨機數,即Nonce值,並對每次變更後的區塊頭做雙重SHA256運算(SHA256(SHA256(Block Header)),將結果值與當前網路的目標值做對比,如果小於目標值則完成該工作量。

至此,比特幣的技術全部搭建完畢,靜靜等待著那個名叫中本聰的人將它完善,而Hal finney將成為中本聰傳送第一筆比特幣交易的接收者被永久的載入比特幣歷史。

推薦文章