1. 程式人生 > >比特幣與區塊鏈的大眾科普文

比特幣與區塊鏈的大眾科普文

pga 哈希算法 進行 具體步驟 tex 避免 sha 轉換 難題

後傳

很多朋友看了本文後,有一些不理解的地方,為了保持原文,我把問題解釋以及勘誤附在了最後。如果還沒有看過本文,請跳過這一節。如果看過了本文,就直接跳到本文最後的”問題解釋“那一節。這個”後傳“頗有C語言if-goto的味道...

前言

本文相對稍微長一點。
近日不知道為什麽,區塊鏈重新又火了起來,自2013年結識這個概念到現在已經4年了,最近由於大家都在聊這個,我也就想參與進來,然而我發現這是一個很難學習的東西,我一直不明白為什麽就沒有人能把區塊鏈的技術講明白,不管是各種博客文章,書籍以及知乎上那種帶有抑揚頓挫感的裝逼文,目的都好似在說區塊鏈技術多麽牛逼,多麽難,而作者自己學會了,從而印證作者多麽牛逼,多麽牛。這些資料看完之後,很多人都會覺得這完全就是一個新的領域嘛...搞IT的看不懂,搞金融的看不懂,社會評論人也只是知道個大致思想...
後來我仔細思考了這個問題,區塊鏈技術難嗎?其實不難,我發現區塊鏈裏面所有的組成元素都是現有的東西,在《技術的本質/》一書中,作者提到組合現有的技術會出現多麽令人驚奇的事情,確實是這樣,區塊鏈就是這麽一件令人驚奇的事情。那為什麽區塊鏈以及構建於其上的比特幣看起來如此的晦澀?Why?
答案很簡單,不管什麽東西,哪怕再簡單的東西,只要一跟互聯網聯系起來,基本上90%以上的人就覺得是是高科技了,如果再跟非對稱加解密,哈希技術聯系起來,這些人中有一半要望而卻步了(區塊鏈技術使用了密碼學這種讓人膜拜的學科...),然後,金融,金融,金融,這又是跟金融關聯的,又有一半的人退出,如今難道不是金融和IT最火爆嗎?最火爆的難道不是門檻最高嗎(誰這麽告訴你的??)?最後,關於比特幣,區塊鏈的好資料是有的,但都是國外的,國外的東西都是英文的,剩余人中又有一半英語不好覺得beyond
their
ablity了...最後的最後,即便你的英語不錯,前提是你能Google麽?你能Youtube嗎?好了,最後不剩幾個人了。總結來講,想快速理解比特幣區塊鏈的技術原理,你需要IT,金融,英語,翻一座偉大的墻,又是跨界又是重體力活,這就是它不易理解的原因。

我終於想寫一篇關於比特幣區塊鏈的文章了,今天生病請假休息,跟老婆(日語文學碩士,不懂金融,不懂IT,但也不是一點也不懂,稍微懂一點)講講比特幣,我的原則是,只要她能聽明白,我就寫出來,於是拿著本子畫了幾個圖,講了幾句,然後老婆竟然懂了!我的講法比較特殊,我沒說什麽哈希函數,ECC之類的東西,我敢說一說那個我估計就講不下去了,我用指紋,帶鎖的存錢罐來代替這類概念,沒想到還挺成功。以下是我講課的手稿拍攝圖:

技術分享圖片技術分享圖片

本文主要是把給老婆講比特幣的內容寫出來。希望對別人也能有所幫助。在我看來,比特幣僅僅需要三大構件即可,包括一個基礎構件即P2P網絡,另外兩個核心構件包括一張交易網和一條區塊鏈,我不會在文中一開始就扯這兩個概念,而是慢慢引入,至於基礎構件P2P網絡,我甚至通篇沒提到。

首先明確要解決的問題

首先我們看一下基於貨幣的交易過程(相對於以物易物來講)需要哪些必須要做的事情:

1.交易是否可行

這個問題就是在問,交易前,你有沒有足夠的錢來進行這次交易,即必須要保證你有錢。

2.如何證明交易是有效的

這個問題就是在問,交易後,如何防止這筆錢再進行另一筆交易,即必須要保證錢花完了就沒了。

基於紙幣的交易可行性

我們先從紙幣交易開始討論,然後再看下銀行轉賬,最後切入到電子貨幣的交易。
在我們日常的紙幣交易中,這兩個問題幾乎不是問題,因為紙幣是物理的,且不可偽造,它拿在你手裏就是你的,交給別人那就不是你的了,所謂的一手交錢,一手交貨就是這個道理。當然,搞IT的人較真兒成本非常低,就說什麽紙幣也是可以偽造的,但面對這種挑戰和質疑我不想搭理他們,只想問一下,你制造一張一元錢的紙幣試試??我放話,你能一分鐘內制造一張一元的紙幣且不被防偽措施認出來,我一次性給你1萬元真紙幣,幣種為人民幣。
對於銀行轉賬而言,比如你在ATM機上轉賬,沒有任何物理物品的交易,只是在按鍵上按捺一些數字,好像問題變得很難。但是由於有了銀行這個機構,問題似乎也能很容易解決。當你要給李明轉賬1000元的時候,這個消息會發送到銀行,銀行會查你的賬戶裏面是否有1000元的余額,然後查詢李明這個賬戶是否存在,如果一切通過,銀行會在轉賬前鎖定你的賬戶,這意味著在轉賬完畢前你不能用這個賬戶進行任何交易,然後將錢轉入李明的賬戶,最終在解除鎖定前,你的賬戶中會少1000元,而李明的賬戶中會多1000元,這個過程非常容易理解。
現在進入電子貨幣的時代!
-------------------------

電子貨幣情況下如何證明你有足夠的錢交易

所有的電子貨幣交易在網絡上只是一系列數字的傳輸而已。現在問題來了,在數字信息可以隨意復制的前提下,如何來證明你有足夠的錢可以用來交易?
讓我們回歸本源。來在網絡上模擬一下紙幣的交易。
當我們用紙幣來交易的時候,其實我們無意中構建了一個交易網。考慮到從ATM取款,支付寶,微信支付會讓事情變得復雜,我假設工廠,公司都是以現鈔來發工資,所有的交易全部是現鈔進行,那麽對於每一個人而言,當你花錢的時候,你手裏的鈔票必然是另外一個人給你的,而不是你憑空制造的!你沒有能力憑空讓鈔票產生,這一點非常重要(不要相信程序員眼中那無所不能的技術,比如3D打印什麽的,太書生氣。直接點說吧,印假鈔對於我們99.99%的平民而言,幾乎是不可能的!)。
那麽即便你買個魚缸和牛肉,交易也會像下面的樣子形成一張網:

技術分享圖片

這實則就是一張網啊。之所以我們平時不會註意這張網的存在完全是因為鈔票拿在自己的手裏然後交到別人手裏,一張鈔票在自己手裏,你可能會擔心別人會搶走它,因為鈔票是匿名的,誰占有它就是誰的,所以會有搶劫的,也因此國家會立法把搶劫定為重罪。如果我們忽略央行,忽略國家,那麽這張交易網就是完全理想的交易網。假設貨幣的總量
是固定的,並且我們從來不把錢存入銀行,也從來不從銀行貸款,僅僅是用紙幣來交易,那麽就不會有通貨膨脹,也不會有次貸危機...我們不需要銀行為我們保有余額,我們只需要知道自己能否進行當前的一筆交易就行了。
如果不考慮搶劫,不考慮國家的幹預,那麽以上這張網就是完美的!沒有什麽人或者機構可以完全控制這張網,這張網會自然伸縮,其形狀和伸縮速率完全取決於供求關系。好的,我們現在要在互聯網上重建這張網!用電子貨幣代替紙幣。
-------------------------
先看下這張網有什麽特點呢?
0.貨幣的總量是一定的(我已經假設可以忽略央行濫印鈔票);
1.對於花錢的人,每一筆花出去的錢都要有一個確定的來源;
2.對於收錢的人,任何發給自己的錢都可以無條件接收;
3.如果你的一筆錢花出去了,就不能再次花出去。

以上的兩個特點可以把每一次的交易結果抽象成一個交易單,如下圖所示:

技術分享圖片

非常清晰的一個交易過程。在物理世界中,紙幣是一個物理實體,不可復制,不可偽造,在誰手裏就是誰的,這很容易理解,自從有了交換以來,我們的世界也一直都是這麽運行的,問題是,在基於數字技術的互聯網虛擬世界中,如何構造這張交易網?!
-------------------------
首先來看看這張網是什麽樣子的?

技術分享圖片

-------------------------
請註意,這張網是所有人一起構建的,涉及到參與電子貨幣交易的每一個人,這個和紙幣交易網是完全一樣的,在紙幣交易中,由於紙幣的物理屬性,這張網是唯一的,在數字世界,我們又如何來保證這張網的唯一性呢?這貌似是不可能的,然而試想如果每一次交易都讓所有的人都知道,最終大家是否能夠建立共識呢?而這種共識的輸出就是這張唯一的網。當然,如果有個別的人不接納某筆交易,那也無所謂,只要大多數人產生共識能繼續相信這張共同的網可以繼續膨脹下去即可繼續交易下去。
每當發生一筆交易,全部所有的人都會被通知到,因此如果你”憑空造出了一些貨幣“,那麽幾乎所有人都不會認可,因此你的這筆交易便不會被納入到交易網中,這種欺騙如下圖所示:

技術分享圖片

如果你透支自己當前擁有的可用貨幣,那麽別人也不會認可,這筆交易也不會被納入到網中,如下圖:

技術分享圖片

其實,你把比特幣看成互聯網上的”紙幣“即可,為了消除數字信息可復制性帶來的影響,需要用全網的共識來替代物理屬性的真實。在數字網絡中,你自己復制一份信息是沒人知道的,但是全網的信息總量是一定的,如果你復制一份信息,雖然沒人知道到底是誰復制的,但是可以知道的是,確實多了一份信息,這就是達成全網共識的重要性。

問題到此貌似全部解決了!只要所有人達成共識,那你的任何行為都不可抵賴,就這麽簡單。在電子貨幣領域,所謂的共識就是一張幾乎所有人都認可的交易網絡,大家都認可它,那它就是可信賴的。

電子貨幣交易的不可抵賴性

在宏觀上,我已經展示了這張交易網是什麽樣子的。但是在細節上,一個人到底應該怎樣付款給另一個人的呢?怎麽證明付款者就是其本人呢?
如果人們可以用筆在每筆交易上簽署個個人簽名或者按一個自己的拇指紋的話,問題就可以解決。事實上,在電子貨幣領域,問題就是這麽解決的!
接下來我們看下如果A付給B一些錢,怎麽證明這些錢就是A付給B的,而不是A‘付給B的。
感謝數學,感謝有了非對稱加密技術!這項技術理解起來非常簡單(雖然它的數學過程會非常復雜),即你有一對密鑰,一個是私鑰,無論何時何地都只有你自己保有,另一個是公鑰,可以公開給全世界。這對密鑰的特點是:
設Pub為公鑰,Pri為私鑰,一段消息M用Pub加密後有且只有用Pri可以解密到M,反過來也一樣,有且只有用Pri加密後用Pub可以解密。
用戶A可以把自己的公鑰PubA公開給全世界,當其要付款給B時,用自己的私鑰給付款消息進行加密(術語叫做簽名),然後B收到消息後,用A的PubA對消息進行解密(術語叫做驗簽),即可以證實是否付款消息來自A:

技術分享圖片

這就解決了誰是付款人以及確認收款人的問題。
到此為止,從宏觀到細節,我們都有了大致的輪廓,看起來問題真的全部解決了。
但是我們真的把所有的問題都考慮到了嗎?
試想下面的一個場景,我要向溫州皮鞋廠買一雙皮鞋,我付錢給了皮鞋廠老板,他很快收到了我的電子貨幣,然而同時我又把同一筆錢付給了西裝廠老板,間隔一段時間後,我才將這兩筆交易通知給所有人,而此時兩位老板均已經收到了我的電子貨幣並分別寄來了皮鞋和西裝,然而隨後當大家均收到了我的兩筆交易單,來自同一筆錢,那麽到底是買西裝有效還是買皮鞋有效呢?不管哪個有效,總之,皮鞋廠老板和西裝廠老板總有一個要損失。這就是問題。這是一個交易發生和交易核對的時間差問題。
問題就是,怎樣才能證明一個交易已經生效?
-------------------------

一筆錢花多次的問題如何解決(雙花問題)

到此處為止,我一直努力嘗試用非技術的話來闡述一個很技術的話題,為了讓技術人員看到這裏不覺得我在扯淡,我這裏插一句,區塊鏈的設計非常類似Linux內核中兩階段可睡眠的RCU鎖的設計,兩者總體思想是完全一致的。RCU中最終Update的時機就是所有進入Copy前的Reader全部撤出的時機,采用兩個階段的遞減計數器,靠計數器變為0來觸發階段性Update任務的提交確認,這個正和區塊鏈靠把交易單囊入區塊來提交確認是一致的。
回到交易確認問題。在時間的流逝方向上,構建了一個接著一個的區塊,每一個區塊囊括了一些交易單,所有被區塊囊括的交易單便被認為是有效的交易。而沒有被區塊囊括的交易單怎被認為是暫時無法確認的交易單,需要繼續等待其被區塊囊括:

技術分享圖片

在上圖中,交易單a-i均已經被區塊囊括,因此這些交易單是可以100%被信任的,然而交易單j-p則是遊離的交易單,沒有被區塊囊括,所以它們是未被確認的,所有的交易者必須等待自己的交易單包括在區塊中,才可以認為這筆交易是安全的,否則便可能出現前面說的西裝皮鞋的事情。現在的問題是,區塊是如何生成並囊括交易單的呢?為什麽被區塊囊括的交易單就一定是有效的呢?區塊到底有何神秘之處呢?
上圖中任何節點都可以創建區塊並鏈入鏈表中,節點A可以,節點B可以,節點Q也可以,問題是誰有這個能力。如果大家都有這個能力輕易生成區塊,那麽問題就成了到底信任誰的問題,似乎這裏成了一個圈,問題是不可解的,但是由於區塊的巧妙構造,讓這個問題的解法變得十分耐人詢問。
我們看一下區塊的結構:

技術分享圖片

可以看到,到處都是指紋。說起指紋,可以想到的是,它有認證的功能,有保證信息完整性的功能,因為每個消息體的指紋幾乎是唯一的,哪怕消息有微小的變化,其指紋就會發生變化,這意味著只要囊括進區塊的交易單,是不容更改的,因為稍微改一點,指紋就會不一致,就會被查出來,這個想法非常好。現在來看,區塊中的各個指紋是怎麽生成的。
當一個節點要試圖產生一個區塊並鏈入區塊鏈的時候,它要做的是:
1.取出當前區塊鏈尾端的最後一個區塊的指紋,保存為M1;
2.抓取一批尚未被確認的未囊入區塊中的交易單;
3.計算這些交易單的指紋,算出一個總的指紋保存為M2;
4.取出那個固定的指紋,保存為M3;
5.求解那個待填充的數字N,使得(M1,M2,M3,N)的指紋為M2。

是不是很容易呢?這個問題對於文科生來講似乎太簡單不過了,可是對於程序員來講,當看到第5步的時候,就爆炸了。換個說法來給文科生解釋,即給定一個指紋,讓你找出那個人是誰。這似乎也不難啊,警察不天天在幹這個嗎?是的,警察天天幹這個,但他們除了采集你的指紋之外還會登記你的身份證,住址等信息並關聯起來啊。如果全世界人每個人僅僅留下自己的一個指紋然後走人,現在有一個指紋,問它是哪個人的,請問有什麽好的辦法可以快速定位?事實上,沒有好辦法,除非一個一個人去比對,當然,我們排除掉地理位置因素,姑且認為每個人每天都去一趟月球,然後這個指紋是在月球發現的吧。
生成一個區塊,也要解這麽一個難題,除非你有強大的電腦並且有錢交電費做這種無聊的事情,否則還是不要往自己身上攬這種活兒的好啊。如果你真的有興趣做這個工作,那麽你的電腦將不停地下面的工作:
fingerprint(M1,M2,M3,0)等於M3嗎?哦,不等於!
fingerprint(M1,M2,M3,1)等於M3嗎?哦,不等於!
fingerprint(M1,M2,M3,2)等於M3嗎?哦,不等於!
fingerprint(M1,M2,M3,3)等於M3嗎?哦,不等於!
fingerprint(M1,M2,M3,4)等於M3嗎?哦,不等於!
fingerprint(M1,M2,M3,5)等於M3嗎?哦,不等於!
fingerprint(M1,M2,M3,6)等於M3嗎?哦,不等於!
....
fingerprint(M1,M2,M3,852042125687985453212)等於M3嗎?哈哈,等於!!!

這多多少少有些運氣因素在裏面,事實上也是,就像買彩票一樣,你可以將這活兒看成賭博,有時會天降大運,然而實際上更多時候,這就是一個蠻力活兒,所謂的重體力勞動!雖然體力的消耗不再是人力了,而變成CPU了...只要你算出那個數字N,把N填入你構造的區塊N的占位符那個位置,就可以把區塊掛入到當前區塊鏈的尾部並通知所有人你又確認了一組交易單了!!是的,確認又一組交易單成交,這就是做這件事情的意義。但這個意義重大,如果交易無法確認,就難免會出現西裝皮鞋的問題,整個系統就是不可用的,要想讓系統變得可用,就需要這種完全的確認機制。
前面說過,這是一件十分消耗CPU體力又十分無聊的活兒,誰會去幹?!答案是每個人都想幹,因為會有收益!
看看《闖關東》了解一下淘金就會知道,淘金這絕對是一件重體力活,開山,涉水,細篩...然而回報頗豐,因為你挖取的貨幣啊!所以說對於電子貨幣而言,當你完成了一個區塊的生成之後,會得到一筆電子貨幣,你叫比特幣也行,叫什麽都行,反正就是大家都認可,可流通的,上面圖中交易單裏可轉賬使用的貨幣了。可以把整個未確認的交易單看作是礦上,你生成區塊的過程就是在淘金,在挖礦。現在你應該已經知道什麽叫傳說中的挖礦了。
-------------------------

區塊鏈技術如何避免攻擊

有了這個區塊鏈機制,我們再來看一筆錢買了皮鞋又想買西裝的問題:

1.同一個礦工一個批次抓取了皮鞋西裝兩個交易單

假設某個挖礦成功的礦工一把同時抓取了買皮鞋和買西裝的交易單,那麽它在驗證後抓取的那個單子時,姑且認為是皮鞋單子吧,它會看到這筆錢已經買過西裝了,故會把皮鞋交易單作廢:

技術分享圖片

2.在不同的批次被相同的礦工抓取兩個交易單

這個情況更好理解,後一個批次抓取的那個會作廢,理由同上。

3.同一個批次不同的礦工同時解決了指紋難題,一個抓取了皮鞋交易單另一個抓取了西裝交易單

這個問題有點棘手了,在不同的地方看,區塊鏈似乎是不同的,假設兩面礦工分別為A和B,那麽A和B兩個礦工看到的區塊鏈分別是下面的樣子:

技術分享圖片

到底是西裝還是皮鞋??4號區塊後面到底該是a區塊還是b區塊呢?這確實難以抉擇,並且A和B均會通知所有人自己的區塊鏈是對的,在大多數的其它節點,大家會收到這樣子的區塊鏈:

技術分享圖片

懵圈了不是?發生這種情況,不要急著抉擇皮鞋 OR 西裝,而是繼續等待下一個區塊的生成,不管是哪個礦工,下一個區塊生成後它不是鏈接到a,就是鏈接到b,鏈接到哪個,那麽就以哪個為準並把另一個區塊已經囊括的交易單子釋放,假設礦工C生成的區塊c鏈接到了a,那麽區塊b將會廢掉,同時西裝交易單也會被重新釋放到未確認交易單中,這樣當它下次被某個礦工抓取到時,可以直接驗證失敗取消交易並作廢:

技術分享圖片

如果恰好又有兩個礦工c和d同時完成區塊的生成呢?比如c看到的是a,d看到的是b呢?好吧,這種情況確實概率極低,但也不是不可能,發生這種情況就再等唄,直到兩條子鏈長度分出勝負為止!最終的收斂是一定的。

4.買皮鞋西裝的壞人自己改區塊鏈

剛才說過,區塊鏈在發生分叉時以最長的那個子鏈為準,那麽攻擊者是不是可以自己構造長子鏈呢?理論上是可以的,所有計算機能完成的工作,都是step by step,我們來看下構造這個玩意兒的具體步驟,稍微改一下場景,貪心者不再同時買皮鞋和西裝了,而是分兩次,第一次,他先買了皮鞋,同時自己默默構造一條更長的子鏈,待皮鞋老板發貨後將這條子鏈通知出去,把錢退給自己,取消皮鞋老板收到的錢,然後再用同樣的策略買西裝。先看下構造好後的效果:

技術分享圖片

看上圖,這是可行的,我們把區塊放大,看看構造這個長鏈的具體工作:
1.針對X1,解決上面提到的那個fingerprint難題;
2.針對X2,解決上面提到的那個fingerprint難題;
3.針對X3,解決上面提到的那個fingerprint難題;
...

取決於攻擊者想構造多長的鏈,就要解決多少次fingerprint難題,鑒於一次解題的成本,浪費大量的電費,時間,為了一雙皮鞋,值得嗎??攻擊者能做的僅僅是把買東西的錢退給自己,他幾乎不能修改別人的交易單,因為所有的修改操作必須通知所有人,如果改了別人的交易單,別人是不會認可的,畢竟沒人想給攻擊者轉賬匯錢,這意味著,即便僅僅是想不花錢穿皮鞋,攻擊者也必須默默進行上述N次的fingerprint難題求解,因為一旦他把X1通知出去了,皮鞋廠老板知道了也就不會發貨了吧...
也許你會覺得,有這麽麻煩嗎?難道不能僅僅修改攻擊者到皮鞋老板的交易單就成了嗎?將收款人改成自己不就好了嗎?其實不然,我們看下圖:

技術分享圖片

不管怎樣,為了構造子鏈,花費大力氣去計算若幹個fingerprint難題是必不可少的,取決於你要構造的子鏈有多長!
因此,為了一雙皮鞋或者西裝,這樣做是不值得的,如果是為了一座房子,可能值得,但是在你雄厚的計算資本之後,不是還有法律的嗎?
到此為止,我把攻擊者的攻擊場景也描述了,結論就是,攻擊者只能攻擊自己的交易,即便如此也要消耗巨資電力,這裏沒有算法的問題,因為沒有任何算法可以快速解決那個fingerprint難題,如果出現了這樣的算法,那意味著必須出新的難題,總之,就是要讓解題的成本大於攻擊的收益。
-------------------------
我們知道,銀行裏沒有警察,沒有軍隊,只有幾名保安,而且這些保安還真不一定很能打,但是為什麽沒有人搶銀行,因為搶銀行成本太高,是重罪!政府會追查到永遠的,並且會面臨被擊斃,20年以上徒刑,無期徒刑,死刑等令人恐怖的結局,所以沒人搶銀行。如果說少數的那些搶銀行的完全是受制於沖動的話,那麽攻擊區塊鏈就只能純粹靠蠻力成本了,當然這裏面有運氣因素,如果你真的連續5次第一次猜就解開了fingerprint難題,那麽你就可以不花錢穿一雙溫州皮鞋,但想穿第二雙就很難!區塊鏈裏連保安都沒有!哪怕你沖動了又能如何呢?

比特幣區塊鏈總結

以上討論的電子貨幣就是比特幣,這是一種特殊的電子貨幣,和以往的電子貨幣完全不同。區塊鏈是比特幣的底層技術。根據本文最開始緒論,我說比特幣最核心的就是三大構件,P2P網絡,一張交易網,一條區塊鏈,在整個比特幣系統持續運轉的過程中,發生著下面的事情:持續性的挖礦行為促使一個個交易子網持續性的納入到某個區塊,該區塊接入到區塊鏈中。該過程如下圖所示:

技術分享圖片


--------------------------------
其實區塊鏈技術還可以構建更多好玩的東西,比如目前我正在設計的一個日誌系統,另外,在物流,資源調配等領域中也可以使用區塊鏈這種底層技術。上文中,我根本就沒有提到P2P網絡,加解密算法等,這些都是底層具體的實現技術,與思想無關。
在繼續討論我對比特幣區塊鏈的形而上看法前,我想大致列一個有關比特幣的技術提綱,指示比特幣使用的底層技術,但是,仍然不會細講。

1.P2P網絡

我前文一直提到把交易單通知給大家,怎麽通知的呢?就是使用P2P技術。我們比較熟悉的電驢,迅雷下載使用的就是P2P下載,這種下載的風格是,文件切成小的片段,每個主機上只存一份,然後每個主機同時上傳和下載。具體的思路請看我的《為什麽P2P模式下載的人越多速度越快,為什麽P2P傷害機械硬盤》。
在比特幣的場景下,我們知道有兩條鏈,一條是交易鏈,一條是區塊鏈,多條交易鏈形成一張完整的交易網,這張交易網維護著貨幣的屬主信息,而區塊鏈則維護者交易的有效性信息,不管是交易網還是區塊鏈,都必須讓全網都認可才能達成共識,形成信任。因此這張交易網和這條區塊鏈就是通過P2P網絡廣播到全網的每一個節點的,理想情況下,每一個節點都會有這張交易網和這條區塊鏈。但實際實施中,並非如此理想,總是有一些優化,這裏就不再贅述了。

2.非對稱算法與比特幣錢包

非對稱算法的發明絕對是一個創舉,這裏不再贅述這類算法的細節。對於比特幣場景而言,由於每一個人都可以隨意生成一對密鑰,其中公鑰的意義讓其十分適合做錢包的地址,舉個例子來講,公鑰就相當於一個存錢罐,而私鑰則相當於打開存錢罐的那個鑰匙,誰都可以往存錢罐裏放錢,但是只有自己可以把裏面的錢取出來。
比特幣使用的非對稱算法是ECC算法,這個算法相比RSA而言,同樣的加密強度所需要的密鑰長度要短很多,ECC單位安全強度很高,這特別適合內存受限的嵌入式環境。

3.哈希算法,摘要算法

這個要說的是,就在前段時間2月23日,Google公布了一例SHA-1碰撞的實例,如果這個實例發生在比特幣當前的交易網或者區塊鏈中,將會有多少利用的方案呢?

4.比特幣的匿名性

由於在比特幣環境中,對於收錢的人,任何發給自己的錢都可以無條件接收,那麽只需要隨時生成新的公私鑰對,然後公開公鑰作為錢包收錢即可,這樣就使得交易軌跡很難被追蹤了,這也在一定程度上保證了匿名性,就像你使用的是人民幣一樣。但是比特幣也好,人民幣也罷,都不是真正完全匿名的。對於比特幣而言,意思是說,你可以隨時隨地創建自己新的錢包來收錢。

5.如果構建數學難題

計算的結果集必須是一個均勻的分布,只有這樣要想得到特定的答案,就必須要一個數字一個數字的猜。這就意味著沒有投機取巧的方案,除了遍歷,沒有什麽算法可以利用。因此,一個逆哈希的過程將會是一個合適的難題,前提是哈希函數一定要好,哈希結果分布一定要均勻。

6.比特幣的生成

首先有一個初始的創世區塊確認了一筆從天而降的初試交易額,然後由這筆錢開始交易,其余所有的新產生的比特幣均產生於挖礦。類似於物理世界的淘金,比特幣挖礦也有挖完了的時候,按照設計,每過4年挖礦所得就會減半,這樣最終肯定會把比特礦挖空,此時世界上的比特幣總量就是2100萬個!這個和黃金特別相似。金礦在地球上的黃金儲備量是一個定值,所以說黃金的總量一定有一個上限,黃金本身不會通貨膨脹,引發通貨膨脹的是與其直接掛鉤的美鈔,關鍵看1美元怎麽定義,是一美元的含金量為0.888671克黃金呢?還是說一美元的含金量為1.888671克黃金,這對世界的影響絕對不同,這就是不雷頓森林體系的弊端。看看比特幣的情況,雖然比特幣本身的數量是固定的,但是它的基本單位卻可以幾乎無限向下分割的,比如即便總量只有1個比特幣,還是可以用0.0000000000001作為比特幣的基本單位來主導支付,關鍵看名字怎麽叫了。因此我覺得,說比特幣是一種緊縮貨幣是不正確的,該出問題的時候還是會出問題。
實際上,世界上根本就沒有真正正確的金融體系。
現在說一下當比特礦挖完了後,新的比特幣不再產生,礦工們靠什麽激勵繼續去解那些fingerprint難題,很簡單,靠交易手續費。如果還想讓比特幣系統繼續運轉下去,那就在交易的時候付給別人足夠的手續費,這樣別人才會解決fingerprint難題從而幫你將你的交易囊入區塊形成共識。

7.如何確保比特幣交易絕對安全

沒有絕對的安全!囊入越新的區塊的交易越不安全,因為攻擊者需要解決的fingerprint難題越少,到底等待幾個區塊才確認交易完成是合適的呢?並無定論,簡單點說就是交易的金額越大,越值得你多花點時間來等待更多的區塊被掛入區塊鏈以保證安全。

8.區塊鏈技術和PKI有何本質區別

這是溫州老板問的,區塊鏈不就是解決認證,完整性,不可抵賴這種問題的嗎?PKI體系不是已經很成熟了嗎?然而並不是這樣。PKI需要一個信任中心,而區塊鏈完全靠技術解決了本應該需要人介入的問題。我反問,要是根CA裏工作的人都是壞人或者別人策反了怎麽辦呢?它簽發的證書還可以相信嗎?即便不是根CA,隨便一級的CA被策反,它下面的各級CA簽發的證書均將失去信任。然而區塊鏈是一種共識機制,類似議會的投票,除非你動員半數以上的議員一起搞事兒,不然僅靠你自己,就算你把總統綁架了也不行,因為總統說了也不算。以上就是我的回答。此時王姐姐表示區塊鏈網絡中如果大多數是壞人,就能發動所謂的51%攻擊,而這種動員,在中印等國家非常容易,每人每家一臺電腦,組成全國性的集群,這個運算能力怎麽樣?一起幹點什麽不是很容易嗎?上面一聲令下即可。是嗎?
我的回答比較短,我說這樣做沒有意義,等於說玉石俱焚,區塊鏈上的比特幣將不再被信任,體系將會徹底被摧毀,誰也沒收益,相反大家都會有損失。

其實這就是為什麽51%攻擊遲遲不會發生的原因吧...

9.挖礦能力的集中

本初,每個幾點用CPU共享均等的挖礦能力,逐漸,挖礦能力開始拉開差距,從CPU挖礦到GPU,FPGA,再到專業的ASIC芯片,在利益的驅使下,本應該平攤的挖礦能力逐漸集中化。這是否跟社會主義貧富分化是一個道理呢?

10.如何快速驗證交易單的數據完整性

其實,區塊中的比特幣的交易單哈希並不是疊加在一起計算的,而是組織成了一棵樹,叫做Merkle樹,它的結構非常簡單:

技術分享圖片

這麽做的目的在於可以快速進行完整性校驗操作。校驗從根部開始進行,按照二叉樹的時間復雜度O(logn)進行,最終的校驗失敗會把出問題的交易單範圍局限在某個子樹上。在空間利用上,由於每一個節點實際上並不需要傳輸整個交易網和整個區塊鏈,這種只校驗HASH的方式也會減少數據的傳輸量,特別適合廣播頻繁的比特幣P2P網絡。

我對比特幣的態度

註意,我對比特幣的態度並不意味著我對區塊鏈的態度與之相同。
我在2012年底的時候首次聽說了比特幣,說來慚愧,當時所在的公司主導業務是PKI以及加解密,而比特幣的技術細節裏用到了那麽多的此類技術,我竟然到2012年底才首次聽說...
不過到了2013年,當同事們都在熱議比特幣的時候,我對它的反感也就油然而生了,因為我是一個超級不喜歡炒作的人,只要當前人們在熱炒什麽,我就討厭什麽,等到此概念的第二波風潮到來的時候,我再試著觀察一下,再決定自己到底是討厭,還是喜歡。
現在,比特幣已經運行了7年有余,我試著改變一下4年前對它的厭惡,我試著喜歡它...說實話,這次我真的挺喜歡比特幣的,不然我也不會寫這篇文章。其實早在2013年的時候,我就知道了比特幣區塊鏈的原理,但那時我並不想去寫一個我及其厭惡的東西,所以直到本文之前,我幾乎沒有提到過比特幣的概念。同樣重量的另外兩個熱炒的概念是AI和SDN,AI就因為去年那場圍棋,掀起了一股風潮,就連一向思維獨立的羅振宇在跨年演講中也不得不折服於AI那巨大的煽動力,說得好像《機械公敵》裏場景馬上就到來了似的...對於SDN,我也是持消極的態度,雖然說理念上很不錯,但真的能撼動思科,華為,HP這些巨頭廠商的壟斷地位嗎?是的,到時候你是用到了控制器,用到了專業的傻瓜式轉發交換機,然而你會發現,這些設備上貼的還是那兩個中指(Cisco)或者那朵老菊花(華為)...
比特幣的創舉在哪兒?在去中心化!然而中心化真的有那麽糟糕嗎?我個人認為,比特幣的去中心理想雖然好,但很難實現。
其實,對於人類文明而言,中心化是一個收斂的趨勢,你看看那些比特幣礦池,不都是違背了去中心化的初衷了嗎?雖然按照博弈理論,礦池的算力總是會無限趨近但不會超過50%,但即便達到全網算力的30%,也就有了足夠的話語權和控制權,事實上,人們普遍需要一個核心。去中心化就跟仇富心理一樣,表示的並不是一種理想,更多的是一種抗爭。這不,在比特幣區塊鏈去中心化的同時,那一邊的SDN不是正在搞中心化控制器嗎?拼命搞北向,南向接口,東西向接口卻發展乏力,這正是在走向中心化。懵圈兒了不是?
在任何領域,都不存在去中心化的例子,人類歷史10萬年,經歷了一個又一個從一個中心到另一個中心的平移或者轉換,但從來都沒有去中心。
我來用世界歷史和地緣政治來說一個觀點,以下的文字來自於我對日本留學讀博士的弟弟的一則朋友圈評論。
歐洲中心論和華夷秩序都是某種中心主義,其背後都有經濟基礎,歐洲中心論的歐洲是交換中心,事實上歐洲是在大航海之後搶了伊斯蘭交換中心的地位,而華夷秩序的經濟基礎則是在於中國作為分配中心在起作用。現在來看伊斯蘭問題,其實他們也是希望做交換中心,去跟西方搶奪曾經本屬於他們的東西。中東地區幾千年來都是南亞,中西亞,北非,歐洲的交換中心,在幾千年來裏,地理中心往往就是交換中心然而美洲納入交換體系後,地理上的中心必然西移到歐洲,這個區域東到新疆,西到夏威夷,如果你仔細觀察一下ISIS自己YY的地圖,其實很容易看出,它們想要的地方就是從新疆到東歐以及北非,南亞,中亞,西亞這片歷史上的交換網絡。東亞東南亞由於地理隔絕形成了另一種秩序,就是華夷秩序,這個區域相對小,內部彼此不是那麽易接近,民族相對單一,且氣候類型少,不易形成交換網絡....然而即便沒有交換中心,也並不意味著這些區域就是老死不相往來或者絕對平等共產的,這裏會形成另一種中心,即分配中心,這個在網絡上叫做星形拓撲,古羅馬王政和共和國交替的那個年代,對於意大利半島上軍事同盟的改組就是將平等共產的星環狀拓撲改成了純星形拓撲,羅馬共和國曾經也是一個意大利半島的分配中心。【後面的與本文無關,但還是引入:不管是哪種中心,如今當這個具備分配中心的東亞東南亞子網納入整個交換網絡的時候,其效率上的優勢便逐步體現,是為文化熏陶,或者叫做癌細胞擴散也可以。照這麽說,中國搞不好真能崛起,雖然我一點都不希望事情會這樣】
雖然我說的並不一定對,但至少也算能自圓其說了,我的觀點是不管以那種方式去了中心,最終都還是會收斂出一個新的中心。
比特幣區塊鏈的另一個問題在於資源的浪費,不僅僅是PoW這種挖礦資源,還有更多的存儲資源,帶寬資源,目前一個區塊要10分鐘產生,且隨著交易量的越來越多,對效率的要求越來越高,P2P網絡的廣播開銷,存儲開銷,挖礦開銷將會快速增長,最終的效果就是二氧化碳的排放,有報道說,一比特幣等於1.6噸的二氧化碳,這麽做的目的僅僅是為了一種所謂的去中心理想,而這種理想如我前文所述還很難實現,這麽做到底值得嗎?其實,我倒是覺得各種的政府和央行有點多慮了,打壓一個新生事物是不對的,如果能利用其自身的缺點任其衰微,至少也能在道德上站立穩當吧。如果這麽說的話,中本聰大可大搖大擺走到前臺,像喬布斯那樣在發布會上出盡風頭,不必擔心擾亂金融秩序而被逮捕或者招來殺身之禍了。
不管怎樣,比特幣以及其底層的區塊鏈技術,在技術思想層面上絕對是一種創舉,但並不意味著一定就可以短時間內取代各國法定貨幣成為通貨,利用相同的思想,大家倒不如想象一下區塊鏈技術還能用在什麽其它的方向。
不過在否定比特幣對傳統金融系統的顛覆之前,需要給它點時間,就像飛機剛剛上天時曾摔死過制造者一樣,任何新的東西剛出來的時候,總是有能讓人詬病的星星點點,但是事情總是會過去的,現在坐飛機基本成了身份的象征,再也不用怕摔死了。近些天,無人駕駛汽車也是接連出事故,但這並不意味著無人駕駛技術就要被否定,它也同樣處在一個剛剛起步的位置,我想等用不了多久,當你看到竟然有人在開車時,你也會不禁驚訝,竟然還要有人開這輛車...因為早晚你也會習慣曾經新鮮被人詬病最終卻取得勝利的事物的。想想我們的父母對智能手機的態度...

後記

已經過午夜了,本文經過將近四個小時奮筆疾書連同畫圖,終於寫完了!其中肯定有語言不通順的地方和邏輯上的錯亂,也難免的,畢竟沒有打草稿和提綱,一氣呵成的東西,瑕疵肯定是有的,但至少是”我純手工制作“的東西吧。

在寫這篇文章之前,我在糾結是寫成一篇大眾科普呢還是寫成一篇技術科普。最終我決定寫成大眾科普,所以我通篇幾乎沒有列那些技術術語,但是,對於作文者而言,這種文章更是難寫。寫到ECC,RSA那一節的時候,我長籲一口氣,有種釋放的感覺,憋死我了,總算可以寫點自己懂的了,但意識到本文的初衷,馬上就打住了,不能扯技術,不能扯細節。還好,一直到本文結束,我恪守了文章開始時的承諾。

...
夜難眠,也難免。

問題解釋

1.在比特幣網絡裏到底什麽是錢?

首先看現實中什麽是錢。現實中拿在你手上的真鈔才是錢,至於股票,存在銀行的錢,家裏的黃金,你肚裏的詩書,知識產權,房屋...這些都不是錢,這些只是有價值的可兌換成錢的東西,可以用來投資,但不可以直接流通(如果當事雙方你情我願,白送都有可能,比如送給小三一套房產之類的),即便是股票,交易的時候也要看當日當時的價格,以可以流通的貨幣作計價,而對於POS刷卡而言,它實際上扣除的也是你的貨幣計價,相當於替你完成了取真鈔給你,你把真鈔給對方,對方把真鈔存銀行這個過程。所以說,本文中所謂的錢就是可以馬上流通的真鈔票,就是紙幣或者硬幣。
那麽看比特幣網絡中對應的錢是什麽。這個還要從比特幣交易網中去尋找。錢是什麽呢?錢就是交易網中不被任何交易單引用的交易單上的”所得金額“:

技術分享圖片


至於說那些已經被引用的交易單,都是曾經花錢的記錄,而不是真錢:

技術分享圖片


花錢的過程就是交易單中”所得金額“被引用的過程。
問題解決了。

2.怎麽確認錢的歸屬?

每一張交易單上都會卡上兩個戳,一個是收錢者的公鑰,另一個是付錢者的簽名,表明這筆錢是誰付的,兩個戳是糾纏在一起的,就像郵戳一樣,會卡在郵票和信紙之間。比特幣的公鑰代表了錢包,而私鑰指示誰付的錢以及誰可以花這筆新收到的錢:

技術分享圖片

3.修改一張交易單很難嗎?

不難,很簡單。但是修改了之後的交易單不會被確認。為什麽呢?因為確認交易單的過程是一個”挖礦“的過程,正文裏講過這有多麽嚴格。

4.既然每一筆交易都完整記錄,是不是反洗錢很容易呢?

是的!雖然記錄每一筆交易只是在虛擬的數字世界裏達成共識的一種手段,但是無意中為追查洗錢線索提供了便利,在物理世界,如果你拿用真鈔進行洗錢犯罪,是很難被追蹤的,但是大額的真鈔又沒有,只能通過銀行,所以...
但是要知道,比特幣世界裏,交易是準匿名的,公鑰代表你的錢包,也即是存錢罐,公私鑰對可以離線生成密鑰對,很容易就重新搞一個存錢罐,這種特性讓追蹤變得困難。但是由於交易單是完備的,除非這些錢永遠不花出去(這就失去了錢的意義),否則通過大數據分析,還是可以追蹤到蛛絲馬跡的。

再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!https://blog.csdn.net/jiangjunshow

比特幣與區塊鏈的大眾科普文