天天看點

解構區塊鍊:這是對區塊鍊及其技術應用最詳盡的解說 | 硬創公開課

随着某些領域的應用陸續浮出,區塊鍊技術的發展又有了新的進展。但本行業的許多細節并未為社群外的人有較多的了解,包括開發進展和應用情況。這一期公開課,雷鋒網邀請到衆安保險旗下衆安科技cto李雪峰來講解!

李雪峰,衆安科技cto,曾就職于摩根大通、亞馬遜、東南融通、阿裡巴巴,英屬哥倫比亞大學計算機軟體、金融學和工商管理碩士。

解構區塊鍊:這是對區塊鍊及其技術應用最詳盡的解說 | 硬創公開課

以下是公開課實錄:

雷鋒網:衆安科技将針對金融這一大領域進行技術輸出,那麼整個金融領域的區塊鍊應用場景來說,主要是應用了區塊鍊的哪些技術?

李雪峰:區塊鍊的技術特點我認為是:資料加密不洩露,分布式記錄不丢失,網絡廣播防篡改。這些特點可以了解為這種技術的一種标準。現在這些标準已經有了很多開源的實作,比如大家熟知的比特币、以太坊和hyperledger。雖然現在還沒有很通用的标準,但這些産品其實原則是上萬變不離其宗,基本遵照以上标準或者技術特點來實作。隻是,這些産品又各自表現出差異性,因為他們主要解決的問題不同,比如比特币要解決的是數字貨币的轉移,以太坊更側重于提出一種新的賬戶模型,通過智能合約推進更多應用開發。

衆安現在也有自己的鍊,但為什麼我們還要重複去造輪子,去做自己的實作呢?因為衆安的很多業務場景都是金融場景,其對技術有非常嚴格的要求,比如交易的頻率,資料存儲和通路的要求,還要接入證監會的審查,以及聯盟之間互聯互信互通的需求,而這些都不是目前已有的一種鍊,或者是幾種鍊組合就能完成得了的。

現在擺在我們面前的現實問題是:區塊鍊的技術特點和我們需要滿足的業務場景無法一一映射,我們沒有辦法把業務場景照搬照套到區塊鍊上去實作,就像軟體科學中的投影視圖關系,大家也許都畫過uml、模型圖等,我們會發現,業務視圖和部署視圖等不同視圖之間永遠無法一一對應。

下面根據衆安自己的經驗,我們結合場景來講一下區塊鍊的技術:

加密

說到區塊鍊時,大家首先想到的是加密,其常見的算法包括橢圓曲線加密,公私鑰對,雜湊演算法,以及最近提到的零知識證明。那麼加密的使用場景,有資料就需要隐私,有隐私就需要加密,是以所有的資料存儲和查詢中我們都需要加密手段來保護資料的隐私和安全。

那麼資料通過該加密來保護後,接下來要做的是授權。資料被調用時首先要考慮的是資料确權的強制性。區塊鍊是一個分布式賬本,所有資料都可以共享,共享的前提是提供資料的人願意給别人看,比如給誰看、看多長時間,看多少次,這個過程是進階的算法問題。那麼在衆安的實踐場景中,我們會在使用者的敏感資料使用中通過智能合約和一些授權算法來進行資料的授權請求。

分布式記錄不丢失

關于分布式賬本和資料不丢失的問題,這是多中心帶來的利好。傳統網際網路架構上我們一般做跨機房的災備,或者異地多活機制。但區塊鍊的網絡天生就有這樣的特點,因為節點之間是通過p2p連接配接的,而且每個節點都有完整的資料,這就導緻其天生就符合了異地多活的特性,哪怕部分節點挂了也不影響整個網絡可用性。除非所有的節點都失常了才可能影響整個網絡,但這幾乎是不可能的事情,因為所有節點是布置在世界各地的。

在現實生活中,保險、銀行等各個金融機構的系統都是不一樣的,哪怕同一行業的不同機構間都很難保證資料的标準化,日常金融活動互動中都需要第三方标準組織來完成,這個組織有可能是一個協會,有可能是一個企業。

比如對賬問題,對于多個參與方來說,每一方都有自己的賬本,對賬時a方與b方交換賬本,同時把對方的賬本來與自己本地的賬本來校對,如果發現問題需要人工去處理,這會涉及極高的成本。那麼通過區塊鍊對賬時,首先就可以消除多個賬本的情況,所有對賬參與方擁有共同的賬本,所有寫入賬本的資料都是符合雙方或多方的預期,也就是在賬本寫入時就實時備帳,減少成本的浪費和人工的支出。

全網廣播防篡改

接着講一下資料防篡改的特性。這個技術特點最适用的場景是資料公信力的場景。

基于共識機制的确認,區塊鍊上的資料基本不具有被篡改的可能性。但這有個誤區——它不是完全不可篡改,而是理論上的。之前有人統計過,如果你準備4億美金的話,你也可以把比特币上的交易都改一遍。信用是金融的核心,信任是社交的基礎,基于區塊鍊防篡改的特征,我們可以解決很多金融、保險領域的防欺詐問題。

時間戳,記錄可追溯

然後就是時間戳,區塊鍊上每條交易都有一個時間戳,它表示的是交易在區塊鍊中被執行的時間,這個時間戳就是可溯源的關系,它可以給我們提供所有操作的曆史變更,天然提供可審計功能。在供應鍊溯源等場景,它都可以發揮很大的作用。

共識自治

接下來講一下共識算法,本質上說是加上了拜占庭容錯的分布式一緻性共識算法。在使用分布式一緻性算法時,必須有個前提是——其環境都是可信的,都需要預設環境中沒有惡意的節點,對網絡進行攻擊或資料篡改。但這在區塊鍊網絡中是很難保證的,因為它是p2p網絡,主要隻要符合标準,它都能接入進來。那麼這個時候我們就要在傳統的分布式一緻性算法之上加入拜占庭容錯機制。

也就是說,共識算法的區塊鍊的核心之一。

智能合約

然後是智能合約。講到智能合約也許大家第一時間想到的是以太坊,它其實是将參與方的約定和共識轉變成圖靈完備的代碼,它對合約邏輯的實作和和執行權進行拆分,合約是你寫的,但執行的不一定是你,這就保證了合約一旦實行後任何人都不能幹預,它隻能按照共同達成的約定去執行一定的業務邏輯。對于任何既定業務規則,包括一些涉及信任危機的業務場景,比如衆籌、交易撮合、彩票開獎過程等都的執行可以放到智能合約上去執行。但目前智能合約發展還不是很成熟,大家可以将其了解為是規則的更新版。

聯盟鍊

最後是聯盟鍊,衆安使用的是聯盟鍊的模式,它是最貼近現實的一種模式。很多合作夥伴,有些會直接使用我們的區塊鍊網絡,有些會自己部署自己的區塊鍊網絡,并且帶着自己的區塊鍊網絡加入進來。這個時候就需要解決聯盟鍊之間的信任機制,通訊機制和資料同步機制。

雷鋒網:保險行業目前存在哪些痛點?這項技術對保險經濟的價值和好處展現在哪裡?區塊鍊在保險領域主要有哪些應用?

李雪峰:對應到保險場景,切入點是非常多的。比如健康險的資料儲存,淘寶和理賠過程中資料的可靠性驗證,以及理賠的自動執行等。

下面分三個大方面講一下區塊鍊在保險領域的落地場景:

關鍵在于提升客戶的參與度,主要是改善使用者心理和行為的感受。比如,可以為使用者控制個人資料,解決p2p保險等監管、資料跟蹤的問題,利用智能合約提供自動化理賠的執行。

個人資料控制

一方面客戶害怕自己的資料送出給保險公司後失去控制。 第二,如果得不到永久儲存,那麼使用者在每一次購買保險産品時,都需要重複填寫各種資訊,這些都是非常讓使用者厭倦的事情。

有了區塊鍊,我們就可以通過區塊鍊開發一種基于區塊鍊的網絡身份證,其可以與某個實體關聯起來,并且對于使用者隐私比較敏感的資料,比如購買健康險産品時與健康相關的醫療資料等,我們都可以把它存儲在區塊鍊裡面,通過資料加密和讀取的授權加以對資料進行保護。但事實上很多時候,資料并不一定需要存儲在區塊鍊裡面,比如我們即将推出一個基于區塊鍊網絡身份證的app,這樣使用者的資料就是保留在移動終端裡的。隻有在被需要的時候才會被登記的區塊鍊裡面,去進行哈希的比對。通過這樣的方式,使用者把資料放在本地,并且在需要驗證和比對時也可以通過區塊鍊控制資料的隐私性和權限。

這種方式可以帶來非常大的好處,當資料量達到一定規模而且非常充分的時候,可以減少很多重複的問題。比如,很多行業包括保險會做kyc的工作。但是他們為什麼做不起來呢?一方面,沒有一個統一的标準來對資料進行對接,也沒有一個中央式中心化的資料庫來承擔這樣的角色,因為誰都不會放心把資料交給這樣一個中央化的隐私資料庫。那麼根據區塊鍊的加密共享賬本的特性,我們可以快速完成kyc,因為使用者在不同保險公司或者同一保險公司購買不同産品的時候可以減去大量的重複資料送出的工作。

自動化理賠的執行

區塊鍊另一個提升使用者參與度和體驗的手段是——提供較高的透明度以及理賠處理的公平性。這裡我們用航意險來舉個例子。當使用者購買了航意險,其指定的航班取消或者發生延誤時,可以由航空公司觸發一個事件來通知區塊鍊上的智能合約,而當智能合約擷取到這些外部資料以後,就可以為購買了這款産品的消費者直接完成理賠支付。這個過程是全自動執行的過程,其主要流程也都在智能合約裡面。這樣的流程雖然說沒有區塊鍊也可以實作,但基于智能區塊鍊的智能合約能夠提供一個獨特的公正機制,這種機制不但能為客戶提供較高的透明度和可信性,它還能帶來廣泛的網絡效應。

區塊鍊在保險應用的第二個大方面,就是提高反欺詐的能力和定價的靈活性。

反欺詐

之前有過統計,保險的索賠事件中,有5%到10%是欺詐騙保的行為。通過區塊鍊,我們就可以構造一個跨行業的分布式的客戶資料登記平台,其可以幫助我們更有效地識别客戶的身份和虛假的人身傷害以及損失報告。比如說,當醫院和保險公司在同一個區塊鍊網絡中,客戶就不再需要将一些理賠憑證通過線下的方式送出給保險公司,再由保險公司花費大量的人力财力支出去醫院完成報告的真僞鑒别,而是醫院可以直接在區塊鍊上向保險公司出具他們的醫療報告,那麼當保險公司拿到醫院提供的報告時可以直接判斷這些報告的所屬權,和其文檔的真實性。那麼這種情況傷保的直接支付就變成可能,而不是像現在這樣由使用者先墊付再理賠,而且在理賠之前還要送出很多不必要的材料。

此外,如果能完整地在區塊鍊中記錄産品或資産的購買時間,所有權和區域的曆史變更,對于财産證明和财産盜竊的公證中也有很大幫助。如果我們能拿到這些完善的材料,就可以幫助保險行業大大提升其自身的風控和反欺詐能力。

靈活定價

至于靈活定價的特點,我們拿車險來舉例。今年車險進行費改,對于續保的車子如果在之前沒有出現過事故的,其優惠的費用還是很大的,但是其實他的步子還可以邁得更大一點。比如說,如果可以實時地擷取駕駛行為、車輛、道路等資料,并通過智能合約制定一些規則,實時地計算相關費率,我們就可以對一些駕駛行為良好的司機的保費做出更大讓利,讓他們以更便宜的價格拿到車險。

但是這個過程需要強調的是,敏感資料的控制權還是應該在使用者自身。把資料放在區塊鍊中,但是區塊鍊需要通過提供隐私授權這樣的機制,讓使用者自己來操控自己資料的使用權。

降低營運成本

區塊鍊在保險行業最後一個大的作用方面是降低保險公司的營運成本。通過智能合約來運作保單的身份、合約的有效性審查,索賠登記核對保方資料,以及通過區塊鍊技術進行賠付支付的功能,可以幫助我們大大降低營運成本,并且幫我們做到真正的無紙化。

另外一個比較典型的例子是再保險。當原保險公司發生某一塊産品風險程度非常大的時候,其可以選擇将一部分保單轉移給一部分再保險公司來進行風險的分攤。在這個過程中,原保險公司和再保險公司會有相當多互動,包括保單和理賠資料共享和索賠之後的對賬。如果可以通過區塊鍊将這些資料共享在區塊鍊上,就可以提升保險公司自動化執行的能力。此外,它還提供了一種可審查的方式,來提高再保險公司的透明度。

雷鋒網:區塊鍊開發技術發展現狀是怎樣的?有哪些區塊鍊的特性和優勢是已經可以實作的,哪些是還不能實作的?為什麼?或者說,有些特性總體效果不是十分好,區塊鍊應用開發難在哪裡?目前還有什麼深層次的關鍵問題有待解決?為什麼?

李雪峰:區塊鍊技術在近年的發展還是蠻快的,像衆所周知的r3聯盟上周就開源了自己的區塊鍊實作平台corda。但其實際上并不是一個真正意義的區塊鍊,它隻是一個——按他們的說法,是一個去中心化賬本。那麼摩根大通的也開源了自己在以太坊上的實作。現在無論是國内還是國外,都有非常多的區塊鍊創業公司。

那麼主要的差别在于,國内的更偏重“鍊”這一層,而國外的企業更偏重于垂直應用的方向,做一些業務的創新或者創業。同時,今年也出現了很多研究聯盟和産業聯盟,這其實對于普及和推動區塊鍊的落地是有很大幫助的。衆安也有自己的産業促進聯盟,同樣是圍繞着生态去打造的。

大概來說,已實作的特性和優勢包括多中心化、不可篡改、資料的安全拷貝、透明審計和資料全局化追蹤;暫時還沒有實作的主要集中在——對技術要求更複雜的性能優化和隐私保護方面的特性。

在性能優化這方面,目前業界普遍的原則方向和做法有些是使用優化共識算法,将比特币或以太坊的pow算法改造成為股權證明pos或者pbft。那麼我認為這些都是短期内比較不錯的解決方法,但中長期的研究方向主要還應該在sharding(分片)上。

我為什麼認為應該是在sharding呢?這就好比,好久以前我們在去ioe的時候——在ioe去完之後,就是資料庫的分庫分表。趨勢總是不可逆的,無論是狀态通道,還是去優化公式算法,其對性能或者吞吐量的提升目前來說并不是一個很大量級的提升。要達到一個企業級的水準,上萬的tps或者10萬級的tps,沒有sharding幾乎是不可能的。使用sharding政策的特點主要是讓節點去處理隻和自己有關的部分交易,而不是把每個交易都放在所有的節點上去執行。

但是,未來sharding的方向肯定是橫向的,刷得橫向的刷點可以在吞吐量上帶來,質的飛躍。一台區塊鍊實際上是由很多自戀來組成的,這就使得區塊鍊可以像分庫分表的資料庫一樣,當性能和容量不夠的時候,隻需要不停地加建子鍊就可以把容量和性能進行無縫的橫向擴充。現在目前不管是開源社群還是衆安内部,大家都是在積極讨論進行嘗試驗證的過程。但是呢,我相信sharding不會讓大家等待太長的時間。

另外一點,從目前階段來講,如果要對接高頻的網際網路交易是有辦法實施的,但是如果要把交易資料直接存放到區塊鍊中,這是目前做不到,而且是沒必要做的。因為在區塊鍊網絡中,所有的交易都要進行全網的廣播,如果這個我們區塊鍊從性能、吞吐量上能夠接受得了,帶寬也接受不了;即使帶寬能夠受得了,技術、存儲也受不了。整個實作來說,會在每一個環節都出現一些瓶頸。是以現在的高頻處理方案都是花開兩朵,各表一枝。

最後需要強調的是,區塊鍊的優勢不能隻建立在功能方面。很多人認為用區塊鍊練就天然具備了容災、資料防篡改的特性。但其實不是的,這雖然是區塊鍊天生帶來的功能,但其還與網絡的體量規模、生态、場景相關,隻有把體量、規模、生态、場景結合在一起,它才能真正發揮重大的作用。設想一下,不管區塊鍊能實作到什麼樣的程度,如果隻有一台伺服器去部署一個節點,那麼功能再強大又怎麼樣呢?它照樣什麼都不是。

雷鋒網:區塊鍊行業應用開發和商業落地存在什麼問題?

李雪峰:區塊鍊本身是一個純技術的東西實際上是一種技術标準,是以對大多數人或者企業來講,去開發一個區塊鍊的實作,這是一個不太現實的問題。因為它的難度确實非常大,區塊鍊雖然并不是一個新的學科,但是它是對密碼學、計算數學、資料結構,甚至包括社會學、金融學的柔和。那麼大家最終都會選擇一個實作了的區塊鍊的産品,然後在這些産品上搭建自己的區塊鍊應用。那麼這些産品就像剛才提到過的,相對更成熟一點的是hyperledger、以太坊和corda。這個就好比網際網路架構中大家都會遇到的——資料庫存儲我們應用的資料,但是沒有幾家公司會真正自己去做資料庫,肯定會根據自己的特點選擇一些合适的資料庫。

是以我要講的事實是,基于區塊鍊産品來開發,我們的應用會有一個難度。對于大部分使用者來講,可能永遠都不需要區塊鍊的技術原理是什麼,但是這個并不妨礙大家去使用這個技術。按道理來說,使用産品化的東西是不應該有太大難度的。但因為現在區塊鍊還比較新,市面上完善的産品相對比較少,然後是成熟完善的學習資料比較少,并且這些産品的發展方向還各不一樣,比如說hyperledger是奔着分布式賬本去的,而以太坊是奔着應用中的智能合約中的執行去的。那麼對于衆人而言,如果應用到金融領域,無論是選用哪一個都需要較大的改造。比如衆安在早期時對以太坊進行研究和落地的嘗試驗證,發現它的共識機制并不是非常适合金融領域,而且很多功能是沒有實作的,比如說完備的隐私保護或者金融的監管特性,性能也是沒法滿足。

基于這樣的現狀,我個人認為開發難度主要展現在五點:

第一個是區塊鍊的準入門檻比較高。如前面所說,區塊鍊是要密碼學、數學算法等基礎,現有的産品又非常不成熟,又與傳統的分布式應用有着較大的差別。是以開發人員要快速進入該領域之前,可能都會有一個不短的學習周期。

第二個點是吞吐量,也就是說性能差,容量差。因為目前無論是哪一種區塊鍊的實作吞吐量都是影響業務落地的痛點之一。比較明顯的場景是,比如移動支付或者保險理賠。這種金融場景其實對吞吐量和易性能要求是非常高的。可以想象一下,如果要通過手機到便利店進行一次支付,掃二維碼的時候你要原地幹等三十秒,那麼體驗是非常差的。

第三點是隐私與監管。區塊鍊是一種共享的賬本,對于隐私保護需要有更進一步的要求,因為資料在賬本上共享,每個節點都可以拿到完整的資料,如果不能對隐私進行完整的保護,可能會出現非常大的問題。我們多次提到過,區塊鍊的一個核心是去中心化,但是在實際應用業務落地的時候,特别是金融場景,監管又是一個必不可免的要求。我們必須要確定我們的行為是遵守法律的,必須要杜絕一些洗錢行為。監管和隐私其實是存在一定的沖突,這兩個之間需要進行平衡,這也是非常難的一個地方。

第四個是智能合約。雖然智能合約在前面冠名了“智能”兩個字,但事實上現在的智能合約是一點都不智能。目前在智能合約能實作的業務邏輯都是功能相對比較單一的。一些較為複雜的業務,比如保險領域的核賠或者銀行中的信貸放貸,這些資質判定可能沒法通過智能合約來進行一步到位的實作。那麼對于這樣的問題,我們需要通過鍊上加鍊下的方式來共同執行。

第五點不是一個技術問題,而在于其落地和推廣成本太高。很多技術在結合了區塊鍊之後,能産生的化學反應都是劇烈的,都是帶有颠覆性的。這也就意味着,我們需要大量的人力和成本進行驗證,并去推廣落地這些應用。

講完這五個點,對我個人來講的話,我最為關心的還是隐私的監管問題。這是一個非常關鍵的問題,因為這個并非全是技術問題,還關系到線上線下的法律融合問題——個人資料的确權使用範圍,法律監管辦法,這裡面也會有一定程度上的權利義務的沖突。這會是涉及到計算哲學的問題,應該說是一個系統解析的問題。

雷鋒網(公衆号:雷鋒網):前不久深圳出現了一起鬧得沸沸揚揚的“詐捐”事件:某公号寫手借女兒罹患白血病一事進行募捐,得到大量支援,但事實上此人有三套房産,屬“詐捐”。募捐而得的近三百萬善款,捐獻者也無從知曉其用處去向,加以監管。對于這樣的事情,區塊鍊能夠在哪些方面發揮作用以防範改進呢?

李雪峰:對于這個問題,我們要從多方面考慮。其實衆安也跟自己聯盟成員火堆公益在做一個類似的事情。首先,如果我們通過區塊鍊建立一個完整的使用者體系,甚至是使用者資産體系,那麼可能“詐捐”的行為根本就沒法發生。因為一個人一旦提出衆籌或者募捐,監管機關就可以在區塊鍊上對其資産進行驗證,并且對其需要募捐的費用和其資産進行比對,如果發現其是詐騙,這樣的捐款本來就不應該發生。

那麼第二個問題就是有了區塊鍊之後更容易解決的問題。之前我們講到過,區塊鍊上的所有資料都是不可篡改,而且帶上時間戳的,那麼我們隻要對這300萬善款在區塊鍊上進行追蹤,追蹤每一次轉移每一次消耗,費用到底從誰的手裡到誰的手裡,最後發生在哪裡,讓這些資訊對于所有捐款人來說都是一目了然的。

雷鋒網:為什麼以太坊這麼容易被攻擊呢?

李雪峰:有名才會吸引人去攻擊,站在巨人的肩膀上好成名。

對于攻擊的内容,不是以太坊容易出事故,而是以太坊搭建的系統沒有做好安全防護,容易被攻陷。你想啊,區塊鍊首先是面對真正的大型網際網路的,甚至是物聯網的,但是如果不去掌握網際網路架構的精髓去搭建區塊鍊應用,肯定走不遠的。高頻交易,資料一緻性,安全防護,監控體系,這些都是現在基于雲計算的體系精華,少不了。

我是過來人,希望大家引起注意,别走彎路,好好研究網際網路再去搞區塊鍊。

問:區塊鍊技術入門,涉及哪些程式設計語言?

李雪峰:前兩天剛在一個區塊鍊的技術交流群裡面的看到一位同學說:“學了區塊鍊一年已經學會了十八種不同的語言!”

目前比較主流的幾種是go語言、c++,包括部分會用java、python。以太坊會有多種不同語言的實作,最主流的還是go語言進行程式設計;對于hyperledger最多也是使用了go語言;像比特币用的最多就是c++。

用什麼語言取決于你要學習鍊的底層實作還是說在其上層去做一些應用。不管是哪個區塊鍊實作,他們對外都是提供的rpc接口還是比較完備的,是以如果你隻是要做上層的應用,其實哪種程式設計語言都沒有關系。

本文作者:溫曉桦