自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

區(qū)塊鏈?zhǔn)澜缋锊荒苄攀裁矗?/h1>

區(qū)塊鏈
上一篇分享了“信任區(qū)塊鏈時(shí)究竟在信任什么?”,這次換個(gè)角度,漫步月之暗面,談?wù)勗趨^(qū)塊鏈系統(tǒng)和業(yè)務(wù)設(shè)計(jì)時(shí),不信任什么。

大家好,我是張開翔。

上一篇分享了“信任區(qū)塊鏈時(shí)究竟在信任什么?”,這次換個(gè)角度,漫步月之暗面,談?wù)勗趨^(qū)塊鏈系統(tǒng)和業(yè)務(wù)設(shè)計(jì)時(shí),不信任什么。

先講結(jié)論: 幾乎什么都不能信!

[[271770]]

建立Don't Trust,Just Verify的理念,才是通往區(qū)塊鏈?zhǔn)澜绲恼_態(tài)度。

——By我隨口說的

1 不信任其他節(jié)點(diǎn)

區(qū)塊鏈節(jié)點(diǎn)和其他節(jié)點(diǎn)會(huì)建立P2P通信,共同組成網(wǎng)絡(luò),傳遞區(qū)塊、交易、共識(shí)信令等各種信息。其他節(jié)點(diǎn)可能是由不同的機(jī)構(gòu)、不同的人持有,持有節(jié)點(diǎn)的人可能是善意,也可能是惡意。

即使在善意假設(shè)時(shí),節(jié)點(diǎn)運(yùn)行存活的健康度也會(huì)受運(yùn)維水平和資源影響,比如處于一個(gè)不穩(wěn)定的網(wǎng)絡(luò)里,會(huì)偶爾掛掉,會(huì)抽風(fēng)亂發(fā)消息,或者硬盤滿等原因?qū)е聰?shù)據(jù)存儲(chǔ)失敗,以及出現(xiàn)其他可能的故障。

在惡意假設(shè)時(shí),要預(yù)設(shè)其他節(jié)點(diǎn)可能會(huì)騙自己或傷害自己,比如傳遞過來錯(cuò)誤的協(xié)議包,或者用詭異的指令尋找漏洞進(jìn)行攻擊,或者發(fā)起高頻垃圾請(qǐng)求,頻繁連接然后斷開,又或者海量連接占用資源等。

所以節(jié)點(diǎn)應(yīng)該是把自己看成在黑暗叢林里孤身求生存的獵人,必須有“獨(dú)立自主”、“自給自足”的態(tài)度,擺出“不相信其他任何節(jié)點(diǎn)”的姿勢(shì)保護(hù)自己。在節(jié)點(diǎn)準(zhǔn)入時(shí),需要采用證書技術(shù)來認(rèn)證節(jié)點(diǎn)身份;在連接控制上,拒絕有異常的連接;采用頻率控制對(duì)連接次數(shù)、請(qǐng)求量等做限制;在協(xié)議包格式和指令正確性等方面做驗(yàn)證。自己發(fā)出去的信息,不應(yīng)暴露自己的私有信息,也不期望其他節(jié)點(diǎn)一定會(huì)給出立刻和正確的響應(yīng),必須采用異步處理和校驗(yàn)容錯(cuò)的設(shè)計(jì)。

2 節(jié)點(diǎn)和客戶端互相不信任

客戶端,指在區(qū)塊鏈網(wǎng)絡(luò)外,向區(qū)塊鏈發(fā)起請(qǐng)求的模塊,如業(yè)務(wù)使用的java sdk、錢包客戶端等??蛻舳撕凸?jié)點(diǎn)通過網(wǎng)絡(luò)端口通信。

如果客戶端掌握在不受控的人手里,有可能會(huì)向節(jié)點(diǎn)發(fā)起大量的請(qǐng)求,或發(fā)送一堆垃圾信息,使節(jié)點(diǎn)疲于應(yīng)對(duì),甚至巧妙地構(gòu)建漏洞攻擊信息,試圖越權(quán)訪問,竊取信息或使節(jié)點(diǎn)出錯(cuò)。

同時(shí),從客戶端的角度看,節(jié)點(diǎn)有可能不響應(yīng)或響應(yīng)緩慢,或者返回錯(cuò)誤的數(shù)據(jù),包括格式錯(cuò)誤、狀態(tài)錯(cuò)誤、表示收妥但其實(shí)不處理等,甚至別有用心的人會(huì)設(shè)置一個(gè)“假”節(jié)點(diǎn)和客戶端通信,欺騙客戶端。節(jié)點(diǎn)做出這些與期望不符的反應(yīng),可能使客戶端運(yùn)行出錯(cuò),功能受損。

為提升節(jié)點(diǎn)和客戶端的互信,可以為雙方分配數(shù)字證書,必須通過證書進(jìn)行雙向握手,客戶端經(jīng)過私鑰簽名才能對(duì)節(jié)點(diǎn)發(fā)起交易類請(qǐng)求,節(jié)點(diǎn)應(yīng)對(duì)客戶端進(jìn)行權(quán)限控制,拒絕高危的接口調(diào)用,不要輕易開放節(jié)點(diǎn)管理接口、系統(tǒng)配置接口等。雙方對(duì)每次通信的數(shù)據(jù)格式、數(shù)據(jù)有效性都進(jìn)行嚴(yán)密校驗(yàn)。

雙方在交互時(shí)也應(yīng)該進(jìn)行頻率控制,異步處理,對(duì)每一個(gè)交互進(jìn)行結(jié)果校驗(yàn),不能預(yù)設(shè)對(duì)方正確處理,必須獲取交易回執(zhí)和處理結(jié)果進(jìn)行確認(rèn)。

當(dāng)認(rèn)為只和一個(gè)節(jié)點(diǎn)通信并不能保證安全時(shí),客戶端可以采用“f+1查詢”的思路,盡可能多地和幾個(gè)節(jié)點(diǎn)通信。如果當(dāng)前鏈的共識(shí)安全模型是“3f+1”,那么,如果從f+1個(gè)節(jié)點(diǎn)讀到的信息是一致的,結(jié)果是可以確認(rèn)的。

3 不信任區(qū)塊高度

區(qū)塊高度是一個(gè)非常關(guān)鍵的信息,代表整個(gè)鏈當(dāng)前的狀態(tài)。向區(qū)塊鏈發(fā)送交易、節(jié)點(diǎn)間進(jìn)行共識(shí)、對(duì)區(qū)塊和狀態(tài)的校驗(yàn)等操作都會(huì)依賴區(qū)塊高度。

某個(gè)節(jié)點(diǎn)在斷網(wǎng)或處理速度緩慢時(shí),其區(qū)塊高度有可能落后于整個(gè)鏈,又或者某個(gè)節(jié)點(diǎn)惡意偽造數(shù)據(jù)時(shí),其高度又可能超過整個(gè)鏈。在鏈出現(xiàn)分叉時(shí),如某一個(gè)分叉上的區(qū)塊高度被另一個(gè)分叉超越,落后的分叉就會(huì)變得毫無意義。即使在正常的情況下,節(jié)點(diǎn)依舊有可能間歇性地落后于整個(gè)鏈一到幾個(gè)區(qū)塊,然后在一定時(shí)間內(nèi)才可能追上最新高度。

如在PBFT共識(shí)模型里,總數(shù)2/3以上節(jié)點(diǎn)在同一個(gè)高度時(shí),全鏈就有機(jī)會(huì)達(dá)成共識(shí)繼續(xù)出塊。余下的1/3的節(jié)點(diǎn)有可能和參與共識(shí)的節(jié)點(diǎn)高度不同,這時(shí)意味著從這個(gè)節(jié)點(diǎn)讀取到的數(shù)據(jù),并不是全網(wǎng)最新的數(shù)據(jù),只能代表鏈在該高度時(shí)的一個(gè)快照。

業(yè)務(wù)邏輯可以把區(qū)塊高度做為一個(gè)參考值,基于高度做一些判定邏輯,在確定性共識(shí)(如PBFT)的鏈上,采用f+1查詢等方法確認(rèn)鏈的最新高度,在可能分叉的鏈上,需要參考“6個(gè)區(qū)塊確認(rèn)”的邏輯,審慎選取可信的區(qū)塊高度。

4 不信任交易數(shù)據(jù)

交易(Transaction)代表一方向另一方發(fā)起了一個(gè)事務(wù)請(qǐng)求,交易可能導(dǎo)致資產(chǎn)的轉(zhuǎn)移、改變帳戶狀態(tài)或系統(tǒng)配置,區(qū)塊鏈系統(tǒng)通過共識(shí)后確認(rèn)交易,使相關(guān)的事務(wù)生效。

交易必須帶上發(fā)送者的數(shù)字簽名,交易里所有數(shù)據(jù)字段都必須包含在簽名里,未經(jīng)簽名的字段存在被偽造的可能,不予采信。

交易數(shù)據(jù)在網(wǎng)絡(luò)上廣播時(shí),可以被其他人讀取,如交易數(shù)據(jù)里包含隱私數(shù)據(jù),發(fā)送者則必須對(duì)數(shù)據(jù)進(jìn)行脫敏或加密保護(hù)。

交易可能因?yàn)榫W(wǎng)絡(luò)原因被重發(fā),或者被其他人保存下來刻意再次發(fā)送,造成交易的“重放”,所以區(qū)塊鏈系統(tǒng)必須對(duì)交易進(jìn)行防重,避免出現(xiàn)“雙花”。

5 不信任狀態(tài)數(shù)據(jù)

區(qū)塊鏈的狀態(tài)(State)數(shù)據(jù)是由智能合約運(yùn)行后生成的,理想情況下,每個(gè)節(jié)點(diǎn)的合約引擎一致、輸入一致、規(guī)則一致,那么輸出的狀態(tài)就應(yīng)該一致。但不同的節(jié)點(diǎn)可能安裝了不同的軟件版本,或者合約引擎的沙盒機(jī)制不夠嚴(yán)密引入了不確定性因素,甚至被侵入、篡改,或者存在其他莫名其妙的bug,都可能導(dǎo)致合約運(yùn)行輸出結(jié)果不一致,那么一致性和事務(wù)性就無法得到保障。

狀態(tài)的校驗(yàn)是成本很高的事情,典型的校驗(yàn)方法是使用MPT(Merkle Patricia Tree)樹,把所有狀態(tài)都塞到樹里管理起來。MPT樹可以把所有的狀態(tài)歸結(jié)為一個(gè)Merkleroot Hash,節(jié)點(diǎn)之間在共識(shí)過程中確認(rèn)交易運(yùn)行后生成的狀態(tài)樹Merkleroot,確保狀態(tài)一致。

這棵樹結(jié)構(gòu)復(fù)雜,數(shù)據(jù)量大,消耗不少的計(jì)算和存儲(chǔ)資源,很容易就成為了性能瓶頸。所以對(duì)狀態(tài)的校驗(yàn)需要有更快、更簡(jiǎn)單,且又穩(wěn)妥的方案,如結(jié)合版本驗(yàn)證、增量Hash驗(yàn)證等算法,輔以數(shù)據(jù)緩存,可減少重復(fù)計(jì)算和優(yōu)化IO次數(shù),能在保證一致性、正確性的同時(shí),有效地提升驗(yàn)證效率。

6 不信任私鑰持有者

采用私鑰對(duì)交易以及其他關(guān)鍵操作進(jìn)行簽名,再使用公鑰驗(yàn)簽,是區(qū)塊鏈上最基礎(chǔ)的驗(yàn)證邏輯。只要私鑰被正確使用,這個(gè)邏輯是安全的。

但私鑰僅僅是一段數(shù)據(jù),只依賴私鑰則用戶是匿名的。在聯(lián)盟鏈面對(duì)的場(chǎng)景里,需要使用許可型的身份,首先通過KYC、盡調(diào)、權(quán)威認(rèn)證等現(xiàn)實(shí)世界的驗(yàn)證方式確認(rèn)身份,然后將身份和公鑰綁定并公示,或者結(jié)合PKI體系的數(shù)字證書發(fā)放公私鑰,這樣私鑰對(duì)應(yīng)的身份是可知、可信、可控的。

私鑰可能會(huì)因丟失、泄漏而被他人盜用,或者因被遺忘導(dǎo)致資產(chǎn)損失。所以在私鑰的保存上,需要考慮采用周全的保護(hù)方案,如加密存儲(chǔ)、TEE環(huán)境、密碼卡、USBkey、軟硬加密機(jī)等方案。在私鑰的管理上,則需要考慮密鑰丟失后如何安全的重置、找回。

加強(qiáng)版的私鑰使用思路有幾個(gè),比如使用多簽、門限簽名等方式,每次交易時(shí)必須用多個(gè)私鑰進(jìn)行簽名,私鑰可以保管在不同的地方,安全性高,但技術(shù)方案和使用體驗(yàn)復(fù)雜。

還有一種是交易私鑰和管理私鑰分離。交易私鑰用于管理資產(chǎn),管理私鑰用于管理個(gè)人資料,交易私鑰可以被管理私鑰重置,管理私鑰本身則通過門限、分片等算法,分開存儲(chǔ)保管,以備重置或找回。

7 不信任其他鏈

在跨鏈的場(chǎng)景里,每條鏈有自己的資產(chǎn)、共識(shí),鏈之間的安全模型變得非常復(fù)雜,比如一條鏈上的記賬者串通造假,或者鏈出現(xiàn)了分叉、區(qū)塊高度回滾,這時(shí)如果鏈外的其他模塊和鏈有不夠嚴(yán)謹(jǐn)?shù)慕换?,都?huì)造成數(shù)據(jù)不一致或資產(chǎn)損失。

如果不同的鏈采用的還是不一樣的平臺(tái)架構(gòu),那么在工程上會(huì)更加復(fù)雜。

跨鏈、側(cè)鏈目前依舊是業(yè)界在研究和逐步實(shí)現(xiàn)的課題,主要目的是解決鏈和鏈之間的通信,進(jìn)行資產(chǎn)鎖定和資產(chǎn)交換,保證整個(gè)過程的全局一致性、交易事務(wù)性,以及抗欺詐。從A鏈往B鏈轉(zhuǎn)移一個(gè)資產(chǎn),必須要確保A鏈上的資產(chǎn)被鎖定或銷毀,且B鏈上一定能增加對(duì)應(yīng)的一筆資產(chǎn),在雙方可能分別出現(xiàn)分叉、回滾的時(shí)間窗里,要有機(jī)制確保雙向的資產(chǎn)安全。

在現(xiàn)有跨鏈的方案里,存在中繼、鏈間HUB等方式,這些系統(tǒng)的設(shè)計(jì)本身也要達(dá)到高度可信可靠的標(biāo)準(zhǔn),安全等級(jí)應(yīng)不低于甚至高于所對(duì)接的鏈,同樣也應(yīng)采用多中心、群體共識(shí)的體系設(shè)計(jì),整體復(fù)雜度可算是鏈的N次方了。

8 不信任網(wǎng)絡(luò)層

區(qū)塊鏈節(jié)點(diǎn)需要和其他節(jié)點(diǎn)發(fā)生通信,所以必須在網(wǎng)絡(luò)上暴露自己的通信端口,如果通過公網(wǎng)通信,那么相當(dāng)于在公網(wǎng)上暴露了自己,很容易遭到類似滲透、DDOS這樣的網(wǎng)絡(luò)攻擊。節(jié)點(diǎn)必須在網(wǎng)絡(luò)層保護(hù)自己,包括在網(wǎng)關(guān)上設(shè)置IP黑白名單、設(shè)置端口策略、進(jìn)行DDOS流量防護(hù),且對(duì)網(wǎng)絡(luò)流量、網(wǎng)絡(luò)狀態(tài)進(jìn)行監(jiān)測(cè),如果突發(fā)網(wǎng)絡(luò)流量或連接數(shù)暴增,說不定,就是被人當(dāng)肉雞或者正在脫庫(kù)進(jìn)行時(shí)了。

非必要端口,切忌對(duì)公網(wǎng)開放,如用于做管理監(jiān)控的RPC端口,只能對(duì)機(jī)構(gòu)內(nèi)部開放,在進(jìn)行網(wǎng)絡(luò)策略設(shè)定之前,一定要慎之又慎。

9 不信任代碼

“Code is law”確實(shí)是一句響亮的口號(hào),但是在程序員頭發(fā)掉光之前,他寫的代碼都可能有bug,只是看寫bug快還是修bug快而已。

無論是底層的代碼還是智能合約代碼,都可能存在技術(shù)性或邏輯性的坑,但凡代碼產(chǎn)生的數(shù)據(jù)和指令行為,都需要另一段代碼對(duì)其進(jìn)行嚴(yán)格地校驗(yàn),代碼本身也需要進(jìn)行靜態(tài)和動(dòng)態(tài)掃描,包括采用形式化證明等技術(shù)進(jìn)行全面地審核驗(yàn)證,以檢測(cè)可能的邏輯錯(cuò)誤、安全漏洞或是否有信息泄露。前段時(shí)間有一份公布到github上的某酒店系統(tǒng)的代碼,居然包括了mysql的連接用戶名密碼,且數(shù)據(jù)庫(kù)端口居然是向公網(wǎng)開放的,這種坑簡(jiǎn)直不可想象。

開放出去的開源代碼,固然可以被人審查、反饋以提升安全性,也可能被人翻找漏洞、隨意修改,甚至惡意埋雷。但總的來說,開源還是利大于弊。在開源社區(qū)中,開發(fā)者會(huì)向項(xiàng)目提交PR(Pull Request)。審核PR是很關(guān)鍵也很繁重的工作,值得安排專家并分配大量時(shí)間去做審核。有開源項(xiàng)目的老司機(jī)透露,其項(xiàng)目核心模塊的PR的審核時(shí)間長(zhǎng)達(dá)經(jīng)年,否則“加了個(gè)功能引入兩個(gè)bug”那真是得不償失,更別說如果被植入漏洞埋雷了。

10 不信任記賬者

共識(shí)的流程大致可以抽象為,選出記賬者,記賬者發(fā)布區(qū)塊,其他節(jié)點(diǎn)校驗(yàn)和確認(rèn)。公鏈里記賬可以用“挖礦”的方式進(jìn)行(如比特幣),礦工用大量的算力代價(jià)為它自己的誠(chéng)信背書,又或者是用大量的資產(chǎn)權(quán)益抵押獲得記賬權(quán)(Pos和DPos等共識(shí))。在聯(lián)盟鏈常用的PBFT/Raft等算法里,記賬者列表可以是隨機(jī)或輪換產(chǎn)生,記賬者給出提案,其他投票人多步提交,收集投票。按少數(shù)服從多數(shù)的原則,一般是2/3以上共識(shí)節(jié)點(diǎn)同意,共識(shí)才能達(dá)成。

從系統(tǒng)可用性角度看,記賬者有可能出錯(cuò)、崩潰,或者運(yùn)行緩慢,影響整個(gè)鏈的出塊。又或者記賬者可以只收錄手續(xù)費(fèi)高的交易,拋棄一些交易,導(dǎo)致有些交易總是不能達(dá)成。有的記賬者還可以憑借算力或暗箱運(yùn)作,進(jìn)行“預(yù)挖”或者“扣塊攻擊”,破壞博弈關(guān)系……

記賬者故障或作惡,超越了共識(shí)的安全閾值的話,將直接傷害整條鏈的價(jià)值基礎(chǔ)。根據(jù)不同的記賬模式,記賬者需要設(shè)計(jì)不同的容錯(cuò)、校驗(yàn)、抗欺詐算法,執(zhí)行激勵(lì)和懲罰機(jī)制,在運(yùn)行過程中定期檢查記賬者的健康度,對(duì)于無力記賬或者作惡的記賬節(jié)點(diǎn),全網(wǎng)不接受他們的記賬結(jié)果,并對(duì)其進(jìn)行懲戒,甚至是踢出網(wǎng)絡(luò)。

……

羅列起來還有很多,包括合約、證書、同步等等,每一個(gè)模塊都有自己的功用和風(fēng)險(xiǎn)點(diǎn),簡(jiǎn)直罄竹難書??傊?,區(qū)塊鏈做為分布式的多方協(xié)作的體系,接入了形形色色參與者,整個(gè)體系絕不是單個(gè)開發(fā)者或運(yùn)營(yíng)者所能單點(diǎn)把控,“善意推測(cè)”在這個(gè)領(lǐng)域已經(jīng)不盡適用,整個(gè)世界步步驚心,處處冷箭,只能通過周密的算法和繁雜的流程維系共識(shí)和安全,簡(jiǎn)而言之,沒有經(jīng)過驗(yàn)證的信息,一個(gè)字節(jié)都不能相信。

比起單一環(huán)境里的軟件設(shè)計(jì),區(qū)塊鏈領(lǐng)域的設(shè)計(jì)思路確實(shí)存在顛覆性,開發(fā)者要從“做功能,只容錯(cuò),不防騙”的思維模式里跳出來,帶著“懷疑一切”的態(tài)度進(jìn)行設(shè)計(jì)。

開發(fā)者在面向區(qū)塊鏈領(lǐng)域時(shí),不能只是思考怎么實(shí)現(xiàn)一個(gè)功能,而更要去思考整個(gè)流程會(huì)不會(huì)有出錯(cuò),會(huì)不會(huì)被人篡改數(shù)據(jù)、發(fā)掘漏洞、攻擊系統(tǒng)、欺詐其他參與者。要換位思考自己所實(shí)現(xiàn)的功能,會(huì)被別人用什么方式使用,在不同的環(huán)境會(huì)有什么表現(xiàn),可能造成什么后果。任何收到的信息,任何流程輸入、輸出,都必須經(jīng)過嚴(yán)格地校驗(yàn)才能采信,開發(fā)者能做到這一點(diǎn),才算是打開了區(qū)塊鏈新世界的大門,才能在連續(xù)劇里至少活到第二集。

分布式算法、對(duì)稱非對(duì)稱加密、HASH、證書、安全和隱私等技術(shù)在區(qū)塊鏈領(lǐng)域大行其道,都是為了在保護(hù)信息的同時(shí),給信息加上一層又一層的證明和可驗(yàn)證因子,這使得整個(gè)系統(tǒng)變得復(fù)雜、繁瑣,但這是值得的,因?yàn)檫@樣才能共同驗(yàn)證,構(gòu)建“安全”和“信任”。

以上,寫給準(zhǔn)備跳坑,或已經(jīng)在坑里的程序員。共勉。

責(zé)任編輯:未麗燕 來源: SegmentFault.com
相關(guān)推薦

2022-04-19 14:45:43

區(qū)塊鏈虛擬世界VR

2021-01-15 23:28:50

區(qū)塊鏈開發(fā)數(shù)字化

2018-03-05 07:38:11

2022-10-26 08:42:28

2021-10-05 15:58:03

區(qū)塊鏈保險(xiǎn)技術(shù)

2018-03-04 22:41:04

區(qū)塊鏈互聯(lián)網(wǎng)信息傳遞

2022-06-01 14:38:23

區(qū)塊鏈以太坊運(yùn)營(yíng)商

2020-11-25 13:33:07

區(qū)塊鏈比特幣加密貨幣

2018-05-30 09:54:40

2018-09-19 09:31:56

2021-05-18 10:05:38

區(qū)塊鏈比特幣世界經(jīng)濟(jì)

2022-01-21 14:26:05

區(qū)塊鏈鏈上鏈下

2022-05-09 13:36:27

加密貨幣區(qū)塊鏈區(qū)塊鏈分片

2018-06-14 10:32:25

2019-01-24 15:50:06

區(qū)塊鏈數(shù)字貨幣比特幣

2022-01-24 14:44:06

區(qū)塊鏈跨鏈技術(shù)

2019-01-21 13:14:37

2018-09-10 15:58:49

2018-03-14 10:15:24

區(qū)塊鏈比特幣貨幣

2022-01-26 11:12:20

區(qū)塊鏈金融技術(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)