為什麼比特幣里總做兩次哈希
❶ 比特幣哈希率是什麼
比特幣哈希率是一個度量指標,代表礦商在區塊鏈上確認事務的速度。哈希率是衡量比特幣網路安全的重要指標。哈希率越高,它就越能抵禦諸如51%攻擊等的惡意行為。因此,比特幣哈希率的增加代表著網路安全性的提高,而這會提升比特幣投資者的信心。
❷ 比特幣挖礦到底是在計算什麼
專業的說,是在算哈希值SHA-256。如果不懂計算機的話,簡單地說,就是算一些沒有意義的隨機數,誰的隨機數被比特幣區塊鏈接受了,誰就有錢拿。所以比特幣計算除了賺錢之外,其實並沒有任何實際作用。如果這些算力用來做科學計算,真的可以做很多事情,但是沒辦法,誰讓比特幣賺錢啊
❸ 為什麼比特幣交易過程要將前一筆交易和收款人的公鑰進行哈希變化並數字簽名,其中前一筆交易是什麼
首先,這個做哈希變化並數字簽名是為了記錄這一筆交易並發布到全網,那麼這里說的前一筆交易是在你交易的前一筆交易記錄,因為這是分布式賬本,也就是說每個人的交易在這個賬本上都是有據可查的
❹ 區塊鏈中的哈希演算法是什麼
哈希演算法是什麼?如何保證挖礦的公平性?
哈希演算法是一種只能加密,不能解密的密碼學演算法,可以將任意長度的信息轉換成一段固定長度的字元串。
這段字元串有兩個特點:
1、 就算輸入值只改變一點,輸出的哈希值也會天差地別。
2、只有完全一樣的輸入值才能得到完全一樣的輸出值。
3、輸入值與輸出值之間沒有規律,所以不能通過輸出值算出輸入值。要想找到指定的輸出值,只能採用枚舉法:不斷更換輸入值,尋找滿足條件的輸出值。
哈希演算法保證了比特幣挖礦不能逆向推導出結果。所以,礦工持續不斷地進行運算,本質上是在暴力破解正確的輸入值,誰最先找到誰就能獲得比特幣獎勵。
❺ 詳解比特幣挖礦原理
可以將區塊鏈看作一本記錄所有交易的公開總帳簿(列表),比特幣網路中的每個參與者都把它看作一本所有權的權威記錄。
比特幣沒有中心機構,幾乎所有的完整節點都有一份公共總帳的備份,這份總帳可以被視為認證過的記錄。
至今為止,在主幹區塊鏈上,沒有發生一起成功的攻擊,一次都沒有。
通過創造出新區塊,比特幣以一個確定的但不斷減慢的速率被鑄造出來。大約每十分鍾產生一個新區塊,每一個新區塊都伴隨著一定數量從無到有的全新比特幣。每開采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分鍾,是在更快速的交易確認和更低的分叉概率間作出的妥協。更短的區塊產生間隔會讓交易清算更快地完成,也會導致更加頻繁地區塊鏈分叉。與之相對地,更長的間隔會減少分叉數量,卻會導致更長的清算時間。
❻ 哈希函數的本質及生成方式
哈希表與哈希函數
說到哈希表,其實本質上是一個數組。通過前面的學習我們知道了,如果要訪問一個數組中某個特定的元素,那麼需要知道這個元素的索引。例如,我們可以用數組來記錄自己好友的電話號碼,索引 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 出來。
❼ 比特幣哀嚎一片,美股跌上熱搜,這個市場怎麼了
昨天晚上朋友說起比特幣跌去了一萬,結果問題追過來了,不管它是漲是跌,這都是正常的,只有拔了網線,交易所不能登陸這才是不正常的,這才是是對賭平台最喜歡用的伎倆。
上周末,我看到有人說:我買的幣漲到了五萬多,我要賣,結果網站不能登陸,我白白看著它跌下去。可惜的是,我自己沒做這個東西,我的股票軟體不支持我看這類的走勢,我也不了解這個市場的生態,所以我不敢亂說,我只是連發兩個關於賺到百萬的文章,希望我的朋友們理智投資,選擇時機投資。
現在我還是以局外人的身份來說說比特幣,其實無論是什麼幣,無論是什麼交易品種,只要它上市交易,它都遵循一個原則:價格發現。也就是,看漲的人覺得它要漲,那麼就買進!看跌的人覺得它要跌,就賣出。雙方達成了交易意願,買賣成功,價格就定在那裡了。
如果繼續有人看漲,買盤大於賣盤,它就繼續漲,當它繼續漲的過程中,有人覺得它漲到自己的預期了,就迫切的想要兌現利潤。這樣一筆賣盤出現。當它的買盤能蓋過賣盤的時候,它依然漲!當它的賣盤越來越多,買盤承擔不住賣壓,就下跌。這就是價格的運動,價格發現,才促進交易的發生。
那麼以我的眼睛看,18年底還是什麼時候,比特幣還是8000美元的時候,有人持有,到了現在五萬多的時候,肯定他按耐不住,想要兌現利潤了。這就是我常說的漲多了,漲多必然跌。這也是價格運動的必然規律,我是一個技術分析者,我只能從價格運動規律上去解釋,其他的領域,不在我的研究范圍,不涉及。
我再說說美股跌上熱搜這件事,比如我上次分析過特斯拉,它從前75美元的價格,當它漲到了800美元,十倍的利潤,必定有人獲利豐厚,想要兌現。美股去年到今年大幅上漲,自然有不少股票也跟著大幅上漲,也漲上熱搜了。當有人要兌現利潤的時候,自然也就跌上熱搜了。
因此,我想對朋友說:你專注於價格發現的道理,專注於價格運動的規律,你就可以處變不驚,不需要知道它怎麼了,只需要知道:我該怎麼做!這樣才能做好應對了。
最近金融市場出現了一個非常異常的信號——美國十年期國債收益率持續上漲。
美國的十年期國債收益率作為全球金融市場的標尺,雖然從去年7月底開始,美國十年期的國債收益率就已經開始出現上漲了,但一直在相對低的位置。很多國際機構對於國債收益率是有一個心理臨界點的,也就是說,當收益率達到1.5%以上時,各大機構對金融市場的通脹開始警惕了。這種過高的通脹可能會導致美聯儲被迫提前加息,大資金有了這樣的加息預期,加上最近全球大宗商品和比特幣的一輪瘋漲,自然會有大量獲利資金出逃,甚至反手做空。
比特幣的瘋漲,很關鍵的一點就是市場資金的流動性必須充分。當國債收益率到達1.5%時,對市場而言其實是變相地收緊了流動性,所以比特幣很難有足夠的資金繼續上行。不光比特幣,美國頭部的 科技 股也大幅下挫,越來越多的投資者開始反思這些大型 科技 公司的未來增長潛力是否對得起現在的股價,泡沫是否過頭了。
雖然市場上的漲跌都是相隨的,有漲必有跌,有跌必有漲。但是背後的邏輯需要我們去 探索 ,做自己看得懂的,賺認知的錢,就不會管不住手,追漲殺跌了。
對於經歷過比特幣爆倉的我來說,這種暴跌已經習以為常了[捂臉]。過去六個月比特幣交易價格從10000美元飆升至58000美元,漲幅高達480%,這一輪暴漲源於疫情影響下美聯儲大放水,國際投資機構、金融大鱷大批量資金湧入數字貨幣市場,直接推高了比特幣價格,其他小幣種和主流幣也跟著水漲船高,部分小幣種漲幅甚至超過了比特幣,比如OKB從最低4美元飆升至23.8美元。
1,數字貨幣交易市場特點:全年365、天全天24小時不停盤;漲跌幅不限制;交易模式多樣化,現貨交易、期貨交易;
2,不乏機構、大鱷操控市場:數字貨幣交易市場受大機構影響明顯,因其隱蔽性,市場漲跌幅超乎常人想像,也因此各國政府都不承認其交易合法性,因此數字貨幣交易市場是個巨大的賭博市場,有人由此一夜暴富,也有人由此一夜返貧;
3,美國繼續大放水、全球經濟受疫情影響陷入停滯、美股泡沫跡象顯現的情況下,市場熱錢也按耐不住內心的躁動,開始活躍起來,伺機而動;
漲漲跌跌跌跌漲漲,沒有隻漲不跌的市場。暴跌正是釋放風險。當然不排除這是下一輪全球經濟危機的前兆。
比特幣是被炒起來的價值,它缺乏 社會 公允流通貨幣的價值,僅僅只是一串虛擬數字,它背離了流通貨幣的市場規律。所以才會出現近期的比特幣大幅波動,全網24小時內49萬人爆倉,最大一筆爆倉價值逾2000萬美元,逾46億美元資金「灰飛煙滅」。
請注意實實在在存在的東西並不會憑空的「灰飛煙滅」,幣圈裡實實在在投入的資金僅僅只是從一個人的口袋裡,流向了另一個人的口袋裡。「灰飛煙滅」的只是吹起的那一個個泡沫,既然是泡沫就總有一天就破滅。
從 歷史 的經驗上來看,一個泡沫周期可以分為孕育、繁榮、亢奮、困境、衰退五個階段。在泡沫達到至高點之前每個人都是吹泡泡的人,當然也不乏背後的操控者。每個人參與者都從不斷膨脹的泡沫中看到了不斷上漲的希望,這種不勞而獲得的超出了預期的收益,致使嘗到甜頭的人迷失自我深扎其中,也誘惑著身邊的這些人。
有些人只看到了它能賺錢的前半段,而有些人明知道凝視深淵很可能會被深淵吞噬還是想博一把抽身。最終只有極少數的人能全身而退,而操盤的人在接近高位時早已經拋出套走了絕大部分的資金。絕大多數人都是傾家盪產湊錢買教訓,成為了最終的接盤俠。
可見投資比特幣的人和賭徒無異。這里並不是否決了少量持有比特幣的這些人,就像鑽石、古董、字畫、 游戲 皮膚等,每個人都有每個人的情節,當你想賣掉它們時還能換來潛在的價值。但如果賭上身家性命,很有可能會變成最終的接盤俠。沒有哪個賭徒贏了之後馬上抽身而退,總是希望後面贏得更多,事實總是事與願違。比特幣並不是一個保值的東西,價格浮動較大,炒比特幣可能一夜暴富,也可能一夜變成窮光蛋。
比特幣到底是個什麼東西?比特幣其實就是維持區塊鏈記賬系統的獎勵機制。如果沒有比特幣作為獎勵,沒有哪個組織、機構、個人願意參與到記賬這么一件事情中來。礦工挖礦的目的是賺到比特幣,而對於整個區塊鏈記賬系統來說參與挖礦的人越多,參與賬本數據確認的人也就越多,區塊數據也就越安全。
最開始的時間,每次獎勵50個比特幣,每過4年時間獎勵減半:
2009-2012年,每次獎勵50btc;
2013-2016年,每次獎勵25btc;
2017-2020年,每次獎勵12.5btc;
按照這樣的規劃,到2140年左右,獎勵會變為0,比特幣總量約2100萬個。比特幣的稀缺屬性,決定了它會有升值的空間,也被很多人看重了炒作吹泡泡的前景。像極了過去的至尊QQ號,當微信出現後,QQ號的虛擬價值都陡然消失。
區塊鏈中那麼節點記賬,那以誰的為准呢?中本聰想到了:區塊鏈的每一個節點通過「挖礦」來爭奪記賬的權利。
挖出來的礦通過驗證後,和賬本一起封裝,廣播到區塊鏈中,這樣就完成了記賬的過程。
「挖礦」其實就是利用機器來解一道數學題(不要試圖用人力計算),誰最先算出來最接近的結果誰就擁有了記賬的權利,當然也會獲得相應的獎勵。比特幣挖礦的演算法,是對區塊頭做兩次sha256哈希運算,得到的結果如果小於區塊中規定的難度目標,即挖礦成功。
隨機數nonce可以從0試到2的32次方,直到出現的hash結果低於難度目標值,比如猜出來的值輸入後得到hash值前面40個都是零,而要求是前面35個0,那麼肯定符合要求。
這時我們就會發現,比特幣這玩意和我們 游戲 背包的人物皮膚並沒有什麼區別,有的皮膚可以爛大街,有的皮膚轉手就可以賣很多錢,但如果玩這款 游戲 的人少了,不管啥皮膚都一文不值。比特幣也是同樣的道理,它只是被有心人盯住了,然後炒作了起來。
總結比特幣的哀嚎是註定了的。荷蘭的「鬱金香泡沫」是人類 歷史 上第一次有記載的金融泡沫,17世紀奧古斯都鬱金香球莖「期貨」在追逐奢華的荷蘭人中最終演變成了炒賣鬱金香的全民熱潮,在1637年一株「永遠的奧古斯都」鬱金香高達6700荷蘭盾,這筆錢足以買下一棟豪宅,是當時荷蘭人平均年收入只有150荷蘭盾。泡沫是被一個運輸鬱金香球莖的貨船上的水手戳破的,他把球莖當洋蔥煮了,最終還原了鬱金香本來的價值,而最終持有「期貨」的這些人變成了接盤俠。1637年4月,荷蘭政府終止了所有的合同,禁止投機式的鬱金香交易,從而徹底戳破了這場空前的經濟泡沫。
歷史 的車輪不斷向前,類似的案例還有很多很多,但人們總是重蹈覆轍。這是不是很悲哀?正如《阿房宮賦》中「秦人不暇自哀,而後人哀之;後人哀之而不鑒之,亦使後人而復哀後人也。」
以上個人淺見,歡迎批評指正。
比特幣哀嚎一片,能反應出市場的火爆,比特幣一路上漲,早已瘋狂,就看誰是最後的接盤俠。目前看還沒漲到頭,還能瘋狂一陣。畢竟一路上漲,一路有太多人眼紅了,如今又有造火箭的馬斯克來燒一把火,給比特幣作宣傳,大夥兒肯定又一窩蜂進場的,所以稍有波動就會有太多人利益受損。難免哀嚎一片。
美股跌上熱搜很正常的事了,只要美股有個跌幅超百粉2之的,總會有暴跌的新聞出來博眼球,吸引注意力,畢竟好多傳媒公司指著這些新聞賺錢生存呢。
當然美股漲了太久了,太多人坐等美股崩盤呢,就是不知道雪崩來了之後會不會有一片雪花能是無辜的。
美股之前的上漲是不正常的,不是自然上漲,畢竟按照以往來看,受疫情影響,工廠停產倒閉,大量人員失業,經濟倒退,股市按理應該遵從規律是下降的,但是美國瘋狂印鈔票,讓全球分攤它的壓力,繼續著股市的虛假繁榮,如果未來生產力恢復,能夠承接上印鈔帶來的後果,那美股能接著由上去,一旦承接不上那就大概率泡沫破碎,股市會有大回調的。
1這個市場沒怎麼了,沒有波動的市場是沒有投資價值的市場,世界上不存在只漲不跌和只跌不漲的市場。說比特幣大跌的,人家漲了多少萬倍,比這次調整大的不下100次,有什麼杞人憂天的。
2市場總被各種各樣的消息影響,每天的漲跌也都是不確定性的,因為影響走向的力量和人心的力量太多了,但這正是有能力投資者的賺錢機會,市場怎麼可能讓人人賺錢?所以投資市場必然是少數人賺錢的市場。
3如果這樣都要問個怎麼了,那麼一年可能需要問幾百個怎麼了,因為菜鳥投資者永遠無法理解市場的波動。
4美股漲跌,基本是一個月要上幾次熱搜的,跌多了漲,漲多了跌,就是這么簡單。如果這個都不能理解,我建議還是不要參與任何形式的投資,因為你必然虧損。
在剛剛過去的周末里,比特幣接連大漲,一度突破58000美元,創下 歷史 新高,然而北京時間周一數字貨幣行情卻風雲突變,比特幣連續下挫,下午時段接連跌破55000至53000美元的三道整數關口,24小時跌幅超8%。
僅一日,爆倉人數就多達37萬,約245億人民幣灰飛煙滅。幣圈一片哀嚎!多頭爆倉無數!
比特幣為何會在昨日暴跌呢?
直接原因是原美聯儲主席的一句話。
耶倫大姨放話說,比特幣常常用於非法融資,是個具有高度投機性的產品, 以我局外人的身份來說說比特幣,其實無論是什麼幣,無論是什麼交易品種,只要它上市交易,它都遵循一個原則:價格發現。也就是,看漲的人覺得它要漲,那麼就買進!看跌的人覺得它要跌,就賣出。雙方達成了交易意願,買賣成功,價格就定在那裡了。所以究其根本, 是流動性充足的背景下,大家誰先跑路的問題 。這也是比特幣開啟本輪火爆行情的原因。疫情引發了全球經濟萎靡,美國為拯救經濟,大放水。不用別人說,美國人自己心裡就犯嘀咕, 擔心經濟的前景、擔心通貨膨脹、擔心自己財富的去留。 一些投資者認為比特幣是黃金和美元的誘人替代,是完美的「避險資產」,所以很多人都去追逐比特幣, 期望抵禦通脹,以期資產保值 。除此之外,機構的持倉不斷增加,也吸引了投資者盲目跟投,這其中包括了上市企業、基金公司,特斯拉也購買15億美元的比特幣,甚至美國政府也參與其中。十分能理解貨幣寬松下,大家投資避險類資產的急切之心,但在昨天的暴跌,似乎不是那麼一回事。 本輪泡沫是從流動中堆積起來的,機構深這一點,但大家看破不說破,都想做「第一個」跑路的人。 也因此,一點風吹草動,盤面就劇烈震盪。普通投資者的反應如何呢?有的投資者,在恐慌中拋售。有的投資者,趁跌上車。但更多的投資者,是看不清、摸不透的迷茫。這些為了「避險」的目的,進入投機
戰場的人,似乎違背了初心。不妨再回味一下連連拔高的走勢,已然不是便宜的價位了。
歐洲央行行長拉加德曾表示,比特幣不是真正的貨幣,常被用於洗錢,判斷各國央行很快不會將其認作儲備貨幣了。摩根大通的策略師也表示,比特幣的流動性較低,這意味著微笑的的交易量會引起很大的價格波動。埃隆·馬斯克也放言:有點高。
幣圈瞬息萬變,昨夜暴跌,不等大家參透盤面走勢,比特幣又快速實現反彈。要不說跟過山車似的?一個俯沖下來你驚心動魄,怕的想跳車,等下車又發現車都直飛雲霄了。所以,大家要認清自己的投資目的,是追求避險?還是尋求刺激?是穩穩積累資產?還是忍受暴跌的煎熬?幣圈裡最苦的是那些後進來的「玩家」,他們大部分沒有投資經驗,聽著「專家」的建議,憑著感覺去操作。但要知道大量的比特幣集中在極少數人手裡,他們擁有價格的掌控權,這也導致普通玩家大概率都逃不過「貪婪」這條人性的弱點,在暴漲暴跌間迷失自我,也丟掉金錢。
本質上都是被華爾街資本控制的玩具,就算他們想把比特幣炒到5、60w美金一枚,也不足為奇。也別談什麼區塊鏈,比特幣的實用價值,扯那些沒用。
前段時間看到一些人賺得盆滿缽滿,到處都是曬收益的,加杠桿輕松盈利上十倍。這兩天則好多爆倉的,虧得一塌糊塗,血本無歸。真正能守住收益,全身而退的不多。
資本收割起來是無情的,也別談這是投資,就是賭徒而已。比特幣不是普通人玩的。
沒有隻漲不跌的市場,沒有隻跌不漲的市場,貨幣政策
這個市場一直都是這樣的,永遠都是少部分人賺錢,大部分人虧。
你賺的錢就是他人虧的錢。
首先比特幣的波動,讓一般人的心電圖根本吃不消的。比特幣一直說只有2100萬枚,但是它可以到小數點後面好多位,那簡直就是無限個了。可以切割交易。本質上比特幣就是無限了,進場的大部分人都是為了套了利就走。
但是大機構掌握了將近80%的比特幣,你們怎麼玩?
再來說說美股,這個玩意一直是配合美聯儲割韭菜的,不僅僅割美國的,還割全世界的韭菜。只要一天美元還是世界各國結算貨幣,那麼美國就會像魔鬼一樣,不正常。
最後談談我們的大A股,中國這幾年發展的這么好,結果A股,美國香港跌我們跌,美國香港漲我們跌。最近幾天把之前漲的都跌沒有了。很多人說要抄底了,但是就怕抄到半山腰啊!這就尷尬了啊!現在基金一天可以少7%,跟股票差不多。
金融的錢果然不是好賺的。
借錢也要看人。
❽ PoW共識機制的原理
比特幣的共識機制就是PoW共識,借鑒了HashCash的處理方法, 下面就來說說比特幣如何進行PoW共識的。
從區塊頭的結構中可以看到一個4 bytes的Nonce值,Nonce值的變動會影響整個區塊頭的哈希值,挖礦節點即是通過嘗試不同的Nonce值(通常從0開始每次加1),尋找一個哈希值小於Difficulty Target指定的難度值。
PoW證明過程,這也就是俗稱的挖礦過程, 找到合適的哈希值。
這里不詳細說明區塊打包過程, 區塊通過一定的演算法被生成, 當然生成是需要一定的代價的。
區塊頭里的各個值並不是隨機的, 而是由固定的演算法得出, Merkle根哈希值就是把交易打包變成一顆Merkle樹, 最後得出根的哈希值者困, 難度值是根據演算法不斷調整, 要維持出塊速率是10分鍾出一個塊。
首先我們把所有交易打包生成Merkle樹, 計算Merkle根的哈希值, 然後組裝區塊頭, 把區塊頭不斷進行SHA256(SHA256(區塊頭))雙重哈希操作, 然後判斷是否小於網路目標值, 這里其實就是把它變成2進制, 二進制前面有多少位是沒有0的, 因為有1的話, 這個十進制的值肯定是很大的, 就不會符合條件。 如果大於這個目標值, 說明前面的位數沒有滿足前多少位為0的條件 哈希不成功, 那麼就改變隨機數值,組成新的區塊頭,繼續哈希。
這是就是是挖到礦了,其他節點驗證的話也簡單,只要做一次SHA256(SHA256(驗證區塊頭))來判斷。
比特幣挖礦難度調整方式非常簡單,難度目標調整即不斷將256位的難度值減小,如277315號區塊的難度值十六進製表示為:
這個數字在二進製表示下前60位均是0,如果要增加難度只需要減小這個值,隨著難度值的減小,起始0的個數增多,可尋找的哈希值范圍減小,挖礦難度就越大。
難度的調整是在每個完整節點中獨立自動發生的。每2016個區塊,所有節點都會按統一的公式自動調整難度。如果區塊產生的速率比10分鍾快則增加難度,比10分鍾慢則降低難度。
公式可以總結為:新難度值=舊難度值×(過去2016個區塊花費時長/20160分鍾)
優點
缺點
1:挖礦過程為什麼要計算兩次哈希值?
中本聰在設計比特幣的挖礦演算法的時候,考慮到SHA2-256演算法存在被破解的可能,雖然在理論上並未出現對SHA2-256演算法的攻擊。為了減弱攻擊的威脅,區塊頭數據要對SHA2-256演算法運算兩次。
2:如果所有節點都從0開始嘗試Nonce值,那不就永遠都是算力高的節點先計算出有效的結果,算力低的節點永遠沒希望挖礦成功?
區塊頭大部分信息都是一樣的,但是Merkle Root對於每個節點必然是不同的,因為每個節點都會有自己的Coinbase交易,該交易中存在節點礦工的地址,此地址山嫌肆對於每個獨立挖礦節點都是不同的,根據哈希函逗轎數的雪崩效應可知每個獨立節點的Merkle Root必定有顯著的區別。
3:如何解決拜占庭問題?
通過工作量證明就增加了發送信息的成本,降低節點發送消息速率,這樣就以保證在一個時間只有一個節點在進行廣播,同時在廣播時會附上自己的簽名。工作量證明其實相當於提高了做叛徒(發布虛假區塊)的成本,只有第一個完成證明的節點才能廣播區塊,競爭難度非常大,需要很高的算力,如果不成功其算力就白白的耗費了,整個系統也因此而更穩定。
❾ 比特幣挖礦一定要用計算機嚒我們為什麼不能用紙和筆來計算呢
比特幣其實是一個毫無用處的一串數字,但是被大家公認為有用,它就像鑽石、古董、字畫、游戲皮膚等被賦予了價值。既不能吃,也不能用,但我們還是會認可它們的價值。
「挖礦」僅僅只是讓更多的人參與進區塊鏈網路的建設中來,這么多的電費用來「計算」一串虛擬的數值這樣真的好嗎?比特幣並不是一個保值的東西,價格浮動較大,炒比特幣可能一夜暴富,也可能一夜變成窮光蛋。比特幣也並非宣稱那樣安全,2014年全球最大的比特幣交易網站MtGox被黑客入侵導致破產,價值4.67億美元的比特幣瞬間蒸發。犯罪分子用它來洗錢、逃稅等等,政府想去調查也是相當困難的一件事。以上個人淺見,歡迎批評指正。認同我的看法,請點個贊再走,感謝!喜歡我的,請關注我,再次感謝!
❿ 比特幣礦機運算的是什麼
從用戶的角度來看,比特幣就是一個手機應用或電腦程序,可以提供一個個人比特幣錢包,用戶可以用它支付和接收比特幣。這就是比特幣對於大多數用戶的運作原理。
在幕後,整個比特幣網路共享一個稱作「塊鏈」的公共總帳。這份總帳包含了每一筆處理過的交易,使得用戶的電腦可以核實每一筆交易的有效性。每一筆交易的真實性由發送地址對應的電子簽名保護,這使得用戶能夠完全掌控從他們自己的比特幣地址轉出的比特幣。另外,任何人都可以利用專門硬體的計算能力來處理交易並為此獲得比特幣獎勵。這一服務經常被稱作「挖礦」。
比特幣挖礦經歷了三個發展階段,在比特幣剛剛誕生時,比特幣的價格很低,大家只是把比特幣當做一種游戲,使用自己普通的電腦進行挖礦,但在2012年隨著比特幣價格的上升,人們發現顯卡挖礦速度較快,因此,人們開始購買大量顯卡組裝到一起進行挖礦,俗稱「燒顯卡」;第三階段,就是大家熟知的ASIC礦機挖礦,自從阿瓦隆生產出世界上第一台ASIC比特幣礦機,比特幣挖礦就徹底的被顛覆了,挖礦成為了一個特別專業的事情。