如何采用區(qū)塊鏈技術(shù)進(jìn)行交易數(shù)據(jù)防篡改
今天和大家分享的主題是《區(qū)塊鏈?zhǔn)侨绾巫龅浇灰讛?shù)據(jù)防篡改的》?這個話題屬于數(shù)據(jù)安全領(lǐng)域的問題,如果完全展開來說,涉及到的面非常廣;那我們依然按照之前的原則,一次只講一個核心點(diǎn),掰開了揉爛了說;在講解的過程中呢,我會結(jié)合一小部分代碼,但我會盡量講的淺顯直白一些,讓大家不僅感到到區(qū)塊鏈防篡改的特性,也展示一下它到底是如何實(shí)現(xiàn)的,是不是真的如他一直宣稱的那樣實(shí)現(xiàn)了數(shù)據(jù)的防篡改?下面就讓我們開始;
在這之前,讓我們先回憶下在傳統(tǒng)互聯(lián)網(wǎng)或移動互聯(lián)網(wǎng)行業(yè),大家是怎么存數(shù)據(jù)的?
通常的做法是,使用關(guān)系型數(shù)據(jù)庫,例如mysql、oracle,建一條數(shù)據(jù)記錄,將我們的各種屬性值存在里面,現(xiàn)在我們挑一個大家最敏感的字段,賬戶余額來聊;
現(xiàn)在給大家舉兩個可怕的例子,第一個是:如果有人在后臺程序里,留了后門,可以直接注入一段腳本代碼,操作數(shù)據(jù)庫,修改賬戶余額,然后進(jìn)行非法提現(xiàn)或者商品買賣;第二個,公司里有的同學(xué)有數(shù)據(jù)庫權(quán)限,可以直接登進(jìn)數(shù)據(jù),然后直接update操作,把賬戶余額改掉;這兩個例子,是不是非常刺激?
如果,是使用區(qū)塊鏈系統(tǒng),來存儲數(shù)據(jù)資源,就不會出現(xiàn)這種情況。即使出現(xiàn)了這種情況,也會被區(qū)塊鏈系統(tǒng)自動檢測到,然后把這筆被篡改的記錄從鏈上踢掉,然后從其他的存儲節(jié)點(diǎn),把健康的交易數(shù)據(jù)同步過來;
下面我們看下,區(qū)塊鏈?zhǔn)侨绾巫龅降??我們還是以比特幣系統(tǒng)為例來說。
在這之前,先給大家介紹下比特幣系統(tǒng)的賬戶模型;在比特幣里,它是沒有用戶資產(chǎn)記錄這樣的概念,不會像在mysql里那樣,用一條數(shù)據(jù)存儲記錄表達(dá);它的資產(chǎn),是通過把所有的交易記錄串聯(lián)聚合之后,得到的;而且,區(qū)塊鏈系統(tǒng)明確表達(dá)了,賬戶里的資產(chǎn)來源,你可以一直向上追溯,一直追到創(chuàng)世塊,也就是挖礦時的所得;
例如,你收到了小張50元的轉(zhuǎn)賬;小張轉(zhuǎn)給你的50元里,有20元是來自小李的,30元是來自小王的,小李的20元有3元是來自小劉的,17元是來自小孟的。..。..,這個資金的流動傳遞會在鏈上完整的表達(dá)出來;下面看下區(qū)塊鏈系統(tǒng)是如何做的:
所謂資金流轉(zhuǎn)就是一次交易,因此比特幣系統(tǒng),設(shè)計了一個非常核心的數(shù)據(jù)結(jié)構(gòu),大家看下下面這張截圖:
MsgTx就是表達(dá)一次交易,這個交易結(jié)構(gòu)體里,有個切片字段TxIn,完整的定義是緊挨著MsgTx的下一個結(jié)構(gòu)體。這個結(jié)構(gòu)體里,有個PreviousOutPoint,它表示的意思,就是這筆輸入的來源地址;這樣一筆交易信息,會先封到一個block結(jié)構(gòu)體里,然后經(jīng)過驗(yàn)證存到數(shù)據(jù)庫里;前一個交易記錄里,同樣也會有一個PreviousOutPoint繼續(xù)向前指;這樣是不是就比較清楚每筆資金的具體從哪里來的了,如果你比較感興趣,可以在數(shù)據(jù)庫里一直向上追溯,直到創(chuàng)世塊;
下面來看下防篡改;就以上面小張賬戶的50元說起;在這里要把P2P網(wǎng)絡(luò)提一下,這是區(qū)塊鏈的運(yùn)轉(zhuǎn)起來的基礎(chǔ);區(qū)塊鏈系統(tǒng)是一個完全松散自治的P2P網(wǎng)絡(luò),這個網(wǎng)絡(luò),每時每刻都會有節(jié)點(diǎn)加入,有節(jié)點(diǎn)離開;而且沒有中心節(jié)點(diǎn)來管理,每一個節(jié)點(diǎn)都靠算法來維護(hù)自身的數(shù)據(jù)塊信息;
現(xiàn)在來看小張的賬戶;如果小張想把自己的50元賬戶,改成50萬;他要做的第一件事情是控制全網(wǎng)51%以上的節(jié)點(diǎn),這個從概率上來推算基本是不可能的,可以認(rèn)為失敗是必然的(概率上的極大似然估計法);假設(shè)一個人的運(yùn)氣非常好,他真的控制了全網(wǎng)51%的節(jié)點(diǎn);下面有另外一個更嚴(yán)峻的挑戰(zhàn):拿到用戶的私鑰;上面我們說了,小張要把這50改成50萬,需要把小張之前的小李的,小王的,小劉的,小孟的。..總之和這50元相關(guān)的所有的人的私鑰都竊取到,然后把數(shù)據(jù)篡改掉,才能騙過區(qū)塊鏈系統(tǒng);
這里面有兩個問題:1 為什么需要改這么多人的數(shù)據(jù)?這是由于,前面說了,區(qū)塊鏈系統(tǒng)會記錄每筆自己的詳細(xì)來源,在交易驗(yàn)證的時候,發(fā)現(xiàn)數(shù)據(jù)不對,會不斷向前回溯驗(yàn)證的; 2 為什么要私鑰?這個我們需要配合交易的數(shù)據(jù)結(jié)構(gòu)來說,還是看下面這張圖的最后一個數(shù)據(jù)結(jié)構(gòu)TxOut,
該數(shù)據(jù)結(jié)構(gòu)表示,用戶的交易輸出,例如小張50元的來源是小李的20,小王的30,那這20和30分別對應(yīng)的是小李的交易輸出;大家注意了,這個TxOut里有個PkScript字段,專業(yè)的說法是鎖定腳本;意思是,如果想花掉這筆錢,或者動這筆錢,需要有相應(yīng)的解鎖腳本和鎖定腳本做匹配;否則就會失敗,就會被系統(tǒng)發(fā)現(xiàn);這個鎖定腳本,通常是用戶的公鑰,解鎖腳本是用戶的私鑰;簡單理解,就是非對稱加密驗(yàn)證的意思;所以說,如果用戶想篡改資金額度,不僅要控制全網(wǎng)51%以上的節(jié)點(diǎn),還要竊取很多相關(guān)人的密鑰,其難度可想而知;
說到這里,我認(rèn)為基本上是說清楚了,區(qū)塊鏈?zhǔn)侨绾巫龅綌?shù)據(jù)防篡改的了;雖然我盡量想著白話一點(diǎn),這個過程中,還是不可避免的摻進(jìn)了一些專業(yè)術(shù)語