關於區塊鏈,程式設計師需要了解些什麼?

文章推薦指數: 80 %
投票人數:10人

如果說比特幣是對傳統貨幣的一種顛覆,那麼比特幣的基礎技術——區塊鏈則是對傳統編程範式的一種顛覆。

區塊鏈技術被看作是一次Paradigm Shift。

也許很多人對 「顛覆」這種說法不以為然,因為現在這個詞已經被用濫了(如今哪個好一點兒的詞沒有被用濫呢?)。

但是明眼人在匆忙做出」這又是一個噱頭」這樣的結論之前會謹慎的去了解一下背後的東西。

這篇文章的目的就是為一般程式設計師介紹區塊鏈的一些獨特技術,以及這些技術如何運用到一般程式設計師的項目或者產品的開發過程中。

即使你不想進入全新的區塊鏈應用開發大潮之中,你也會發現區塊鏈相關的底層技術對平日的應用開發有不少啟發和借鑑作用。

一個新技術的誕生是有它順應時代的合理性的(黑格爾語」存在就是合理的「)。

作為程式設計師我們應該去了解它的合理性所在之處,取而用之。

我們不一定非要用新技術去顛覆一個老應用,但可以用新技術去重塑一個老應用。

本篇主要討論區塊鏈在三個方面的獨特性:去中心和去中介,隱私保護,時間戳。

去中心和去中介

1994年凱文•凱利(國內稱KK)出版了一本預言式的巨著《失控》,書中充滿了關於智慧生命及其社會進化機制的真知灼見。

書中提到的很多概念,比如雲計算、物聯網、網絡社區等等,在二十多年後的今天已經成為普遍的事實。

「去中心化」是凱文•凱利在書中提出的「九律」中的一條。

一個去中心化的系統,沒有一個中央的、至上而下的控制主體,而完全是由大量的、相互聯結的、看似無組織的小個體構成,這些個體有一定的獨立性,可以相互作用,他們自發地形成一個整體以後,由量變引起質變,結果整體的能力、整體的智慧、整體的適應性和靈活性,都大大超過了個體的簡單相加。

這樣的去中心化系統生命力極強,遭到破壞可以自我修復,因而很難被完全摧毀。

網際網路就是一個典型去中心化的例子,極強的適應性和抗破壞性是網際網路的根本。

不過如今的網際網路卻有了中心化的趨勢。

中心化的後果見仁見智,對崇尚多種選擇的人來說,中心化代表著選擇自由的喪失,服務質量的下降,活力的倒退和創新的萎縮。

微博做為新一代網際網路媒體的翹楚,它的興起、沒落以及再次復興,從內容的產生和傳播來說,就是一個從一開始的去中心化,到由大V們控制的中心化,再到去中心化的歷程。

總之,只有那些賦予其中每個個體充分發展的自由的系統,那些抗拒中心化趨勢的系統,才是生機勃勃、有創新力、能夠不斷進化的系統。

站在2016-2017年之交,智能機器時代似乎離我們不遠了。

晶片技術、存儲技術、網絡技術、移動技術、物聯網技術,這些都極大的增強了各種網絡終端( edge)的能力,無論這些終端是人、手機、汽車、機器人,或是其他設備。

以前由於存儲、網絡或者計算能力等限制而選擇中心化的應用程式設計,現在的程式設計師則有更大的自由去選擇一種去中心化的設計。

去中心化的系統更加靈活,更具適應性,更有活力。

另一方面,現實社會中的各種交易活動,由於交易雙方缺乏信任、信息不對稱、搜尋成本、匹配效率、交易費用等因素,需要有交易雙方共同信任的中介參與。

比如銀行間的跨境支付,中間需要通過SWIFT網絡和代理銀行,而不能直接進行點對點交易。

中介的產生源自於降低交易成本的目的,但是隨著新技術的出現和普及,交易雙方直接交易成為可能,而且交易成本更低。

在這樣的情況下中介變得多餘了,交易雙方通過去中介化來降低交易成本。

去中心和去中介有多種不同層次,可以體現在業務模式方面、業務數據的產生和傳播方面、應用系統的架構方面、應用系統的開發、運行、維護、升級方面等等。

比特幣和區塊鏈是一種比較徹底的去中心和去中介的應用,它包含以下幾種去中心和去中介技術:

●點對點網絡( P2P network)

點對點網絡並不是什麼新概念,網上的很多文件共享服務和視頻直播服務就是用P2P網絡協議實現的。

P2P網絡是一個對等網絡,網絡中每個節點的地位相當,沒有任何節點處於中央控制的地位,也沒有任何節點扮演交易中介的角色;每個節點既是server,又是client;節點可以選擇隨時加入,隨時退出;節點可以選擇運行所有的功能( full node),也可以選擇運行部分的功能;節點越多,整個系統的運算能力越強,數據安全性越高,抗破壞能力越強。

●去中心化資料庫,這就是區塊鏈,例如 Bitcoin的分布式總帳。

●去中心化應用(Decentralized App, 簡稱 DApp),例如在Ethereum上運行的智能合約應用。

●共識算法

無中心、無中介、無需相互信任的對等網絡的節點間需要協調一種共識算法,以便共同維護一個統一的分布式資料庫,以及協同工作以保障整個系統的安全性和適應性。

有多種共識算法,包括: PoW – Proof of Work 工作量證明、 PoS – Proof of Stake 權益證明、 DPoS – Delegated Proofof Stake授權權益證明、 PBFT - Practical ByzantineFault Tolerance實用拜占庭容錯、 PoET - Proof of Elapsed Time流逝時間量證明等等。

作為一個程式設計師或者架構師,這些思路和技術有什麼幫助呢?你的應用需要去中心或者去中介嗎?你的下一個應用需要採用去中心化的架構嗎?設計去中心化的架構需要作哪些改變?需要哪些基礎設施?

在時下這股區塊鏈的淘金熱里,已經有很多創業公司準備顛覆傳統的中心化應用。

幾乎所有的應用,都開始有相應的基於區塊鏈技術的去中心化版本。

如果你認為目前沒有必要或者不可能去中心化,未雨綢繆總是不會錯的。

隱私保護

個人隱私信息泄露現在在中國是一個非常嚴重的現象。

盜取、販賣個人信息已經有完整的黑市產業鏈,部分網際網路徵信公司和數據公司,從黑市上購買數據,甚至僱傭黑客去盜取數據。

網際網路用戶普遍意識到個人隱私信息的重要,對隱私保護的要求會更高。

程式設計師有責任從技術上加強個人隱私的保護。

在傳統的應用架構設計中,隱私的保護或者安全性設計的優先級並不是很高,現在這種情況必須有所改變,架構師需要提升隱私保護設計的優先級。

區塊鏈應用領域採用了很多密碼學的技術,例如哈希算法、加密算法、公鑰密碼學、默克爾樹、和零身份證明。

Bitcoin在保護用戶身份方面,它使用哈希過的公鑰作為個人帳號,這樣在交易時隱藏了個人信息。

另外,個人帳號可以設計成一次性的,每次交易都使用新的帳號,這樣就很難通過追蹤某個帳號的交易來推測用戶身份。

Bitcoin的總帳是公開的,上面每筆交易記錄包含付費帳號、收費帳號以及轉帳金額。

如果覺得這樣的隱私保護還不夠的話,另一個數字貨幣Zcash在Bitcoin之上增加了一些協議,將付費帳號、收費帳號以及轉帳金額都隱藏了起來,採用的方法仍然是加密、哈希、默克爾樹和零知識證明。

儘管比特幣出自於一群無政府主義者之手,但他們秉承的一些諸如保護個人隱私的信念,在這個信息泛濫的網際網路時代還是非常可取的。

對於你的應用,你是否收集了超越應用需要的個人信息?(保護隱私的最好辦法就是不收集它們)在處理交易時,是否可以傳遞儘可能少的個人身份信息?或者使用一次性帳號?在日誌中是否可以記錄儘可能少的個人身份信息?或者完全不需記錄?緩存資料庫中的個人信息是否安全?消息傳遞時不僅採用Session Key加密,是否還可以採用Message Key?

如今,哈希算法、公鑰加密,默克爾樹,這些加密技術唾手可得。

程式設計師應該養成新的習慣,在應用設計中採用各種加密技術保護個人隱私信息,包括個人帳戶信息,交易信息,瀏覽信息,日誌信息等。

時間戳

傳統關係型資料庫在設計表時一般會有一個或多個時間戳(timestamp)欄位,用來標記一行記錄添加或修改時的時間。

基本上,這些時間戳是給應用內部使用的。

當數據被共享給其他應用時,這些時間戳並沒有多大意義,因為時間戳可以偽造。

在數據黑市上,一個數據掮客可以將一份銀行VIP客戶數據進行注水,摻入一半的假數據。

一家保險公司為了攪亂市場上競爭對手的視線,故意污染數據,將高凈值用戶放入騙保用戶黑名單,將騙保用戶放入高凈值用戶名單,然後讓污染後的數據故意泄露出去。

如果每條數據都帶有一個真實可信的時間戳(這條數據產生的真實時間點),這樣的造假行為就比較難奏效,因為假數據的時間戳一般都是最近的。

以前我們很少關心數據的時間戳,很少去了解這個時間戳對數據的意義,一個原因也許是我們不知道如何用技術去實現這樣的時間戳。

如果技術上實現這樣一個時間戳是完全可行的,那麼這個時間戳對我們來說就有了全新的意義。

首先,我們有了真正可以信任的歷史數據。

第二,這些數據因為可信變得更有價值,可以在應用之外被其他應用或者分析工具使用。

第三,我們可以基於這些可信的歷史記錄生成信用。

最後,我們真正進入一個信用社會。

想像一下,如果我們想在未來某天證明我們的數據是在今天產生的,我們可以在今天對今天的所有數據進行某種形式的哈希(比如默克爾樹),最終得到一個哈希值,然後在第二天的《參考消息》上登一個廣告,把哈希值發布出去。

明天的《參考消息》就成了我們的時間戳。

如果明天我們想做同樣的事,我們可以如法炮製,另外有一個關鍵點,那就是要記得把今天的哈希值也給哈希進去。

這樣每天的哈希值就包含了以前所有數據的哈希信息。

區塊鏈在P2P網絡上通過節點間的共識算法實現了一個分布式的時間戳服務。

區塊鏈是在時間上有序的、由記錄塊(區塊)組成的一根鏈條。

一個區塊包含兩個部分:區塊頭( block header)和記錄部分。

區塊中的所有記錄通過默克爾樹( Merkle tree)組織起來,默克爾樹根( root)的哈希值做為本區塊里所有記錄的數字指紋被放入區塊頭。

區塊頭還包含以下欄位:前一個區塊頭的哈希值(這是前一個區塊的數字指紋,也可以看做是指向前一個區塊的哈希指針),本區塊的時間戳,高度( hight,即從第一個區塊開始數本區塊是第幾個塊),以及一些其他信息。

系統的共識算法保證了每過固定的一段時間(Bitcoin是大約10分鐘),參與整個系統記帳的節點會達成共識在區塊鏈上添加下一個新的區塊。

時間戳的這種設計,使得更改一條記錄的困難程度按時間的指數倍增加,越老的記錄越難更改。

這是因為,如果改動某個區塊里的一條記錄,意味著該區塊原來的默克爾樹根失效了,需要改動區塊頭,該區塊的數字指紋隨之失效。

又由於下一個區塊的區塊頭包含這個哈希指針,這就意味著下一個區塊也需要改動。

如此一直下去,直到最新的那個區塊。

可見要想改動一個區塊,必須同時改動該區塊後面的所有區塊。

因為將一個區塊放入區塊鏈中需要消耗非常多的資源(資源種類依共識算法的不同而不同,可以是計算力,流逝的時間,擁有的權益等等),隨著後面添加的區塊越來越多,要想改動某個區塊幾乎是不可能的。

對一個普通的應用來說,如何實現這樣一個時間戳服務呢?我們需要自己創建一個區塊鏈嗎?其實沒有必要, Bitcoin就是一個很好的時間戳服務,我們可以把哈希值寫到Bitcoin的區塊鏈中去。

這是一種存在證明( Proof of Existence)。

Factom也提供類似的服務,它收集所有的哈希,每隔10分鐘生成一個哈希值,寫到Bitcoin的區塊鏈中。

哪些數據需要有時間戳?必須是不能變更的數據,特別適合存檔文件。

需要現在就考慮實施時間戳嗎?這個跟你的數據戰略相關。

在大數據時代,擁有高質量的數據就是擁有了價值。

時間戳可以一定程度上保證數據的可信度,至少這些數據是經過「時間考驗」的。

作者簡介:曹嚴明。

架構師,現就職於SAP公司諮詢服務部,專注於保險業核心系統、電子商務、企業移動應用等解 決方案。

曾就職於微軟和HCL公司,參與過SQL Server, SharePoint, Visual Studio等產品的研發。


請為這篇文章評分?


相關文章