區(qū)塊鏈的技術(shù)定義
- 區(qū)塊鏈的存儲(chǔ)基于分布式數(shù)據(jù)庫(kù);
- 數(shù)據(jù)庫(kù)是區(qū)塊鏈的數(shù)據(jù)載體,區(qū)塊鏈?zhǔn)墙灰椎臉I(yè)務(wù)邏輯載體;
- 區(qū)塊鏈按時(shí)間序列化區(qū)塊數(shù)據(jù),整個(gè)網(wǎng)絡(luò)有一個(gè)最終確定狀態(tài);
- 區(qū)塊鏈只對(duì)添加有效,對(duì)其他操作無(wú)效;
- 交易基于非對(duì)稱加密的公私鑰驗(yàn)證;
- 區(qū)塊鏈網(wǎng)絡(luò)要求拜占庭將軍容錯(cuò);
- 共識(shí)算法能夠“解決”雙花問(wèn)題。
區(qū)塊鏈的核心技術(shù)組成
P2P 網(wǎng)絡(luò)協(xié)議
一般 P2P 網(wǎng)絡(luò)技術(shù)要解決兩個(gè)主要問(wèn)題,第一是資源定位,第二是資源獲取,其中節(jié)點(diǎn)發(fā)現(xiàn)和局域網(wǎng)穿透是屬于資源定位問(wèn)題,節(jié)點(diǎn)交互協(xié)議是屬于資源獲取問(wèn)題。
網(wǎng)絡(luò)連接
區(qū)塊鏈其實(shí)是基于 TCP/IP 網(wǎng)絡(luò)協(xié)議的,這與 HTTP 協(xié)議、SMTP 協(xié)議是處在同一層,也就是應(yīng)用層。
以 HTTP 協(xié)議為代表的、與服務(wù)端的交互模式在區(qū)塊鏈上被徹底打破了,變更為完全的點(diǎn)對(duì)點(diǎn)拓?fù)浣Y(jié)構(gòu),這也是以太坊提出的 Web3.0 的由來(lái)。
比特幣的 P2P 網(wǎng)絡(luò)是一個(gè)非常復(fù)雜的結(jié)構(gòu),考慮到礦池內(nèi)部的挖礦交互協(xié)議與輕節(jié)點(diǎn)。僅僅討論全節(jié)點(diǎn)這種場(chǎng)景下的 P2P 網(wǎng)絡(luò)發(fā)現(xiàn)與路由。比特幣的 P2P 網(wǎng)絡(luò)基于 TCP 構(gòu)建,主網(wǎng)默認(rèn)通信端口為 8333。
以太坊的 P2P 網(wǎng)絡(luò)則與比特幣不太相同,以太坊 P2P 網(wǎng)絡(luò)是一個(gè)完全加密的網(wǎng)絡(luò),提供 UDP 和 TCP 兩種連接方式,主網(wǎng)默認(rèn) TCP 通信端口是 30303,推薦的 UDP 發(fā)現(xiàn)端口為 30301。
拓?fù)浣Y(jié)構(gòu)
P2P 網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)有很多種,有些是中心化拓?fù)?,有些是半中心化拓?fù)?,有些是全分布式拓?fù)浣Y(jié)構(gòu)。
比特幣全節(jié)點(diǎn)組成的網(wǎng)絡(luò)是一種全分布式的拓?fù)浣Y(jié)構(gòu),節(jié)點(diǎn)與節(jié)點(diǎn)之間的傳輸過(guò)程更接近“泛洪算法”,即:交易從某個(gè)節(jié)點(diǎn)產(chǎn)生,接著廣播到臨近節(jié)點(diǎn),臨近節(jié)點(diǎn)一傳十十傳百,直至傳播到全網(wǎng)。
全節(jié)點(diǎn)與 SPV 簡(jiǎn)化支付驗(yàn)證客戶端之間的交互模式,更接近半中心化的拓?fù)浣Y(jié)構(gòu),也就是 SPV 節(jié)點(diǎn)可以隨機(jī)選擇一個(gè)全節(jié)點(diǎn)進(jìn)行連接,這個(gè)全節(jié)點(diǎn)會(huì)成為 SPV 節(jié)點(diǎn)的代理,幫助 SPV 節(jié)點(diǎn)廣播交易。
節(jié)點(diǎn)發(fā)現(xiàn)
節(jié)點(diǎn)發(fā)現(xiàn)是任何區(qū)塊鏈節(jié)點(diǎn)接入?yún)^(qū)塊鏈 P2P 網(wǎng)絡(luò)的第一步。
初始節(jié)點(diǎn)發(fā)現(xiàn)
在比特幣網(wǎng)絡(luò)中,初始節(jié)點(diǎn)發(fā)現(xiàn)一共有兩種方式。
第一種叫做 DNS-seed,又稱 DNS 種子節(jié)點(diǎn),DNS 就是中心化域名查詢服務(wù),比特幣的社區(qū)維護(hù)者會(huì)維護(hù)一些域名。
第二種方式就是,代碼中硬編碼( hard-code )了一些地址,這些地址我們稱之為種子節(jié)點(diǎn)(seed-node),當(dāng)基于DNS的種子節(jié)點(diǎn)全部失效時(shí),會(huì)嘗試連接hard-code的種子節(jié)點(diǎn)。
啟動(dòng)后節(jié)點(diǎn)發(fā)現(xiàn)
在 Bitcoin 的網(wǎng)絡(luò)中,一個(gè)節(jié)點(diǎn)可以將自己維護(hù)的對(duì)等節(jié)點(diǎn)列表 (peer list) 發(fā)送給臨近節(jié)點(diǎn),所以在初始節(jié)點(diǎn)發(fā)現(xiàn)之后,你的節(jié)點(diǎn)要做的第一件事情就是向?qū)Ψ揭斜?/p>
所以在每次需要發(fā)送協(xié)議消息的時(shí)候,它會(huì)花費(fèi)固定的時(shí)間嘗試和已存的節(jié)點(diǎn)列表中的節(jié)點(diǎn)建立鏈接,如果有任何一個(gè)節(jié)點(diǎn)在超時(shí)之前可以連接上,就不用去 DNS seed 獲取地址,一般來(lái)說(shuō),這種可能性很小,尤其是全節(jié)點(diǎn)數(shù)目非常多的情況下。
在以太坊網(wǎng)絡(luò)中,也會(huì)維護(hù)類似的一個(gè)節(jié)點(diǎn)列表 (NodeTable),但是這個(gè)節(jié)點(diǎn)列表與比特幣的簡(jiǎn)單維護(hù)不同,它采用了 P2P 網(wǎng)絡(luò)協(xié)議中一個(gè)成熟的算法,叫做 Kademlia 網(wǎng)絡(luò),簡(jiǎn)稱 KAD 網(wǎng)絡(luò)。
它使用了 DHT 來(lái)定位資源,全稱 Distributed Hash Table,中文名為分布式哈希表。KAD 網(wǎng)絡(luò)會(huì)維護(hù)一個(gè)路由表,用于快速定位目標(biāo)節(jié)點(diǎn)。由于 KAD 網(wǎng)絡(luò)基于 UDP 通信協(xié)議,所以以太坊節(jié)點(diǎn)的節(jié)點(diǎn)發(fā)現(xiàn)是基于 UDP 的,如果找到節(jié)點(diǎn)以后,數(shù)據(jù)交互又會(huì)切換到 TCP 協(xié)議上。
黑名單與長(zhǎng)連接
公有區(qū)塊鏈面臨的網(wǎng)絡(luò)環(huán)境是非常開放的,任何人只要下載好錢包,打開運(yùn)行就進(jìn)入了這個(gè) P2P 網(wǎng)絡(luò),這也會(huì)帶來(lái)被攻擊的可能。
所以在比特幣的代碼中,會(huì)有一段去控制邏輯,你可以手動(dòng)將你認(rèn)為可疑的節(jié)點(diǎn)移除并加入禁止列表,同時(shí)去配置可信的節(jié)點(diǎn)。當(dāng)然,以上并不屬于客戶端的標(biāo)準(zhǔn)協(xié)議的一部分,任何人都可以實(shí)現(xiàn)屬于自己的 P2P 網(wǎng)絡(luò)層。
以太坊上有針對(duì)賬戶進(jìn)行的黑名單處理,但是這屬于業(yè)務(wù)層。
局域網(wǎng)穿透
當(dāng)你在局域網(wǎng)運(yùn)行一個(gè)區(qū)塊鏈節(jié)點(diǎn),在公網(wǎng)是發(fā)現(xiàn)不了的,公網(wǎng)上的節(jié)點(diǎn)只能被動(dòng)接受連接,并不能主動(dòng)發(fā)起連接
NAT 技術(shù)非常常見,這里使用的是源 NAT,簡(jiǎn)而言之就是替換 TCP 報(bào)文中的源地址并映射到內(nèi)網(wǎng)地址。
UPnP 是通用即插即用(Universal Plug and Play)的縮寫,它主要用于設(shè)備的智能互聯(lián)互通,所有在網(wǎng)絡(luò)上的設(shè)備馬上就能知道有新設(shè)備加入。
這些設(shè)備彼此之間能互相通信,更能直接使用或者控制它,一切都不需要人工設(shè)置。
比特幣和以太坊均使用了 UPnP 協(xié)議作為局域網(wǎng)穿透工具,只要局域網(wǎng)中的路由設(shè)備支持 NAT 網(wǎng)關(guān)功能、支持 UPnP 協(xié)議,即可將你的區(qū)塊鏈節(jié)點(diǎn)自動(dòng)映射到公網(wǎng)上。
節(jié)點(diǎn)交互協(xié)議
一旦節(jié)點(diǎn)建立連接以后,節(jié)點(diǎn)之間的交互是遵循一些特定的命令,這些命令寫在消息的頭部,消息體寫的則是消息內(nèi)容。
命令分為兩種,一種是請(qǐng)求命令,一種是數(shù)據(jù)交互命令。
節(jié)點(diǎn)連接完成要做的第一件事情叫做握手操作。這一點(diǎn)在比特幣和以太坊上的流程是差不多的,就是相互問(wèn)候一下,提供一些簡(jiǎn)要信息。
比如先交換一下版本號(hào),看看是否兼容。只是以太坊為握手過(guò)程提供了對(duì)稱加密,而比特幣沒有。
握手完畢之后,無(wú)論交互什么信息,都是需要保持長(zhǎng)連接的,在比特幣上有 PING/PONG 這兩種類型的消息,這很明顯就是用于保持節(jié)點(diǎn)之間長(zhǎng)連接的心跳而設(shè)計(jì)的;而在以太坊的設(shè)計(jì)中,將 PING/PONG 協(xié)議移到了節(jié)點(diǎn)發(fā)現(xiàn)的過(guò)程中。
請(qǐng)求命令一般分為發(fā)起者請(qǐng)求,比如比特幣中的 getaddr 命令是為了獲取對(duì)方的可用節(jié)點(diǎn)列表,inv 命令則提供了數(shù)據(jù)傳輸,消息體中會(huì)包含一個(gè)數(shù)據(jù)向量。
區(qū)塊鏈最重要的功能就是同步區(qū)塊鏈,而同步區(qū)塊恰巧是最考驗(yàn) P2P 網(wǎng)絡(luò)能力的。區(qū)塊同步方式分為兩種,第一種叫做 HeaderFirst,它提供了區(qū)塊頭先同步,同步完成以后再?gòu)钠渌?jié)點(diǎn)獲得區(qū)塊體。
第二種叫做 BlockFirst,這種區(qū)塊同步的方式比較簡(jiǎn)單粗暴,就是從其他節(jié)點(diǎn)獲取區(qū)塊必須是完整的。第一種方案提供了較好的交互過(guò)程,減輕了網(wǎng)絡(luò)負(fù)擔(dān)。這兩種同步方式會(huì)直接體現(xiàn)在節(jié)點(diǎn)交互協(xié)議上,他們使用的命令邏輯完全不同。
共識(shí)算法與分布式一致性算法
經(jīng)典的分布式一致性算法
經(jīng)典分布式一致性算法有 Raft 協(xié)議,Raft 協(xié)議是一種強(qiáng) Leader 的一致性算法,它的吞吐量基本就是 Leader 的吞吐量,它無(wú)法抵御節(jié)點(diǎn)惡意篡改數(shù)據(jù)的攻擊。
稍微復(fù)雜一點(diǎn)的就是 Paxos 協(xié)議,Paxos 能提供不同場(chǎng)合不同種類的一致性算法,所以 Paxos 有很多變種,經(jīng)典 Paxos 是 Leaderless 的,有變種是強(qiáng) Leader 型的,叫做 Fast Paxos
以上兩種都是不提供拜占庭容錯(cuò)的系統(tǒng)
PBFT 全稱實(shí)用性拜占庭容錯(cuò)系統(tǒng)(Practical Byzantine Fault Tolerance, PBFT),PBFT 是一種狀態(tài)機(jī),要求所有節(jié)點(diǎn)共同維護(hù)一個(gè)狀態(tài),所有節(jié)點(diǎn)采取的行動(dòng)一致,PBFT 非常適合聯(lián)盟鏈等對(duì)性能具有較高要求的場(chǎng)合,超級(jí)賬本項(xiàng)目中的 Fabric 框架默認(rèn)采用的就是 PBFT 的修改版本。
區(qū)塊鏈共識(shí)算法
區(qū)塊鏈的共識(shí)算法,在某些場(chǎng)合直接稱作基于經(jīng)濟(jì)學(xué)的博弈算法,以區(qū)別于經(jīng)典分布式一致性算法思路,它的整體思路就是讓攻擊者的攻擊成本遠(yuǎn)遠(yuǎn)大于收益。
區(qū)塊鏈中的共識(shí)算法目前具有工業(yè)成熟度的是 PoW,另外兩種比較成熟的是 PoS 和 DPoS,其次還有一些變種和單一幣種使用的共識(shí)算法,例如 Ripple 共識(shí)、PoC 共識(shí)(概念性證明)、PoE 共識(shí)(存在性證明)。
在使用 PoW 共識(shí)算法的情況下,容錯(cuò)閾值是 50%,而 PBFT 及其變種的容錯(cuò)閾值是 33% 左右,這里的百分比是指作弊節(jié)點(diǎn)占全網(wǎng)節(jié)點(diǎn)的比例。
PoX 類的算法其實(shí)都延續(xù)了 PoW 的設(shè)計(jì)理念,相比較經(jīng)典分布式一致性算法,PoX 類算法通過(guò)概率選擇記賬者降低了潛在的提案者,另外是延長(zhǎng)了達(dá)成最終一致性的時(shí)間。
第一條降低了系統(tǒng)通信復(fù)雜度,每次記賬系統(tǒng)的確定性其實(shí)是概率確定的,又由于被選中需要付出成本,此處才提高了記賬成本閾值,結(jié)合區(qū)塊鏈的基礎(chǔ)代幣設(shè)計(jì),是一個(gè)非常天才的想法。
PoW共識(shí)
PoW 全稱 Proof of Work,中文名是工作量證明,PoW 共識(shí)機(jī)制其實(shí)是一種設(shè)計(jì)思路,而不是一種具體的實(shí)現(xiàn)。
PoW 的核心設(shè)計(jì)思路是提出一個(gè)計(jì)算難題,但是這個(gè)難題答案的驗(yàn)證過(guò)程是非常容易的,這種特性我們稱之為計(jì)算不對(duì)稱特性
PoW 挖礦算法大致分為兩個(gè)大類,第一類叫做計(jì)算困難,第二類叫內(nèi)存困難。
從理論上來(lái)看,PoW 會(huì)一直有 51% 算力攻擊的問(wèn)題,即攻擊者只需要購(gòu)買超過(guò)全網(wǎng) 51% 算力設(shè)備,即可發(fā)起“雙花攻擊”,甚至“重放攻擊”等多種高收益攻擊,這個(gè)問(wèn)題目前沒有解決方案。
除了 51% 攻擊,PoW 共識(shí)還有自私挖礦的問(wèn)題,自私挖礦是一種特殊的攻擊類型,不會(huì)影響區(qū)塊鏈正常運(yùn)轉(zhuǎn),但是會(huì)形成礦霸,間接造成 51% 攻擊
PoW 挖礦的基本邏輯和步驟Hash (block_header) < Target所有礦工的目標(biāo)值是一樣的,只要計(jì)算結(jié)果哈希小于目標(biāo)值即可
PoS共識(shí)機(jī)制
PoS 全稱是 Proof of Stake,中文翻譯為權(quán)益證明
CoinAge,字面意思就是幣數(shù)量乘以天數(shù)
PoS 則將計(jì)算能力更換為財(cái)產(chǎn)證明,就是節(jié)點(diǎn)所擁有的幣齡越多,獲得的記賬的概率就越大。這有點(diǎn)像公司的股權(quán)結(jié)構(gòu),股權(quán)占比大的合伙人話語(yǔ)權(quán)越重。
PoS 系統(tǒng)中,這個(gè)公式變更為Hash (block_header) < Target * CoinAge多引入了一個(gè)變量叫做 CoinAge,也就是幣齡,這個(gè)變量為會(huì)造成每個(gè)礦工看到的目標(biāo)值不一樣,如果你的幣齡越大,也就意味著你的獲得答案越容易。這里的 Target 與 PoW 一致,與全網(wǎng)難度成反比,用來(lái)控制出塊速度的。
PoS 似乎完美地解決了 PoW 挖礦資源浪費(fèi)的問(wèn)題,甚至還順帶解決了 51% 攻擊的問(wèn)題(如果挖礦者發(fā)起 51% 攻擊,就需要擁有全網(wǎng) 51% 的幣或幣齡,這幾乎不可能辦到,即使你成功地實(shí)施了 51% 攻擊,那么也意味著作為全網(wǎng)最大的持幣大戶的你,損失也會(huì)最大)
PoS 遇到的第一個(gè)問(wèn)題就是幣發(fā)行的問(wèn)題。一開始的時(shí)候,只有創(chuàng)始區(qū)塊上有幣,意味著只有這一個(gè)節(jié)點(diǎn)可以挖礦,所以讓幣分散出去才能讓整個(gè)網(wǎng)絡(luò)壯大,那么如何分散出去又是另外一個(gè)難題了。早期 PoS 幣種基本都采用了分階段挖礦,即第一階段是 PoW 挖礦,到第二階段才是 PoS 挖礦。隨著 ERC20 類型的標(biāo)準(zhǔn)合約代幣的出現(xiàn),這個(gè)問(wèn)題被解決了,不再需要第一階段改成 PoW,也可以將代幣分散出去。
第二個(gè)問(wèn)題是由于幣齡是與時(shí)間掛鉤的,這也意味著用戶可以無(wú)限囤積一定的幣,等過(guò)了很久再一次性挖礦發(fā)起攻擊;所以解決方案是:PoS 機(jī)制需要引入一個(gè)時(shí)間上限來(lái)控制時(shí)間因素的自然增長(zhǎng)。
第三個(gè)問(wèn)題是雖然引入了時(shí)間上下限,用戶還是傾向于囤積代幣,這會(huì)造成幣流通的不充分;基于此,所以瑞迪幣引入了幣齡按時(shí)間衰減,構(gòu)造了權(quán)益速度證明,鼓勵(lì)用戶流動(dòng)代幣,而不是傾向于囤積代幣。
第四個(gè)問(wèn)題是離線攻擊,即使引入了時(shí)間上下限,時(shí)間仍然是自然流動(dòng)的,也就是可以不需要求挖礦節(jié)點(diǎn)長(zhǎng)時(shí)間在線。挖礦是可以離線的,這簡(jiǎn)直是災(zāi)難,所以任意一個(gè) PoS 機(jī)制的實(shí)踐形式都必須避免這個(gè)問(wèn)題,因?yàn)榫W(wǎng)絡(luò)節(jié)點(diǎn)數(shù)量的多少直接關(guān)系到區(qū)塊鏈網(wǎng)絡(luò)的健壯性。
無(wú)成本利益問(wèn)題無(wú)論以幣齡還是幣數(shù)量作為 PoS 的參數(shù),都無(wú)法避免,這也就意味著分叉非常方便。
由于以太坊部分采用了 PoS 共識(shí),它的名字叫做 Casper,它必須解決上述無(wú)成本利益問(wèn)題攻擊。所以 Casper 協(xié)議要求PoS 礦工需通過(guò)抵押保證金的方法對(duì)共識(shí)結(jié)果進(jìn)行下注
DPoS共識(shí)機(jī)制
DPoS 全稱是 Delegated Proof of Stake,中文翻譯過(guò)來(lái)是代理權(quán)益證明。
DPoS 與其他共識(shí)機(jī)制的第一個(gè)區(qū)別,就是交易確認(rèn)時(shí)間短
DPoS 共識(shí)算法就是將 PoS 共識(shí)算法中的記賬者轉(zhuǎn)換為指定節(jié)點(diǎn)數(shù)組成的小圈子,而不是所有人都可以參與記賬,這個(gè)圈子可能是 21 個(gè)節(jié)點(diǎn),也有可能是 101 個(gè)節(jié)點(diǎn),這一點(diǎn)取決于設(shè)計(jì),只有這個(gè)圈子中的節(jié)點(diǎn)才能獲得記賬權(quán)。這將極大地提高系統(tǒng)的吞吐量,因?yàn)楦俚墓?jié)點(diǎn)也就意味著網(wǎng)絡(luò)和節(jié)點(diǎn)的可控。
TPS = transactions / block_time
TPS 表示區(qū)塊鏈每秒能確認(rèn)的交易數(shù), transactions 是由區(qū)塊大小 block_size 和平均每筆交易大小決定的,而區(qū)塊大小受全網(wǎng)網(wǎng)絡(luò)狀態(tài) network_bandwidth 限制,也是由記賬節(jié)點(diǎn)之間物理帶寬 witness_performance 決定的。
記賬節(jié)點(diǎn)的個(gè)數(shù) witness_count 直接決定了物理帶寬的上限,因?yàn)橛涃~節(jié)點(diǎn)數(shù)量越多,則對(duì)物理帶寬要求越高,對(duì)網(wǎng)絡(luò)的穩(wěn)定性要求也越高。
公式變成了下面的樣子
TPS = (block_size *network_bandwidth* witness_performance) /
(block_time * witness_count)
要提高 TPS,可以提升分子項(xiàng),降低分母項(xiàng),也就是增大區(qū)塊大小 block_size、提升記賬節(jié)點(diǎn)網(wǎng)絡(luò)帶寬 network_bandwidth、提升記賬節(jié)點(diǎn)處理性能 witness_performance,減小區(qū)塊時(shí)間 block_time、減小記賬節(jié)點(diǎn)數(shù)量 witness_count。
分子項(xiàng)基本受限于物理資源的上限,目前工業(yè)水平制造的物理資源的使用上限基本就是整個(gè)項(xiàng)的上限了,所以可操作性不大。
而分母項(xiàng)是由共識(shí)算法決定的,所以從區(qū)塊時(shí)間,以及記賬節(jié)點(diǎn)數(shù)入手,DPoS 算法便正是從這兩項(xiàng)著手的。
首先改動(dòng)的便是限制記賬節(jié)點(diǎn)的數(shù)量,也就是見證人的數(shù)量。
在 PoW 和 PoS 中可以看到,成為記賬節(jié)點(diǎn)是無(wú)需門檻的,你可以隨時(shí)參與挖礦,隨時(shí)退出。
那這會(huì)帶來(lái)什么問(wèn)題呢,首先無(wú)法確定記賬節(jié)點(diǎn)的數(shù)量,其次無(wú)法確定記賬節(jié)點(diǎn)之間的網(wǎng)絡(luò)環(huán)境,記賬節(jié)點(diǎn)數(shù)越多網(wǎng)絡(luò)環(huán)境越復(fù)雜,這些不確定性會(huì)增大網(wǎng)絡(luò)分區(qū)的概率,從而導(dǎo)致區(qū)塊鏈分叉。
如果我們事先規(guī)定好記賬節(jié)點(diǎn)的數(shù)量,接著讓全網(wǎng)所有節(jié)點(diǎn)可以投票決定哪些節(jié)點(diǎn)可以成為記賬節(jié)點(diǎn),這樣就限制并減小了分母項(xiàng) witness_count,這個(gè)過(guò)程稱作投票選舉。
因?yàn)橛涃~節(jié)點(diǎn)數(shù)量不多,那么可以在共識(shí)算法中可以規(guī)定出塊時(shí)間為一個(gè)固定值,這個(gè)值可以很小,通過(guò)輪流出塊的方式來(lái)進(jìn)行記賬。
DPoS 算法確立兩個(gè)原則:
- 投票選舉過(guò)程一定要保證最大權(quán)益所有者最終能控制全網(wǎng),因?yàn)橐坏┏隽藛?wèn)題,他們的損失最大
- 與 PoW、PoS 一樣,所有節(jié)點(diǎn)僅承認(rèn)“最長(zhǎng)”鏈
DPoS 是社區(qū)治理加上共識(shí)算法,不再是單純的技術(shù)共識(shí),這是與 PoW、PoS 算法最大的不同。
DPoS 的基本假設(shè)是相信節(jié)點(diǎn)是好的,所以盡可能快速選擇記賬節(jié)點(diǎn),而把問(wèn)題發(fā)生后的修復(fù)過(guò)程推遲到投票中,可以說(shuō) DPoS 并不考慮拜占庭容錯(cuò)問(wèn)題,把拜占庭容錯(cuò)推給了社區(qū)治理,而在社區(qū)治理上可歸納為一切皆投票。
加密簽名算法
哈希算法
哈希算法具有下面的 4 種特性。
- **原像不可逆。**原像不可逆是指對(duì)于任意給定的 h,都無(wú)法依據(jù) h 自身的信息推導(dǎo)出 z。
- **難題友好性。**難題友好性通俗的理解就是如果要得到難題答案,你只能暴力枚舉,沒有比這更好的方法。在 h = HASH( X | z ) 中,從 h 無(wú)法推導(dǎo)出 z,只能不斷地計(jì)算嘗試,那么 z 所在的數(shù)值集合構(gòu)成了 X,X 的大小是哈希算法的安全因子之一。
- **發(fā)散性。**發(fā)散性是指對(duì)于任意的 z,即使我們只改動(dòng)非常少的信息量,例如改動(dòng) 1 個(gè)比特位生成 z’,那么 HASH(z) 與 HASH(z’) 就是兩個(gè)大相徑庭的結(jié)果,完全不相似。
- **抗碰撞性。**抗碰撞性是指對(duì)于任意兩個(gè)不相同的 z,那么他們對(duì)應(yīng)的 h 值也不同。如果對(duì)于任意的 y 不等于 z,則 HASH(y) 不等于 HASH(z);滿足上述定義哈希特性的算法,我們也稱作具有嚴(yán)格抗碰撞性。如果我們?nèi)我饨o定一個(gè) z,你都無(wú)法找到另外一個(gè) z’,使得其值也等于 h,滿足這樣的哈希特性的算法就有弱抗碰撞性。
目前流行的 Hash 算法包括了 MD5、SHA-1 和 SHA-2,其中 MD5 被證明不具有強(qiáng)抗碰撞性。SHA (Secure Hash Algorithm)是一個(gè) Hash 函數(shù)族,分為 SHA-1、SHA-2、SHA-3,代表了三代哈希標(biāo)準(zhǔn),目前使用比較多的是 SHA-2 系列。
第一代的 SHA-1 基于 MD4 設(shè)計(jì),并且模仿了該算法,SHA-1 已被證明了不具備“強(qiáng)抗碰撞性”,所以安全性不夠高。
為了提高安全性,第二代 SHA-2 一共包含了 SHA-224、SHA-256、SHA-384,和 SHA-512 算法(統(tǒng)稱為 SHA-2),它們跟 SHA-1 算法原理類似。SHA-3 相關(guān)算法也已被提出,它的出現(xiàn)并不是要取代 SHA-2,因?yàn)?SHA-2 目前并沒有出現(xiàn)明顯的弱點(diǎn)。
由于對(duì) MD5、和 SHA-1 出現(xiàn)成功的破解,我們需要一個(gè)不同與之前算法,可替換的加密散列算法,也就是現(xiàn)在的 SHA-3。
哈希算法的一個(gè)重要應(yīng)用是默克爾樹(Merkle tree),默克爾樹是一種數(shù)據(jù)結(jié)構(gòu),通常是一個(gè)二叉樹,也有可能是多叉樹,它以特定的方式逐層向上計(jì)算,直到頂部,最頂層叫做默克爾根,默克爾樹最為常見和最簡(jiǎn)單的是二叉默克爾樹。
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-OMoBMpZs-1680955391619)(null)]
非對(duì)稱加密算法
對(duì)稱密鑰要求加解密過(guò)程均使用相同的密鑰,而非對(duì)稱加密可以提供一對(duì)鑰匙,私鑰自己保管,公鑰可以公開。
常見的對(duì)稱加密算法有 DES、3DES、AES、IDEA, 常見的非對(duì)稱加密算法有 RSA、ECC 等。
在非對(duì)稱算法中,私鑰一般是通過(guò)一個(gè)隨機(jī)數(shù)產(chǎn)生的,這個(gè)隨機(jī)數(shù)我們也叫做種子,從這個(gè)角度來(lái)說(shuō),知道了這個(gè)隨機(jī)數(shù)也就等于知道了私鑰,不過(guò)私鑰的產(chǎn)生范圍非常大,在比特幣中是 2 的 256 次方,差不多在 10 的 70 方數(shù)量級(jí)上。
如果你產(chǎn)生隨機(jī)數(shù)的算法足夠均勻分布,私鑰碰撞的可能性比中了 1 億大獎(jiǎng)同時(shí)被雷劈中的概率還要小數(shù)億倍。所以區(qū)塊鏈對(duì)產(chǎn)生隨機(jī)數(shù)的算法要求比較高,它要求真實(shí)的均勻隨機(jī)分布,而不是計(jì)算機(jī)偽隨機(jī)數(shù)。
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-YFkDnszM-1680955391649)(null)]
從私鑰到公鑰,是由非對(duì)稱加密算法保證的,這種算法在比特幣中選擇的是 ECDSA 算法,ECDSA 算法中選擇的橢圓曲線名為 secp256k1。
而從公鑰到地址,是由哈希算法保證的,在這一步使用了 SHA256 和 RIPEMD160。橢圓曲線加密算法 ECC 利用了“尋找離散對(duì)數(shù)”的難解性提供了單向不可逆性
在區(qū)塊鏈上,一個(gè)比特幣交易的產(chǎn)生由兩部分組成,第一部分是簽名加鎖,對(duì)應(yīng)到的是交易的輸出、第二部分是解鎖花費(fèi),對(duì)應(yīng)到的是交易的輸入,當(dāng)我們構(gòu)造一筆交易的時(shí)候必然會(huì)用到私鑰,這是所有數(shù)字貨幣資產(chǎn)控制權(quán)由私鑰保證的根本原因。
賬戶與交易模型
普通賬戶模型
當(dāng)前余額是記錄在某個(gè)地方的,只需要讀出來(lái)即可,這種設(shè)計(jì)我們叫做賬戶余額模型
普通賬戶模型具有自定義數(shù)據(jù)類型的優(yōu)點(diǎn),但是卻需要自己設(shè)計(jì)事務(wù)機(jī)制
UTXO 模型
UTXO 全稱是:“Unspent Transaction Output”,這指的是:未花費(fèi)的交易輸出。這里面三個(gè)單詞分別表示 “未花費(fèi)的”“交易”“輸出”
UTXO 的核心設(shè)計(jì)思路是無(wú)狀態(tài),它記錄的是交易事件,而不記錄最終狀態(tài),也就是說(shuō)只記錄變更事件,用戶需要根據(jù)歷史記錄自行計(jì)算余額。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-638237.html
輸入和輸出組成了交易,輸入和輸入需要滿足一些約束條件:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-638237.html
- 任意一個(gè)交易必須至少一個(gè)輸入、一個(gè)輸出;
- 輸入必須全部移動(dòng),不能只使用部分,所以才產(chǎn)生了第二個(gè)輸出指向村長(zhǎng)自己;
要自己設(shè)計(jì)事務(wù)機(jī)制
UTXO 模型
UTXO 全稱是:“Unspent Transaction Output”,這指的是:未花費(fèi)的交易輸出。這里面三個(gè)單詞分別表示 “未花費(fèi)的”“交易”“輸出”
UTXO 的核心設(shè)計(jì)思路是無(wú)狀態(tài),它記錄的是交易事件,而不記錄最終狀態(tài),也就是說(shuō)只記錄變更事件,用戶需要根據(jù)歷史記錄自行計(jì)算余額。
輸入和輸出組成了交易,輸入和輸入需要滿足一些約束條件:
- 任意一個(gè)交易必須至少一個(gè)輸入、一個(gè)輸出;
- 輸入必須全部移動(dòng),不能只使用部分,所以才產(chǎn)生了第二個(gè)輸出指向村長(zhǎng)自己;
- 輸入金額 = 輸出金額之和 + 交易手續(xù)費(fèi),這里必須是等式。
到了這里,關(guān)于區(qū)塊鏈的技術(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!