挖礦哈希函數
通俗易懂的大概流程
如果你之前對挖礦根本沒有了解,這段介紹就適合你閱讀,進入狀態後再進行更深層次的學習。
其實通俗來講原理很簡單,比特幣作為一種點對點的電子貨幣體系,挖礦的過程就是一個紀錄數據的過程,因為整個系統是開放的,人人可參與的,所以人人都可以進行挖礦,雖然理論上人人都可以參與,但無利不起早沒有人會平白無故的參與到網路的建設中,中本聰就利用Hash函數設計了一種激勵和競爭方式。
大家都進行數據的處理工作,誰處理的又快又准確,誰就獲得記賬權,同時獲得該區塊的獎勵。既有獎勵又有競爭才使得比特幣網路得以正常運轉。
想要競爭成功就要經歷幾個基本的流程。
一、首先你要將沒有被記錄的交易信息檢查並歸集到一個數據塊中。
二、數據塊打包好後,進行哈希運算,算出哈希值,哈希值這個概念在昨天文章中已經詳細的介紹過。
三、算出哈希值後進行全網廣播,其他礦工接收到後進行驗證,驗證沒有問題就會將這一個數據塊連接到整個區塊鏈上,就可以獲得這個區塊的獎勵了。
大致過程了解後就可以開始詳細的了解整個過程了。
開始挖礦前的准備工作
這里所說的准備,可不是讓你准備買礦機或者給礦機通電,說的是在進行POW工作量證明之前記賬節點所作的准備工作。也就是前面流程的第一步的具體解釋。
想要收集齊全交易信息,第一步就是收集廣播中還沒有被記錄賬本的原始交易信息。收集完成後就要自己先進行驗證,主要驗證兩個方面,1.每個交易信息中的付款地址有沒有足夠付款的余額。2.驗證交易是否有正確的簽名。這兩項必不可少,通俗一點就是你給別人打錢銀行需要確認的就是兩點,你賬號里到底有沒有那麼多錢,是不是你本人或本人同意的行為。
這兩項驗證完後就可以將驗證好的數據進行打包,打包完成後當然沒有完,因為還有對於礦工來說最最重要的 一 步,添加一個獎勵交易,寫一個給自己地址增加6.25枚比特幣的交易。
如果你競爭成功,那麼你的賬戶地址內就會增加6.25枚比特幣,在這里也順便提一下減半,最開始一個區塊的記賬獎勵是50個比特幣,比特幣大概每4年獎勵就進行減半,前一段時間的減半過後比特幣一個區塊的獎勵已經變成了6.25枚。
值得一提的是前兩次減半後都伴隨著牛市的來臨,現在第三次減半已過,在之後會有什麼樣的變化呢?
准備工作完成後就要正式的爭奪了
因為10分鍾左右就一個記賬的名額,在這個階段全世界的礦工,都進行著一場沒有硝煙的戰爭。
那這場仗怎麼打呢?其實就是計算Hash函數,礦工算力的比拼,所以說在比特幣網路哪裡都離不開Hash函數。為了保證在10分鍾只有一個人能夠成功,這個哈希函數的難度必須適當。直接哈希難度過低,所以規定Hash出的結果必須以若干個0構成。
可能直接這么說開頭若干個0還沒有什麼難度概念,那就簡單分析一下,進行這樣的計算有多難 , 也就順便可以解釋為什麼單打獨斗的礦工已經不吃香了。
Hash值跟平常我們設置的密碼要求相似,是由數字、字母組成,其中字母區分大小寫。也就是說每一位都有62種可能,哈希運算本質就是試錯,相當於給你一個不限出錯次數的手機讓你開鎖一樣 。 而比特幣的哈希值是以18個0開頭的,理論上需要進行62的18次方,這個數字在普通計算器上都是以科學計數法顯示的,結果為1.832527122*10的32次方。
指數爆炸式的運算次數增長保證了其挖礦的難度。同時也因為難度大帶來了一些爭議,有人就會說耗費那麼大卻不產生價值,之前挖礦還在一份意見徵集稿中放到了落後產能里。可以說對於挖礦行業的爭議是一直存在的。
最後一步驗證
找到哈希值後,進行廣播打包區塊,網路節點就會進行驗證。
情況無非就是兩種,一種是驗證通過,那麼表明這個區塊成功挖出,其他礦工就不再競爭,選擇接受這個區塊,將這個區塊進行記錄,挖出這個區塊的礦工就獲得了該區塊的獎勵,並且進入下一個區塊的競爭。
另外一種就是不通過,那麼前面的那些工作都白費了,投入的成本就沒有辦法收回,所以礦工們都自覺的遵守著打包和驗證的規則,因為作惡成本較高,也就維護了比特幣網路的安全。
相信你讀完文章已經大致了解了比特幣挖礦的整個流程,不過挖礦實際操作起來又是另一個概念了,其中什麼時候適合進場挖礦、入手什麼樣的礦機進行挖礦、通過什麼樣的方式參與挖礦都是有一定學問的。
挖礦有風險投資需謹慎呀,搞懂再行動,沒搞懂之前就要多學習。
Ⅱ 區塊鏈技術中的哈希演算法是什麼
1.1. 簡介
計算機行業從業者對哈希這個詞應該非常熟悉,哈希能夠實現數據從一個維度向另一個維度的映射,通常使用哈希函數實現這種映射。通常業界使用y = hash(x)的方式進行表示,該哈希函數實現對x進行運算計算出一個哈希值y。
區塊鏈中哈希函數特性:
函數參數為string類型;
固定大小輸出;
計算高效;
collision-free 即沖突概率小:x != y => hash(x) != hash(y)
隱藏原始信息:例如區塊鏈中各個節點之間對交易的驗證只需要驗證交易的信息熵,而不需要對原始信息進行比對,節點間不需要傳輸交易的原始數據只傳輸交易的哈希即可,常見演算法有SHA系列和MD5等演算法
1.2. 哈希的用法
哈希在區塊鏈中用處廣泛,其一我們稱之為哈希指針(Hash Pointer)
哈希指針是指該變數的值是通過實際數據計算出來的且指向實際的數據所在位置,即其既可以表示實際數據內容又可以表示實際數據的存儲位置。下圖為Hash Pointer的示意圖

Ⅲ 什麼是哈希
散列是指從可變大小的輸入生成固定大小的輸出的過程。這是通過使用稱為散列函數(作為散列演算法實現)的數學公式來完成的。
盡管並非所有哈希函數都涉及密碼學的使用 ,但所謂的密碼哈希函數是加密貨幣的核心。多虧了它們,區塊鏈和其他分布式系統能夠實現顯著水平的 數據完整性和安全性。
傳統和加密散列函數都是確定性的。確定性意味著只要輸入不變,散列演算法將始終產生相同的輸出(也稱為摘要或散列)。
通常,加密貨幣的散列演算法被設計為單向函數,這意味著如果沒有大量的計算時間和資源,它們就無法輕易恢復。換句話說,從輸入創建輸出非常容易,但在相反的方向(僅從輸出生成輸入)相對困難。一般來說,越難找到輸入,哈希演算法被認為越安全。
不同的散列函數將產生不同大小的輸出,但每種散列演算法可能的輸出大小始終是恆定的。例如,SHA-256 演算法只能生成 256 位的輸出,而 SHA-1 將始終生成 160 位的摘要。
為了說明這一點,讓我們通過 SHA-256 哈希演算法(比特幣中使用的演算法)運行「Bitcoin」和「bitcoin」這兩個詞。
請注意,微小的更改(第一個字母的大小寫)會導致完全不同的哈希值。但由於我們使用 SHA-256,輸出將始終具有 256 位(或 64 個字元)的固定大小 - 無論輸入大小如何。此外,無論我們通過演算法運行這兩個單詞多少次,兩個輸出都將保持不變。
相反,如果我們通過 SHA-1 哈希演算法運行相同的輸入,我們將得到以下結果:
值得注意的是,首字母縮略詞 SHA 代表安全哈希演算法。它指的是一組加密哈希函數,包括 SHA-0 和 SHA-1 演算法以及 SHA-2 和 SHA-3 組。SHA-256 是 SHA-2 組的一部分,還有 SHA-512 和其他變體。目前,只有 SHA-2 和 SHA-3 組被認為是安全的。
傳統的哈希函數具有廣泛的用例,包括資料庫查找、大文件分析和數據管理。另一方面,加密散列函數廣泛用於信息安全應用,例如消息認證和數字指紋。就比特幣而言,加密哈希函數是挖礦過程的重要組成部分, 也在新地址和密鑰的生成中發揮作用。
散列的真正威力在於處理大量信息時。例如,可以通過哈希函數運行一個大文件或數據集,然後使用其輸出來快速驗證數據的准確性和完整性。由於散列函數的確定性,這是可能的:輸入將始終產生簡化的、壓縮的輸出(散列)。這種技術消除了存儲和「記住」大量數據的需要。
散列在區塊鏈技術的背景下特別有用。比特幣區塊鏈有幾個涉及散列的操作,其中大部分在挖掘過程中。事實上,幾乎所有的加密貨幣協議都依賴散列來將交易組鏈接和壓縮成塊,並在每個塊之間產生加密鏈接,從而有效地創建區塊鏈。
同樣,部署密碼技術的散列函數可以定義為密碼散列函數。一般來說,破解密碼哈希函數需要無數次的蠻力嘗試。對於「還原」加密哈希函數的人來說,他們需要通過反復試驗來猜測輸入是什麼,直到產生相應的輸出。然而,也有可能不同的輸入產生完全相同的輸出,在這種情況下會發生「沖突」。
從技術上講,加密哈希函數需要遵循三個屬性才能被視為有效安全。我們可以將這些描述為抗碰撞性、抗原像性和抗二次原像性。
在討論每個屬性之前,讓我們用三個簡短的句子總結它們的邏輯。
如前所述,當不同的輸入產生完全相同的散列時,就會發生沖突。因此,哈希函數被認為是抗沖突的,直到有人發現沖突為止。請注意,任何散列函數都將始終存在沖突,因為可能的輸入是無限的,而可能的輸出是有限的。
換句話說,當發現碰撞的可能性非常低以至於需要數百萬年的計算時,哈希函數是抗碰撞的。因此,盡管沒有無沖突的哈希函數,但其 中一些函數足夠強大,可以被視為具有抵抗力(例如,SHA-256)。
在各種 SHA 演算法中,SHA-0 和 SHA-1 組不再安全,因為已經發現沖突。目前,SHA-2 和 SHA-3組被認為是抗沖突的。
原像電阻的特性與單向函數的概念有關。當有人找到生成特定輸出的輸入的可能性非常低時,哈希函數被認為是抗原像的。
請注意,此屬性與前一個屬性不同,因為攻擊者會試圖通過查看給定的輸出來猜測輸入是什麼。另一方面,當有人發現產生相同輸出的兩個不同輸入時,就會發生沖突,但使用哪個輸入並不重要。
原像抗性的特性對於保護數據很有價值,因為消息的簡單散列可以證明其真實性,而無需披露信息。在實踐中,許多服務提供商和 Web 應用程序存儲和使用從密碼生成的哈希值,而不是明文密碼。
為簡化起見,我們可以說第二原像電阻介於其他兩個屬性之間。當有人能夠找到一個特定的輸入,該輸入生成與他們已經知道的另一個輸入相同的輸出時,就會發生二次原像攻擊。
換句話說,第二原像攻擊涉及尋找碰撞,但不是搜索生成相同散列的兩個隨機輸入,而是搜索生成由另一個特定輸入生成的相同散列的輸入。
因此,任何抗碰撞的哈希函數也能抗第二原像攻擊,因為後者總是意味著碰撞。然而,人們仍然可以對抗碰撞函數執行原像攻擊,因為它意味著從單個輸出中找到單個輸入。
比特幣挖礦有很多步驟 涉及哈希函數,例如檢查余額、鏈接交易輸入和輸出,以及對區塊內的交易進行哈希處理以形成 默克爾樹。但比特幣區塊鏈安全的主要原因之一 是礦工需要執行無數的散列操作,以便最終為下一個區塊找到有效的解決方案。
具體來說,礦工在為其候選塊創建哈希值時必須嘗試幾種不同的輸入。本質上,如果他們生成以一定數量的零開頭的輸出哈希,他們將只能驗證他們的塊。零的數量決定了挖礦難度,它根據網路的哈希率而變化。
在這種情況下,哈希率表示在比特幣挖礦中投入了多少計算機能力。如果網路的哈希率增加,比特幣協議會自動調整挖礦難度,使挖出一個區塊所需的平均時間保持在接近 10 分鍾。相反,如果幾個礦工決定停止挖礦,導致算力大幅下降,則會調整挖礦難度,使其更容易挖礦(直到平均出塊時間回到10分鍾)。
請注意,礦工不必發現沖突,因為他們可以生成多個散列作為有效輸出(從一定數量的零開始)。所以對於某個區塊有幾種可能的解決方案,礦工只需要找到其中一種——根據挖礦難度確定的閾值。
由於比特幣挖礦是一項成本密集型任務,礦工沒有理由欺騙系統,因為這會導致重大的經濟損失。加入區塊鏈的礦工越多,它就變得越大越強大。(國內禁止參與挖礦)
毫無疑問,哈希函數是計算機科學中必不可少的工具,尤其是在處理大量數據時。當與密碼學結合時,散列演算法可以非常通用,以多種不同的方式提供安全性和身份驗證。因此,加密哈希函數對幾乎所有加密貨幣網路都至關重要,因此了解它們的屬性和工作機制對於任何對區塊鏈技術感興趣的人肯定會有所幫助。
Ⅳ 區塊鏈中的哈希演算法是什麼
哈希演算法是什麼?如何保證挖礦的公平性?
哈希演算法是一種只能加密,不能解密的密碼學演算法,可以將任意長度的信息轉換成一段固定長度的字元串。
這段字元串有兩個特點:
1、 就算輸入值只改變一點,輸出的哈希值也會天差地別。
2、只有完全一樣的輸入值才能得到完全一樣的輸出值。
3、輸入值與輸出值之間沒有規律,所以不能通過輸出值算出輸入值。要想找到指定的輸出值,只能採用枚舉法:不斷更換輸入值,尋找滿足條件的輸出值。
哈希演算法保證了比特幣挖礦不能逆向推導出結果。所以,礦工持續不斷地進行運算,本質上是在暴力破解正確的輸入值,誰最先找到誰就能獲得比特幣獎勵。
Ⅳ 哈希函數的本質及生成方式
哈希表與哈希函數
說到哈希表,其實本質上是一個數組。通過前面的學習我們知道了,如果要訪問一個數組中某個特定的元素,那麼需要知道這個元素的索引。例如,我們可以用數組來記錄自己好友的電話號碼,索引 0 指向的元素記錄著 A 的電話號碼,索引 1 指向的元素記錄著 B 的電話號碼,以此類推。
而當這個數組非常大的時候,全憑記憶去記住哪個索引記錄著哪個好友的號碼是非常困難的。這時候如果有一個函數,可以將我們好友的姓名作為一個輸入,然後輸出這個好友的號碼在數組中對應的索引,是不是就方便了很多呢?這樣的一種函數,其實就是哈希函數。哈希函數的定義是將任意長度的一個對象映射到一個固定長度的值上,而這個值我們可以稱作是哈希值(Hash Value)。
哈希函數一般會有以下三個特性:
任何對象作為哈希函數的輸入都可以得到一個相應的哈希值;
兩個相同的對象作為哈希函數的輸入,它們總會得到一樣的哈希值;
兩個不同的對象作為哈希函數的輸入,它們不一定會得到不同的哈希值。
對於哈希函數的前兩個特性,比較好理解,但是對於第三種特性,我們應該如何解讀呢?那下面就通過一個例子來說明。
我們按照 Java String 類里的哈希函數公式(即下面的公式)來計算出不同字元串的哈希值。String 類里的哈希函數是通過 hashCode 函數來實現的,這里假設哈希函數的字元串輸入為 s,所有的字元串都會通過以下公式來生成一個哈希值:
這里為什麼是「31」?下面會講到哦~
注意:下面所有字元的數值都是按照 ASCII 表獲得的,具體的數值可以在這里查閱。
如果我們輸入「ABC」這個字元串,那根據上面的哈希函數公式,它的哈希值則為:
在什麼樣的情況下會體現出哈希函數的第三種特性呢?我們再來看看下面這個例子。現在我們想要計算字元串 "Aa" 和 "BB" 的哈希值,還是繼續套用上面的的公式。
"Aa" 的哈希值為:
"Aa" = 'A' * 31 + 'a' = 65 * 31 + 97 = 2112
"BB" 的哈希值為:
"BB" = 'B' * 31 + 'B' = 66 * 31 + 66 = 2112
可以看到,不同的兩個字元串其實是會輸出相同的哈希值出來的,這時候就會造成哈希碰撞,具體的解決方法將會在第 07 講中詳細討論。
需要注意的是,雖然 hashCode 的演算法里都是加法,但是算出來的哈希值有可能會是一個負數。
我們都知道,在計算機里,一個 32 位 int 類型的整數里最高位如果是 0 則表示這個數是非負數,如果是 1 則表示是負數。
如果當字元串通過計算算出的哈希值大於 232-1 時,也就是大於 32 位整數所能表達的最大正整數了,則會造成溢出,此時哈希值就變為負數了。感興趣的小夥伴可以按照上面的公式,自行計算一下「19999999999999999」這個字元串的哈希值會是多少。
hashCode 函數中的「魔數」(Magic Number)
細心的你一定發現了,上面所講到的 Java String 類里的 hashCode 函數,一直在使用一個 31 這樣的正整數來進行計算,這是為什麼呢?下面一起來研究一下 Java Openjdk-jdk11 中 String.java 的源碼(源碼鏈接),看看這么做有什麼好處。
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
hash = h = isLatin1() ? StringLatin1.hashCode(value)
: StringUTF16.hashCode(value);
}
return
可以看到,String 類的 hashCode 函數依賴於 StringLatin1 和 StringUTF16 類的具體實現。而 StringLatin1 類中的 hashCode 函數(源碼鏈接)和 StringUTF16 類中的 hashCode 函數(源碼鏈接)所表達的演算法其實是一致的。
StringLatin1 類中的 hashCode 函數如下面所示:
public static int hashCode(byte[] value) {
int h = 0;
for (byte v : value) {
h = 31 * h + (v & 0xff);
}
return h
StringUTF16 類中的 hashCode 函數如下面所示:
public static int hashCode(byte[] value) {
int h = 0;
int length = value.length >> 1;
for (int i = 0; i < length; i++) {
h = 31 * h + getChar(value, i);
}
return h
一個好的哈希函數演算法都希望盡可能地減少生成出來的哈希值會造成哈希碰撞的情況。
Goodrich 和 Tamassia 這兩位計算機科學家曾經做過一個實驗,他們對超過 50000 個英文單詞進行了哈希值運算,並使用常數 31、33、37、39 和 41 作為乘數因子,每個常數所算出的哈希值碰撞的次數都小於 7 個。但是最終選擇 31 還是有著另外幾個原因。
從數學的角度來說,選擇一個質數(Prime Number)作為乘數因子可以讓哈希碰撞減少。其次,我們可以看到在上面的兩個 hashCode 源碼中,都有著一條 31 * h 的語句,這條語句在 JVM 中其實都可以被自動優化成「(h << 5) - h」這樣一條位運算加上一個減法指令,而不必執行乘法指令了,這樣可以大大提高運算哈希函數的效率。
所以最終 31 這個乘數因子就被一直保留下來了。
區塊鏈挖礦的本質
通過上面的學習,相信你已經對哈希函數有了一個比較好的了解了。可能也發現了,哈希函數從輸入到輸出,我們可以按照函數的公式演算法,很快地計算出哈希值。但是如果告訴你一個哈希值,即便給出了哈希函數的公式也很難算得出原來的輸入到底是什麼。例如,還是按照上面 String 類的 hashCode 函數的計算公式:
如果告訴了你哈希值是 123456789 這個值,那輸入的字元串是什麼呢?我們想要知道答案的話,只能採用暴力破解法,也就是一個一個的字元串去嘗試,直到嘗試出這個哈希值為止。
對於區塊鏈挖礦來說,這個「礦」其實就是一個字元串。「礦工」,也就是進行運算的計算機,必須在規定的時間內找到一個字元串,使得在進行了哈希函數運算之後得到一個滿足要求的值。
我們以比特幣為例,它採用了 SHA256 的哈希函數來進行運算,無論輸入的是什麼,SHA256 哈希函數的哈希值永遠都會是一個 256 位的值。而比特幣的獎勵機制簡單來說是通過每 10 分鍾放出一個哈希值,讓「礦工們」利用 SHA256(SHA256(x)) 這樣兩次的哈希運算,來找出滿足一定規則的字元串出來。
比方說,比特幣會要求找出通過上面 SHA256(SHA256(x)) 計算之後的哈希值,這個 256 位的哈希值中的前 50 位都必須為 0 ,誰先找到滿足這個要求的輸入值 x,就等於「挖礦」成功,給予獎勵一個比特幣。我們知道,即便知道了哈希值,也很難算出這個 x 是什麼,所以只能一個一個地去嘗試。而市面上所說的挖礦機,其原理是希望能提高運算的速度,讓「礦工」盡快地找到這個 x 出來。
Ⅵ 如何計算挖礦每天所獲得的收益
雖然每個人擁有的礦機數量不同,想算出自己的每日收益,其實很簡單,優質的比特幣站點都有相關的軟體幫你計算出最終收益,但是你想知道收益的產出原理嗎?
那麼各位要先明白挖礦的基本信息:
區塊·獎勵(BlockReward): 每挖出一個新的區塊,系統會給礦工的獎勵比特幣,目前區塊的獎勵是6.25比特幣。
算力(Hashrate): 算力(也就是哈希值碰撞)是比特幣網路處理能力的度量單位。即為礦機計算哈希函數輸出的速度。比特幣網路必須為了安全目的而進行密集的數學和加密相關操作。
例如,當網路達到10Th/s的哈希率時,意味著它可以每秒進行10萬億次計算。
難度(Difficulty): 比特幣系統的難度是動態調整的,每挖2016個塊便會做出一次調整,調整的依據是前面2016個塊的出塊時間,如果前一個周期平均出塊時間小於10分鍾,便會加大難度,大於10分鍾,則減小難度,目的是為了保證系統穩定的每過10分鍾產出一個塊,所以難度調整的時間大概是2周(2016* 10 分鍾)
比特幣網路初始難度定義為1,即Difficulty=1,它所表示的意思是,比特幣網路剛開始運行的時候,每進行2^48/(2^16-1)≈2^32次Hash計算,理論上能挖出一個區塊。
隨著挖礦算力的提升,比特幣挖礦難度在不斷提升,當挖礦難度為D時,理論上挖出一個新區塊需要進行D*2^32次哈希運算。
礦工的算力為H(單位為hash/s),他每天(24小時)的幣產出為P,挖礦難度為D,系統獎勵為R,那麼:
難度X6.25獎勵(R)X時間=比特幣產出
P=H×x6.25×(24×60×60)D×232
數學不好的小夥伴不要慌,可以直接通過相關網站查詢到當天全網算力難度,編寫此文章時當天難度為【16.95T】
假設礦工算力為1TH/s(即10^12H/s),
當前的難度=16.947.802.333.946(16.95T)
加上系統當前的區塊獎勵=6.25比特幣,
計算可以得出1T每天(24小時)
可以獲得收益=0.00000742BTC
當然,這只是一個最基礎的PPS收益演算法,除了區塊獎勵外,還有打包交易的曠工費,這部分的計算和礦池的結算方式有所相關。
礦池還有多種結算方式。以上介紹的是最為基礎的結算方式PPS(PayPer Share)。根據礦工提交的有效工作量來結算收益。
目前比特幣礦池主要的結算還有FPPS和PPS+等等,可以讓你在基礎上獲得而外的獎勵。
目前基本上收益方式多為選擇PPS+結算的礦工,他們與礦池的關系相當於打工者與公司的關系,礦工的收益不受礦池幸運值波動的影響。不管礦池幸運值如何,PPS結算方式下,只要礦工算力、挖礦難度、系統獎勵確定了,礦工的收益就是確定的,拿穩定的「工資」。
數學不太好的,實在看不懂的小夥伴。記得關注今日礦工,一起研究挖礦小樂趣。
Ⅶ 顯卡怎麼計算挖礦算力
可以參考下面,根據一些網吧市場常用的顯卡,整理的一份相關顯卡的價格和算力以及預計回本期,大概可以做個參考:
Radeon RX 580顯卡
整機功耗:243W
計算力:22.4M
顯卡售價:1999元
每24小時挖ETH數量:0.015
每24小時產生收益:24.48元
預計回本時間:81.66天
Radeon RX 470顯卡
整機功耗:159W
計算力:24.3M
顯卡售價:1599元
每24小時挖ETH數量:0.017
每24小時產生收益:27.9元
預計回本時間:57.31天
Radeon RX 480顯卡
整機功耗:171W
計算力:24.4M
顯卡售價:1999元
每24小時挖ETH數量:0.017
每24小時產生收益:27.87元
預計回本時間:71.73天
(7)挖礦哈希函數擴展閱讀:
顯卡(Video card,Graphics card)全稱顯示介面卡,又稱顯示適配器,是計算機最基本配置、最重要的配件之一。顯卡作為電腦主機里的一個重要組成部分,是電腦進行數模信號轉換的設備,承擔輸出顯示圖形的任務。
顯卡接在電腦主板上,它將電腦的數字信號轉換成模擬信號讓顯示器顯示出來,同時顯卡還是有圖像處理能力,可協助CPU工作,提高整體的運行速度。對於從事專業圖形設計的人來說顯卡非常重要。 民用和軍用顯卡圖形晶元供應商主要包括AMD(超微半導體)和Nvidia(英偉達)2家。現在的top500計算機,都包含顯卡計算核心。在科學計算中,顯卡被稱為顯示加速卡。
Ⅷ 詳解比特幣挖礦原理
可以將區塊鏈看作一本記錄所有交易的公開總帳簿(列表),比特幣網路中的每個參與者都把它看作一本所有權的權威記錄。
比特幣沒有中心機構,幾乎所有的完整節點都有一份公共總帳的備份,這份總帳可以被視為認證過的記錄。
至今為止,在主幹區塊鏈上,沒有發生一起成功的攻擊,一次都沒有。
通過創造出新區塊,比特幣以一個確定的但不斷減慢的速率被鑄造出來。大約每十分鍾產生一個新區塊,每一個新區塊都伴隨著一定數量從無到有的全新比特幣。每開采210,000個塊,大約耗時4年,貨幣發行速率降低50%。
在2016年的某個時刻,在第420,000個區塊被「挖掘」出來之後降低到12.5比特幣/區塊。在第13,230,000個區塊(大概在2137年被挖出)之前,新幣的發行速度會以指數形式進行64次「二等分」。到那時每區塊發行比特幣數量變為比特幣的最小貨幣單位——1聰。最終,在經過1,344萬個區塊之後,所有的共20,999,999.9769億聰比特幣將全部發行完畢。換句話說, 到2140年左右,會存在接近2,100萬比特幣。在那之後,新的區塊不再包含比特幣獎勵,礦工的收益全部來自交易費。
在收到交易後,每一個節點都會在全網廣播前對這些交易進行校驗,並以接收時的相應順序,為有效的新交易建立一個池(交易池)。
每一個節點在校驗每一筆交易時,都需要對照一個長長的標准列表:
交易的語法和數據結構必須正確。
輸入與輸出列表都不能為空。
交易的位元組大小是小於MAX_BLOCK_SIZE的。
每一個輸出值,以及總量,必須在規定值的范圍內 (小於2,100萬個幣,大於0)。
沒有哈希等於0,N等於-1的輸入(coinbase交易不應當被中繼)。
nLockTime是小於或等於INT_MAX的。
交易的位元組大小是大於或等於100的。
交易中的簽名數量應小於簽名操作數量上限。
解鎖腳本(Sig)只能夠將數字壓入棧中,並且鎖定腳本(Pubkey)必須要符合isStandard的格式 (該格式將會拒絕非標准交易)。
池中或位於主分支區塊中的一個匹配交易必須是存在的。
對於每一個輸入,如果引用的輸出存在於池中任何的交易,該交易將被拒絕。
對於每一個輸入,在主分支和交易池中尋找引用的輸出交易。如果輸出交易缺少任何一個輸入,該交易將成為一個孤立的交易。如果與其匹配的交易還沒有出現在池中,那麼將被加入到孤立交易池中。
對於每一個輸入,如果引用的輸出交易是一個coinbase輸出,該輸入必須至少獲得COINBASE_MATURITY (100)個確認。
對於每一個輸入,引用的輸出是必須存在的,並且沒有被花費。
使用引用的輸出交易獲得輸入值,並檢查每一個輸入值和總值是否在規定值的范圍內 (小於2100萬個幣,大於0)。
如果輸入值的總和小於輸出值的總和,交易將被中止。
如果交易費用太低以至於無法進入一個空的區塊,交易將被拒絕。
每一個輸入的解鎖腳本必須依據相應輸出的鎖定腳本來驗證。
以下挖礦節點取名為 A挖礦節點
挖礦節點時刻監聽著傳播到比特幣網路的新區塊。而這些新加入的區塊對挖礦節點有著特殊的意義。礦工間的競爭以新區塊的傳播而結束,如同宣布誰是最後的贏家。對於礦工們來說,獲得一個新區塊意味著某個參與者贏了,而他們則輸了這場競爭。然而,一輪競爭的結束也代表著下一輪競爭的開始。
驗證交易後,比特幣節點會將這些交易添加到自己的內存池中。內存池也稱作交易池,用來暫存尚未被加入到區塊的交易記錄。
A節點需要為內存池中的每筆交易分配一個優先順序,並選擇較高優先順序的交易記錄來構建候選區塊。
一個交易想要成為「較高優先順序」,需滿足的條件:優先值大於57,600,000,這個值的生成依賴於3個參數:一個比特幣(即1億聰),年齡為一天(144個區塊),交易的大小為250個位元組:
High Priority > 100,000,000 satoshis * 144 blocks / 250 bytes = 57,600,000
區塊中用來存儲交易的前50K位元組是保留給較高優先順序交易的。 節點在填充這50K位元組的時候,會優先考慮這些最高優先順序的交易,不管它們是否包含了礦工費。這種機制使得高優先順序交易即便是零礦工費,也可以優先被處理。
然後,A挖礦節點會選出那些包含最小礦工費的交易,並按照「每千位元組礦工費」進行排序,優先選擇礦工費高的交易來填充剩下的區塊。
如區塊中仍有剩餘空間,A挖礦節點可以選擇那些不含礦工費的交易。有些礦工會竭盡全力將那些不含礦工費的交易整合到區塊中,而其他礦工也許會選擇忽略這些交易。
在區塊被填滿後,內存池中的剩餘交易會成為下一個區塊的候選交易。因為這些交易還留在內存池中,所以隨著新的區塊被加到鏈上,這些交易輸入時所引用UTXO的深度(即交易「塊齡」)也會隨著變大。由於交易的優先值取決於它交易輸入的「塊齡」,所以這個交易的優先值也就隨之增長了。最後,一個零礦工費交易的優先值就有可能會滿足高優先順序的門檻,被免費地打包進區塊。
UTXO(Unspent Transaction Output) : 每筆交易都有若干交易輸入,也就是資金來源,也都有若干筆交易輸出,也就是資金去向。一般來說,每一筆交易都要花費(spend)一筆輸入,產生一筆輸出,而其所產生的輸出,就是「未花費過的交易輸出」,也就是 UTXO。
塊齡:UTXO的「塊齡」是自該UTXO被記錄到區塊鏈為止所經歷過的區塊數,即這個UTXO在區塊鏈中的深度。
區塊中的第一筆交易是筆特殊交易,稱為創幣交易或者coinbase交易。這個交易是由挖礦節點構造並用來獎勵礦工們所做的貢獻的。假設此時一個區塊的獎勵是25比特幣,A挖礦的節點會創建「向A的地址支付25.1個比特幣(包含礦工費0.1個比特幣)」這樣一個交易,把生成交易的獎勵發送到自己的錢包。A挖出區塊獲得的獎勵金額是coinbase獎勵(25個全新的比特幣)和區塊中全部交易礦工費的總和。
A節點已經構建了一個候選區塊,那麼就輪到A的礦機對這個新區塊進行「挖掘」,求解工作量證明演算法以使這個區塊有效。比特幣挖礦過程使用的是SHA256哈希函數。
用最簡單的術語來說, 挖礦節點不斷重復進行嘗試,直到它找到的隨機調整數使得產生的哈希值低於某個特定的目標。 哈希函數的結果無法提前得知,也沒有能得到一個特定哈希值的模式。舉個例子,你一個人在屋裡打檯球,白球從A點到達B點,但是一個人推門進來看到白球在B點,卻無論如何是不知道如何從A到B的。哈希函數的這個特性意味著:得到哈希值的唯一方法是不斷的嘗試,每次隨機修改輸入,直到出現適當的哈希值。
需要以下參數
• block的版本 version
• 上一個block的hash值: prev_hash
• 需要寫入的交易記錄的hash樹的值: merkle_root
• 更新時間: ntime
• 當前難度: nbits
挖礦的過程就是找到x使得
SHA256(SHA256(version + prev_hash + merkle_root + ntime + nbits + x )) < TARGET
上式的x的范圍是0~2^32, TARGET可以根據當前難度求出的。
簡單打個比方,想像人們不斷扔一對色子以得到小於一個特定點數的游戲。第一局,目標是12。只要你不扔出兩個6,你就會贏。然後下一局目標為11。玩家只能扔10或更小的點數才能贏,不過也很簡單。假如幾局之後目標降低為了5。現在有一半機率以上扔出來的色子加起來點數會超過5,因此無效。隨著目標越來越小,要想贏的話,扔色子的次數會指數級的上升。最終當目標為2時(最小可能點數),只有一個人平均扔36次或2%扔的次數中,他才能贏。
如前所述,目標決定了難度,進而影響求解工作量證明演算法所需要的時間。那麼問題來了:為什麼這個難度值是可調整的?由誰來調整?如何調整?
比特幣的區塊平均每10分鍾生成一個。這就是比特幣的心跳,是貨幣發行速率和交易達成速度的基礎。不僅是在短期內,而是在幾十年內它都必須要保持恆定。在此期間,計算機性能將飛速提升。此外,參與挖礦的人和計算機也會不斷變化。為了能讓新區塊的保持10分鍾一個的產生速率,挖礦的難度必須根據這些變化進行調整。事實上,難度是一個動態的參數,會定期調整以達到每10分鍾一個新區塊的目標。簡單地說,難度被設定在,無論挖礦能力如何,新區塊產生速率都保持在10分鍾一個。
那麼,在一個完全去中心化的網路中,這樣的調整是如何做到的呢?難度的調整是在每個完整節點中獨立自動發生的。每2,016個區塊(2周產生的區塊)中的所有節點都會調整難度。難度的調整公式是由最新2,016個區塊的花費時長與20,160分鍾(兩周,即這些區塊以10分鍾一個速率所期望花費的時長)比較得出的。難度是根據實際時長與期望時長的比值進行相應調整的(或變難或變易)。簡單來說,如果網路發現區塊產生速率比10分鍾要快時會增加難度。如果發現比10分鍾慢時則降低難度。
為了防止難度的變化過快,每個周期的調整幅度必須小於一個因子(值為4)。如果要調整的幅度大於4倍,則按4倍調整。由於在下一個2,016區塊的周期不平衡的情況會繼續存在,所以進一步的難度調整會在下一周期進行。因此平衡哈希計算能力和難度的巨大差異有可能需要花費幾個2,016區塊周期才會完成。
舉個例子,當前A節點在挖277,316個區塊,A挖礦節點一旦完成計算,立刻將這個區塊發給它的所有相鄰節點。這些節點在接收並驗證這個新區塊後,也會繼續傳播此區塊。當這個新區塊在網路中擴散時,每個節點都會將它作為第277,316個區塊(父區塊為277,315)加到自身節點的區塊鏈副本中。當挖礦節點收到並驗證了這個新區塊後,它們會放棄之前對構建這個相同高度區塊的計算,並立即開始計算區塊鏈中下一個區塊的工作。
比特幣共識機制的第三步是通過網路中的每個節點獨立校驗每個新區塊。當新區塊在網路中傳播時,每一個節點在將它轉發到其節點之前,會進行一系列的測試去驗證它。這確保了只有有效的區塊會在網路中傳播。
每一個節點對每一個新區塊的獨立校驗,確保了礦工無法欺詐。在前面的章節中,我們看到了礦工們如何去記錄一筆交易,以獲得在此區塊中創造的新比特幣和交易費。為什麼礦工不為他們自己記錄一筆交易去獲得數以千計的比特幣?這是因為每一個節點根據相同的規則對區塊進行校驗。一個無效的coinbase交易將使整個區塊無效,這將導致該區塊被拒絕,因此,該交易就不會成為總賬的一部分。
比特幣去中心化的共識機制的最後一步是將區塊集合至有最大工作量證明的鏈中。一旦一個節點驗證了一個新的區塊,它將嘗試將新的區塊連接到到現存的區塊鏈,將它們組裝起來。
節點維護三種區塊:
· 第一種是連接到主鏈上的,
· 第二種是從主鏈上產生分支的(備用鏈),
· 第三種是在已知鏈中沒有找到已知父區塊的。
有時候,新區塊所延長的區塊鏈並不是主鏈,這一點我們將在下面「 區塊鏈分叉」中看到。
如果節點收到了一個有效的區塊,而在現有的區塊鏈中卻未找到它的父區塊,那麼這個區塊被認為是「孤塊」。孤塊會被保存在孤塊池中,直到它們的父區塊被節點收到。一旦收到了父區塊並且將其連接到現有區塊鏈上,節點就會將孤塊從孤塊池中取出,並且連接到它的父區塊,讓它作為區塊鏈的一部分。當兩個區塊在很短的時間間隔內被挖出來,節點有可能會以相反的順序接收到它們,這個時候孤塊現象就會出現。
選擇了最大難度的區塊鏈後,所有的節點最終在全網范圍內達成共識。隨著更多的工作量證明被添加到鏈中,鏈的暫時性差異最終會得到解決。挖礦節點通過「投票」來選擇它們想要延長的區塊鏈,當它們挖出一個新塊並且延長了一個鏈,新塊本身就代表它們的投票。
因為區塊鏈是去中心化的數據結構,所以不同副本之間不能總是保持一致。區塊有可能在不同時間到達不同節點,導致節點有不同的區塊鏈視角。解決的辦法是, 每一個節點總是選擇並嘗試延長代表累計了最大工作量證明的區塊鏈,也就是最長的或最大累計難度的鏈。
當有兩個候選區塊同時想要延長最長區塊鏈時,分叉事件就會發生。正常情況下,分叉發生在兩名礦工在較短的時間內,各自都算得了工作量證明解的時候。兩個礦工在各自的候選區塊一發現解,便立即傳播自己的「獲勝」區塊到網路中,先是傳播給鄰近的節點而後傳播到整個網路。每個收到有效區塊的節點都會將其並入並延長區塊鏈。如果該節點在隨後又收到了另一個候選區塊,而這個區塊又擁有同樣父區塊,那麼節點會將這個區塊連接到候選鏈上。其結果是,一些節點收到了一個候選區塊,而另一些節點收到了另一個候選區塊,這時兩個不同版本的區塊鏈就出現了。
分叉之前
分叉開始
我們看到兩個礦工幾乎同時挖到了兩個不同的區塊。為了便於跟蹤這個分叉事件,我們設定有一個被標記為紅色的、來自加拿大的區塊,還有一個被標記為綠色的、來自澳大利亞的區塊。
假設有這樣一種情況,一個在加拿大的礦工發現了「紅色」區塊的工作量證明解,在「藍色」的父區塊上延長了塊鏈。幾乎同一時刻,一個澳大利亞的礦工找到了「綠色」區塊的解,也延長了「藍色」區塊。那麼現在我們就有了兩個區塊:一個是源於加拿大的「紅色」區塊;另一個是源於澳大利亞的「綠色」。這兩個區塊都是有效的,均包含有效的工作量證明解並延長同一個父區塊。這個兩個區塊可能包含了幾乎相同的交易,只是在交易的排序上有些許不同。
比特幣網路中鄰近(網路拓撲上的鄰近,而非地理上的)加拿大的節點會首先收到「紅色」區塊,並建立一個最大累計難度的區塊,「紅色」區塊為這個鏈的最後一個區塊(藍色-紅色),同時忽略晚一些到達的「綠色」區塊。相比之下,離澳大利亞更近的節點會判定「綠色」區塊勝出,並以它為最後一個區塊來延長區塊鏈(藍色-綠色),忽略晚幾秒到達的「紅色」區塊。那些首先收到「紅色」區塊的節點,會即刻以這個區塊為父區塊來產生新的候選區塊,並嘗試尋找這個候選區塊的工作量證明解。同樣地,接受「綠色」區塊的節點會以這個區塊為鏈的頂點開始生成新塊,延長這個鏈。
分叉問題幾乎總是在一個區塊內就被解決了。網路中的一部分算力專注於「紅色」區塊為父區塊,在其之上建立新的區塊;另一部分算力則專注在「綠色」區塊上。即便算力在這兩個陣營中平均分配,也總有一個陣營搶在另一個陣營前發現工作量證明解並將其傳播出去。在這個例子中我們可以打個比方,假如工作在「綠色」區塊上的礦工找到了一個「粉色」區塊延長了區塊鏈(藍色-綠色-粉色),他們會立刻傳播這個新區塊,整個網路會都會認為這個區塊是有效的,如上圖所示。
所有在上一輪選擇「綠色」區塊為勝出者的節點會直接將這條鏈延長一個區塊。然而,那些選擇「紅色」區塊為勝出者的節點現在會看到兩個鏈: 「藍色-綠色-粉色」和「藍色-紅色」。 如上圖所示,這些節點會根據結果將 「藍色-綠色-粉色」 這條鏈設置為主鏈,將 「藍色-紅色」 這條鏈設置為備用鏈。 這些節點接納了新的更長的鏈,被迫改變了原有對區塊鏈的觀點,這就叫做鏈的重新共識 。因為「紅」區塊做為父區塊已經不在最長鏈上,導致了他們的候選區塊已經成為了「孤塊」,所以現在任何原本想要在「藍色-紅色」鏈上延長區塊鏈的礦工都會停下來。全網將 「藍色-綠色-粉色」 這條鏈識別為主鏈,「粉色」區塊為這條鏈的最後一個區塊。全部礦工立刻將他們產生的候選區塊的父區塊切換為「粉色」,來延長「藍色-綠色-粉色」這條鏈。
從理論上來說,兩個區塊的分叉是有可能的,這種情況發生在因先前分叉而相互對立起來的礦工,又幾乎同時發現了兩個不同區塊的解。然而,這種情況發生的幾率是很低的。單區塊分叉每周都會發生,而雙塊分叉則非常罕見。
比特幣將區塊間隔設計為10分鍾,是在更快速的交易確認和更低的分叉概率間作出的妥協。更短的區塊產生間隔會讓交易清算更快地完成,也會導致更加頻繁地區塊鏈分叉。與之相對地,更長的間隔會減少分叉數量,卻會導致更長的清算時間。
Ⅸ 挖礦到底在計算什麼
比特幣挖礦到底在計算什麼?如何看待比特幣挖礦,比特幣的挖礦對於不同的礦工而言是一種競爭記賬權的合作記賬行為,在合作的大框架下有序地競爭。也就是利用電腦硬體計算出比特幣的位置並獲取的過程稱之為挖礦。挖礦既能生產比特幣,又能保障交易信息,下面來具體解釋挖礦。
比特幣在2017年底暴漲至將近20萬人民幣一枚,不僅火了數字貨幣行業,更是火爆了區塊鏈行業,正因為如此,很多人想方設法去挖礦,獲取比特幣來實現自己的財富自己,首先,”比特幣“挖礦是怎挖的,比特幣是一中虛擬貨幣,基於區塊鏈技術。如果我們簡單地把區塊鏈的區塊比作一個個的賬本,那麼”挖礦“就是“打包”過去十分鍾整個區塊鏈網路的交易,把這些交易寫入新的區塊,那麼就“打包”完成,那就是完成了“挖礦”旅搭譽。完成了挖礦之後就獲得了系統分發給你的比特幣。這就是比特幣“挖礦”比較簡化的說法,當中的原理和運行還是相當復雜的。
如何分配“打包權”
比特幣的價格超過2w元一個,每一次獲得“打包權”,完成工作就會獲得12.5個比特幣(會隨時間遞減),獲利可謂相當豐厚。
天下熙熙皆為利來天下攘攘皆為利往,只要有利潤的地方就有人。網路上礦工眾多,那麼如何確定應該分配給哪個礦工去做這事呢?
比特幣的創始人中本聰採用這種方法:採用一種叫“工作證明(Proof Of Work,簡稱POW)機制,即工作量的證明。
這種方法通常來說只能從結果證明,因為監測工作過程通常是繁瑣與低效的。這是用來確認你做過一定量的工作,但是監測工作的整個過程極為低效,而通過對工作的結果進行認證來證明完成了相應的工作量,則是一種非常高效的方式。
我們可以比喻成,要證明您會開車技術好,企業不可能給您幾天時間,跟著您在市區上走。但是,你可以提供駕駛證和之前在公交車公司當公交車司機的工作證明, 來說明您得能力。你要獲得這個能力需要付出大量的時間和精力,但是企業驗證卻非常簡單。
比特幣這種加密系統所使用工作量證明機制的證明是哈希現金,需要算出對應的哈希函數。哈希現金是一種工作量證明機制,它是亞當·貝克在1997年發明的,主要用於抵抗郵件的拒絕服務攻擊及垃圾郵件網關濫用。在比特幣之前,哈希現金被用於垃圾郵件的過濾,也被微軟用於hotmail等產品中。
對於比特幣這種加密系統所使用的哈希函數,它需要具備以下的性質:
1. 免碰撞,即不會出現輸入x≠y,但是H(x)=H(y)
2. 隱匿性,也就是說,對於一個給定的輸出結果H(x),想要逆推出輸入x,在計算上是不可能的。
3. 不存在比窮舉更好的方法,可以使哈希結果H(x)落在特定的范圍。
比特幣在區塊鏈的生枝鋒成過程中使用了POW機制,一個符合要求的區塊哈希函數由N個前導零構成,零的個數取決於網路的拆段難度值。
要得到合理的區塊哈希碼需要經過大量嘗試計算。當某個節點提供出一個合理的區塊哈希值,那就是說明該節點確實經過了大量的嘗試計算,那麼系統就把”打包權“分配給該節點(礦工)
當然這不能得出計算次數的絕對值,因為尋找合理hash是一個概率事件,所以當節點(礦工)擁有佔全網n%的算力時,該節點基本上就是有n/100的概率找到區塊哈希。那就是意思上說比拼算力。
當能不能記住前面幾個0,然後可以使用呢?不能的,因為難度值不一樣, 0的數量就不一樣。而且要證明的數是一個哈希碼,而且需要驗證的工作量證明非常龐大,基本上無法造假。只存在一個方法:窮舉!
那麼意味著,你不僅要算出你的哈希值,還需要對比對不對,如果不對的話繼續算。
所以需要大量的顯卡進行大量的並行運算,獲取哈希值。讓我們來看看,礦場是一個怎麼樣的存在:
這些礦場都是用很貴的顯卡來算,他們的算里是人工的N倍。如果單靠人力,算十年都沒有它們工作一小時的工作量大。
比特幣和傳統貨幣不同,美元和英鎊這種法幣由央行和金融機構管理,進行轉賬交易時這些機構也同時參與,而比特幣只在分布式賬本中進行交易,每一項交易就儲存在比特幣的全球網路節點中,不可復制,不可篡改。所以每個儲存數據的節點都會有相應的獎勵,目前已經開採的節點有1700萬個,比特幣總量只有2100萬個,意味著還有400萬個比特幣待開采。