最近不管是在技術論壇,仍是羣分享會,都在熱火朝天地聊着區塊鏈,那麼今天我就本身的理解和你們分享一下什麼是區塊鏈。html
之因此區塊鏈忽然火起來,是由於比特幣在2017年年末忽然暴漲,能夠看到圖中從11月份開始到12月份的暴漲,加重了人們對比特幣的認識,不過也由於投機的人多了,最近開始跌了。git
能夠點這裏看看它值多少錢。算法
比特幣其實就是一種流通於網絡的虛擬貨幣。區塊鏈是比特幣的底層核心技術,由於對比特幣關注增長,間接致使人們對區塊鏈技術的興趣探索。數據庫
接下來咱們仍是先從比特幣源頭聊起。網絡
問:若是兩個陌生人要進行遠距離交易,要怎麼保證信任?electron
答:經過第三方——好比某寶。 分佈式
買家轉帳給第三方,賣家發貨,而後第三方付款給賣家。ide
這種須要第三方參與的交易模式成爲「中心化交易模式」。區塊鏈
目前大部分的交易都是中心化模式的,好比銀行轉帳,證券炒股,證實這種模式在現實世界確實是目前最優的解決方案,可是它也有缺點。ui
1.必須有個可靠的中心——若是中心不可靠,帶着錢跑了怎麼辦?
2.中心要獲取沒必要要的我的信息來構建信任——中心和不認識的甲乙雙方也須要構建信任,這個信任就是你的我的信息(身份證,手機號等)。(並且這一過程也是一種資源的浪費)
3.受中心的制約——你給別人轉賬,可能由於記賬機構放假而延遲幾天到賬,可能由於記賬機構要盈利而付高額手續費,可能由於記賬機構做弊或系統崩潰而受到損失。
那麼問題來了——
有人就提出了一個新方案,中本聰在2008年11月1日發表了一篇論文《比特幣白皮書:一種點對點的電子現金系統》,提出了一種徹底經過點對點技術實現的電子現金系統,它使得在線支付可以直接由一方發起並支付給另一方,中間不須要經過任何的金融機構。
這時候去中心化借貸模型就出現了。舉個栗子——
A借了B 100塊錢,這個時候,A在人羣中大喊「我是A,我借給了B 100塊錢!」,B也在人羣中大喊「我是B,A借給了我100塊錢!」,此時路人甲乙丙丁都聽到了這些消息,所以全部人都在心中默默記下了「A借給了B100塊錢」。
這個時候一個去中心化的系統就創建起來了,這個系統中不須要銀行,也不須要借貸協議和收據,嚴格來講,甚至不須要人與人長久的信任關係(好比B忽然又改口說「我不欠A錢!」,這個時候人民羣衆就會站出來講「不對,個人小本本上記錄了你某天借了A100塊錢!」)。
在上述的模型中,所謂的「100塊錢」已經不重要了。換句話說,任何東西均可以在這個模型中交換,甚至你能夠憑空杜撰一個東西,只要你們認可,你就可讓你杜撰的東西流通。
好比我在人羣中高喊一聲「我創造了1w個騰訊幣!」,我甚至不須要知道騰訊幣是什麼,也不須要關心世界上是否是真的有騰訊幣,只要你們都聽到,而後在本身的小本本上記下「A有1w個騰訊幣」,因而我就真的有1w個騰訊幣了。
今後之後,我即可以聲稱我給了某人xxx個騰訊幣,只要路人甲乙丙丁都收到而且認可了這一信息,那我就算完成了此次交易,哪怕世界上沒有騰訊幣。
沒錯,比特幣也是這麼來的。
甲乙丙丁就是網路上的其餘結點地址。
AB君就是兩個結點地址,任意兩個結點發生交易都會廣播給全部結點。
大家可能會問:「憑啥你喊一句話我就幫你記?我不要面子的嗎」。爲了激勵你們幫我傳話和記帳,我決定給第一個聽到我喊話而且記錄在小本本上的人一些獎勵:你就憑空獲得了50騰訊幣,這個是整個系統對你幸苦記帳的報酬,而你記錄了這句話以後,要立刻告訴其它人你已經記錄好了,讓別人放棄繼續記錄這句話,並給你本身的記錄編號讓別人有據可查,而後你再把個人話加上你的記錄編號一塊兒喊出來,供下一我的記帳。 當這個規則定下之後,這個系統中必定會出現一批人,他們開始豎着耳朵監聽周圍發出的聲音,以搶佔第一個記帳的權利。
這個就是比特幣去中心化的運做機制,當全網任意結點發生交易時,都會有其餘結點幫忙記帳。
假設過了很長一段時間,我憑空創造的騰訊幣已經在這個系統中流通了起來,你們都開始承認了騰訊幣。可是這個系統中一共就只有1W個騰訊幣,因而有人動了壞心思,他在人羣中高呼「我有1W個騰訊幣!」怎麼辦?你們是直接在本本上記下他有1W個騰訊幣麼,這樣不是人人均可以僞造了麼?
爲了防止這種現象發生,我決定在我創造騰訊幣的時候給我喊的那句「我創造了1W個騰訊幣」打上標記,好比標記爲001),這樣之後在每一筆交易的時候,我在高喊「我給了某某1個騰訊幣!」的時候,會附加上額外的一句話:「這1個騰訊幣的來源是記爲001的那條記錄,個人這句話標記爲002!」。咱們再抽象一點,某人喊話的內容的格式就變成了:「這句話編號xxx,上一句話的編號是yyy,我給了某某1個騰訊幣!」,這樣就解決了僞造的問題。
其實上述模型就變成一個簡化的中本聰初版比特幣區塊鏈協議。
2009年1月3日,中本聰創造了第一個區塊——創世區塊,裏面有50比特幣。並附帶了一句話:
「The Times 03/Jan/2009 Chancellor on brink of second bailout for banks」,這一句話是當天泰晤士報的頭版文章標題,確認了比特幣的誕生時間。
那大家又要問了,你們都說本身是第一個記帳的怎麼辦?
因而一種新的規則——共識算法產生了。
列舉兩種方法:
工做量證實:我規定,只有作對一套五年模擬、三年高考試卷的第一名,纔有權利記帳。
工做量證實機制是算出答案很困難,可是檢驗答案很容易的一種機制。
比特幣使用的是工做量證實,讓每一個想要挖礦的計算機結點先去作一道有難度的計算題,先算出來的有權利記帳。計算難度大概使得須要花費10分鐘才能算出來。這就是爲何前面說每10分鐘挖出一個區塊。
可是工做量證實的毛病是帶來沒必要要的消耗,由於只有一我的是第一名,其餘人完成的工做量都是徒勞的。
所以有人提出了權益證實:
權益證實:我規定,持有騰訊幣最多且持有天數最多的人,纔有權利記帳。
這個也有問題,就是強者越強的問題。
挖礦的人須要求出一個隨機值,使得:SHA256( 隨機值 + H( 區塊頭 ) ) < 某目標值
系統每產生 2,016 個區塊,會動態調整目標值(難度),使得每產生一個區塊須要約十分鐘。
難度值公式能夠想象成:
新難度值 = 舊難度值 * ( 20160 分鐘 / 過去2016個區塊花費時長 )
目標值的計算公式能夠想象成:
1.目標值 = 最大目標值 / 難度值
2.其中最大目標值爲一個恆定值: 0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
目標值能夠想象成: 0x00000000000000000000000000000000000000000000000017268d8a21a
難度的調整是在每一個完整節點中獨立自動發生的。每2016個區塊,全部節點都會按統一的公式自動調整難度,這個公式是由最新2016個區塊的花費時長與指望時長(指望時長爲20160分鐘即兩週,是按每10分鐘一個區塊的產生速率計算出的總時長)比較得出的,根據實際時長與指望時長的比值,進行相應調整(或變難或變易)。也就是說,若是區塊產生的速率比10分鐘快則增長難度,比10分鐘慢則下降難度。
咱們也能夠簡單理解成,比特幣工做量證實的過程,就是經過不停的變換區塊頭(即嘗試不一樣的nouce值)做爲輸入進行SHA256哈希運算,找出一個特定格式哈希值的過程(即要求有必定數量的前導0)。而要求的前導0的個數越多,表明難度越大。
區塊頭裏麪包含了版本號,父塊的哈希值,還有Merkle根,還有時間戳,還有難度值,還有nonce(number once,只有一次的數字,密碼學專用名詞)……
等等,Merkle根是什麼??
Merkle是一種二叉樹,在每一個區塊中有若干交易,將每一個交易作一次Hash0,而後每兩個交易的Hash0再合併Hash1,再把兩個合併的Hash1再合併Hash2……用上圖舉例,就是交易1和2各自哈希後再合併哈希變成Hash12,再和Hash34合併哈希變成Hash1234,再和Hash5678合併哈希變成Hash1-8……
特色:
快速比較大量數據:當兩個默克爾樹根相同時,則意味着所表明的數據必然相同。
快速定位修改:例如上例中,若是 N4 中數據被修改,會影響到 N34,N1234 和 Root。所以,沿着 Root —>N1234 —>N34,能夠快速定位到發生改變的 D1;
零知識證實:例如如何證實某個數據(H1-8)中包括給定內容 交易6,很簡單,構造一個默克爾樹,公佈 H1-8,H5678,H56,H6,交易6 擁有者能夠很容易檢測 交易6 存在,但不知道其它內容。
咱們最開始說了比特幣這麼值錢,並且誰均可以去挖礦,那咱們是否是如今就能夠回家挖礦了呢?
理論上是的,實際上,要考慮計算機的算力(計算能力),前面咱們也說了挖礦的難度很大……淘寶搜一下挖礦機,你看到的會是這樣的。
可是確實有人不幹別的,就挖礦,有的公司僱人專門維護這些礦機的正常運行。這些礦機的電力消耗可能就要幾十萬。
「中國上海浦東新區張衡路」上的節點和「美國紐約曼哈頓第五大道」上的節點異口同聲喊出來:「我挖到區塊了!裏面的交易都是有效的!獎勵歸我!」。其餘節點也幾乎同時參與了對這兩個區塊的校驗,結果發現這倆都沒毛病。
這已經嚴重違背了區塊鏈世界裏第一大最基本原則——全部節點共同維護同一份數據。因此,爲了解決這個問題,區塊鏈世界引入了一條新的規則——
擁有最多區塊的支鏈將被承認,較短的支鏈將會被直接棄掉。
咱們大夥都知道挖礦的過程存在巨大的工做量,而且在計算機的硅基世界裏,不可能出現所謂 「同時」 的概念,哪怕納秒的差異,那也老是會有前後順序。因此理論上,「分叉」的這種僵局很快會在下一個區塊被挖掘出來(以及校驗區塊)的時候被打破,實在不行下下個,或者下下下個……總之機制可讓整個分叉的區塊鏈世界迅速穩定下來。
另外,同一時間,較短分支上的區塊會當即丟棄,而裏面的交易也會隨之釋放出來,被從新標記上「未確認」。
從前,有一個頗有錢也很聰明的人——X-Man,他說:「
我是X-Man,我頗有錢,擁有一個強大算力的計算機羣。
我先從某個區塊創造了一條獨立的含有多個區塊的鏈條,而後裏面記錄着我轉給本身1000個比特幣。
這條獨立的區塊鏈先不廣播給全網。而後我找到張三,給了他1000比特幣買他1000萬人民幣,
當這筆交易被三次確認後(三個區塊被挖出),張三給了我1000萬。
這個時候我再把我獨立的區塊鏈條廣播出去,個人鏈變成了最長鏈,我和張三的交易就被棄掉了,可是我卻拿到了他的1000萬。」
這個就是雙花問題——即利用系統漏洞來使得貨幣重複花費。
X-Man的想法確實可行,可是他的計算機羣要對抗的是全世界的計算機,除非 X-Man 擁有全網 51% 的算力,不然構想不可能實現。這就是51%攻擊,擁有51%算力已是不太可能的事情了。
但即使 X-Man 真擁有全網 51% 的算力,在真實世界中,用這 51% 算力作其餘事(好比挖礦或者其餘算力服務)都比攻擊比特幣系統划算。
區塊鏈(Blockchain)是一種防篡改、共享的、可追溯的分佈式帳本數據庫技術
防篡改:單點的修改,必須經過其餘多個節點共識承認後,才能成功 可追溯:區塊鏈帳本,只容許寫入,不容許刪除 共享:帳本對參與節點透明
比特幣網絡裏,每十分鐘誕生一個新的區塊,區塊裏打包了網絡裏最近十分鐘內產生的交易。某一個礦工作Hash運算得到這個區塊的記錄權,同步到其餘礦工節點去。
每一個區塊都添加在上一個區塊的後面,造成一條長鏈條,因此稱爲「區塊鏈」。
公有鏈: 一、無官方組織及管理機構維護 二、全部節點權限一致 三、自由加入和退出
典型應用:比特幣、以太坊
(公有鏈有它的價值,可是太極端了,因而產生了稍微弱中心化一點的聯盟鏈。)
聯盟鏈: 一、由若干機構聯合進行發起和維護 二、節點權限一般是混合型 三、經過受權加入和退出
典型應用:騰訊區塊鏈(trustSQL)
公益尋人平臺衆多,就鵝廠都不止以下:
存在的問題:
同步不及時 重複報案 & 多方撤案 解決方案:使用區塊鏈讓你們共用一個鏈條,信息同步快,一方報案,多方廣播。
最近在幣圈,有一款擼貓的遊戲在網絡也很火(咱們之因此沒有感受到是由於這是個土豪的遊戲,咱們玩不起)。
如何開始玩:玩家用ETH做爲「貨幣」來買賣貓,先去市場上買一隻貓。先挑便宜的買,買貓須要手續費(爲了防止以太坊區塊鏈擁堵)。
買了兩隻後:就可讓它倆生小貓。每隻貓都有256個屬性,控制着毛色、花紋、鬍鬚、牙齒等等,能夠理解成256種不一樣的基因。兩隻貓繁殖的時候,基因以必定的機率遺傳。基因也會突變,若是遇到基因突變,就會生出奇形怪狀的小貓。
這些小貓因爲基因突變,每每能賣出高價。
每次生完小貓後,父母就會進入Cooldown模式,必須「恢復」一段時間才能繼續繁殖小貓。每隻貓恢復的時間有長有短,並且越生得多恢復的時間就越長。恢復時間長短也是影響貓價的一個因素。
若是隻有一隻貓,想跟別人的貓配種,也能夠到市場上看看。玩家1能夠標一個「配種價」,玩家2若是想配種,須要支付給玩家1這個價格,生下來的貓歸玩家2全部。基因優秀的貓能夠在配種市場上標個高價。
配種成功後,生育也須要一段時間(幾個小時不等)。小貓出生後,就能夠在My Kitties頁面看到新出生的小貓。
每隻貓都有Gen標識,Gen 0表示這是創世貓,Gen 1是第一代,Gen 2是第二代,以此類推。每隔大約15分鐘,會產生一隻Gen 0的創世貓,並經過合約自動拍賣,拍賣所得進入開發商的錢包。
最大的區別是,遊戲規則確立後,你的貓永遠是你的貓,開發商無權也沒法剝奪任何人的貓。而云擼貓是一箇中心化的遊戲,全部的貓都登記在開發商的數據庫中,開發商能夠隨時篡改、剝奪任何人的貓,開發商也能夠任意給本身建立高價貓。想一想看,在線遊戲中的道具不過就是開發商本身建立並拿來出售的數字資產,沒有任何方式能夠保證開發商不做弊。
Refrences: