誰能解釋下區塊鏈?皮卡丘:我可以
袁辉腾
2018-12-14 11:13
本文约3225字,阅读全文需要约13分钟
去吧,皮卡丘!

不久前,改編自任天堂同名遊戲電影《精靈寶可夢:大偵探皮卡丘》發布電影預告。我們才發覺,原來精靈寶可夢發行至今已經21 年,一句“去吧,皮卡丘”成了多少人的口頭禪。

在你對幣圈各種加密貨幣如數家珍之前,妙蛙種子、小火龍和皮卡丘.....這些角色早已成為你的一抹童年記憶。

想像一下,我們又回到學生時代。

你與三五夥伴,簇擁坐在學校操場,手中握著一疊精靈寶可夢卡牌,分享彼此的最新珍藏。你看到小伙伴手裡一張你一直想要的可達鴨,而你手裡也恰好有一張小伙伴垂涎良久的傑尼龜。最後,在眾人的羨慕目光下,你們決定交換這兩張卡。顯然,這次交換並不棘手。你和你的小伙伴都滿心歡喜——彼此都得到了自己心儀的卡牌。

“你已經是個大孩子了,該學會自己做決定了。”媽媽總會這麼告訴你。

10 歲的你,並不需要叫來班主任來監督這次卡牌交換,也不用保證這次交換是不是正確。圍坐在一起的小伙伴已經知道那張可達鴨卡牌已經有了新主人,這是用你手裡的傑尼龜卡牌換來的。你和小伙伴意猶未盡,但已經到了“媽媽叫你回家吃飯”的時候。你可能會因此開心好幾天,而這恰恰就是簡單的童年時代。

但現在,我們換個場景——假如交換的是數字版的精靈寶可夢會是怎樣的場景?

我手裡有這套卡牌裡的一張稀有卡,我想跟你進行一筆交易。

“人總是會變的。”你的朋友總會這麼說。

我可是個小機靈鬼,在把這張卡牌轉移給你之前,你並不能保證我是否會動手腳。我可能已經提前在電腦上做了副本,並跟每個人吆喝“這是獨一份,買到就是賺到。”

對於你以及整個精靈寶可夢社區來說,這都是一個糟心的結果。一張稀有卡如今因為“爛大街”而變得毫無價值。

而在數字世界,我們將這個問題稱之為雙重支付圖片描述圖片描述

任天堂の部分遊戲角色

這個時候,你可能會需要一位“班主任”。

任天堂任天堂必須獨攬大權,掌管著這個重要賬本。利用這個賬本,任天堂可以監督每一張數字版精靈寶可夢的交易,確保沒有人通過複製來“發家致富”——每個人都是正派角色。

看似完美的方案似乎也存在漏洞。如今我們之間的交易出現了第三者。不管你願意與否,我們都必須經過這個中間人來完成交易。同時,我們必須完全信任第三方,相信任天堂不會“偷姦耍滑”,不會隨意篡改賬本。

問題隨之而來,假如一個任天堂員工的弟弟也是一個精靈粉,你又如何能確定我要給你的那張稀有卡牌,並沒有被任天堂的員工秘密複製給他的弟弟呢?

確實,我們也沒法百分百保證賬本不會被改動。

現在,你可能就是可達鴨本鴨了。

不妨繼續試著開開腦洞,如果賬本並不是保存在任天堂總部的一台電腦上,而是為每一個精靈寶可夢交易者提供一份賬本,會怎樣呢?

全球有數億的精靈寶可夢的遊戲粉、番粉,因此會存在數億份賬本副本。當我把這張稀有卡寄給你的時候,每個人都會相應收到轉移通知。

賬本會顯示出這張稀有卡有且僅有一張,假如我是個調皮鬼,秘密複製了幾張,並保存在我的賬戶裡。但我的賬本副本就會與其他人的賬本不一致,這幾張復制卡牌也毫無用處。

你可能會出現疑問,整個網絡是怎麼驗證出彼此的卡牌並不是複制卡呢?

可達鴨眉頭一皺,發現事情並不簡單。

假設有1000台計算機參與精靈寶可夢構成交易網絡,我們稱之為節點。所有的節點都有一個共享賬本的副本,彼此之間可以互相通信。這些節點的目的則是獨立驗證每一張精靈寶可夢的交易信息。

這些節點必須對賬本中對網絡發生的卡牌交易的說明達成一致。假如我們之間進行交易,該交易會被放入一個臨時未經確認的交易池中,等待確認。之後,這些節點會競爭在給定時間內驗證未確認的交易。

圖片描述圖片描述

插圖:加密初學者

接下來,礦工參與競爭成為第一個驗證新區塊的人。算力算力解開加密難題來實現這一目標。網絡會要求礦工進行大量工作來驗證每一個區塊,以防止其動歪腦筋。

一旦礦工找到驗證一個區塊的加密難題的解決方案,其便會對該區塊進行“打卡留念”,即數字簽名,用來證明這個區塊已經得到驗證,即我與你的卡牌交易有效。同時,礦工把這條信息通知到網絡中的其他節點。然後,礦工將已驗證的區塊分發給其他節點,並獲得精靈寶可夢卡牌獎勵。隨著新交易的產生,其他節點也會及時更新其賬本。

但是,節點之間並不能實現真正彼此信任。因此,每當產生一個新區塊時,每個節點都會根據交易記錄檢查區塊中的每一筆交易信息,查看是否存在雙重支付問題。這就是網絡節點達成共識的方式。

但想像一下,我送你一張卡牌,想跟你換現實世界中的東西,比如你今天午餐的漢堡。你覺得這筆交易交易不虧,可我也會有自己的小算盤。我拿了你的漢堡,然後立即重新嘗試再發送一遍我給你的那張卡牌,會發生什麼?

假設卡牌A是第一次發給你的,卡牌B是第二次,這就已經構成非法雙重支付。節點並不偏袒任何一方,因為其並不知道兩者哪一個是正確的,所以它如何決定呢? A、B 都將進入等待驗證的交易池中,並且通常會按照時間順序放入區塊中,但有時也不會。

由於區塊鏈按照時間順序進行依次驗證,即鏈中越靠後的交易,則越安全。如果B率先得到驗證,那麼賬本就會認定B為有效交易,而A則為雙重支付。

如何避免賠了“漢堡”又折“卡”?你最好的選擇是等待。網絡中不太可能接受這兩次交易支出,因此總會有一次支付被拒絕。這只是時間問題,保持歲月靜好,你就會看到下一個區塊中到底包含哪一次支付。

倘若在等了至少10 分鐘甚至更久後,我再想起耍耍小聰明。這時網絡節點已經基本確認A 為有效交易,再發送B已經毫無意義。 “一手交錢,一手交貨。”你入手一張新卡牌,而我也只能接受你的午餐。

假如我不想做個好人,並沒有按套路出牌,會怎麼樣呢?能不能通過重新查看賬本,從支付記錄中將第一次發送的支付信息刪掉。這樣我就可以再次交易那張卡牌,並得到更多的免費午餐呢?

你肯定以為自己聰明又可愛,像極了會放電的皮卡丘。然而,並不是這樣。

該交易存儲在一個信息塊中,同時這些信息塊在時間上是線性鏈接的。因此,存儲我和你交易記錄的信息塊可能會隱藏在一串信息塊後面。假如從我的第一筆交易後又增加了9 個新區塊,那我依然可以找到記錄此次交易信息的區塊,並把它刪除。

動作看似行雲流水,天衣無縫? No,有瑕疵。

還記得每一個區塊上的數字簽名嗎?它是根據區塊中的信息生成的。因此,你以為一次“天知地知”的數據刪除,也會自動更改簽名。

更糟糕的是,記錄你我交易信息的區塊之後的每個區塊的數字簽名也是由其之前的簽名決定。“牽一發而動全身”。若之前的簽名被修改,其身後的所有區塊的簽名也會相應更改。

為了多吃幾口免費的午飯,我不得不要修改第十個區塊的簽名,此後的9 個更新區塊的簽名也必須修改。

糟糕的事情不止於此。

上述的這一波操作也只能在我的賬本副本上進行。你我之間的交易已經被其他節點知曉,可刪除交易並沒有。其他賬本都很樂意對已經完成的交易達成一致,因此,我必須修改在網絡中超過半數的節點賬本才能獲得共識。

但就更改多個區塊中的數字簽名,電腦就已經有些“力不從心”,同時需要耗費驚人的電量——這個時候,我可能會更心疼這個月的電費賬單。

這一點對我來說過於得不償失,我選擇放棄。

就這樣,我們創建了一個開放、去中心化、不可逆、防篡改的數字網絡,用於交易精靈寶可夢卡牌及其他資產。而這就是比特幣和區塊鏈技術工作原理的簡化版本。顯而易見,這項技術令比特幣與眾不同。

或許有些角色的名字一時難以想起,但這些熟悉的小精靈,在陪你慢慢長大後,如今又把晦澀的區塊鏈技術變得簡單有趣。區塊鏈讓我們看到一絲早期互聯網的影子,就像我們依然能夠從這群精靈那裡重逢曾經的童年。

袁辉腾
作者文库