A. 以太坊解讀——Recursive Length Prefix協議圖解(上)
在以太坊中,採用了一種名為Recursive Length Prefix(RLP)的方法對交易、賬號、合約等基礎的數據結構進行序列化處理,從而實現對鏈上數據的網路傳輸和持久化存儲。RLP作為最為底層的編碼方法,其重要性是不言而喻。因此,網上介紹RLP的文章也不少,但是由於RLP是二進制編碼,又涉及到嵌套結構,造成編碼過程的可讀性較差,在學習中過程中,也一直沒有找到完整的、易於理解的說明,總是繞在各種規則之中,且不能"自拔",著實有點無奈。所以,在本文中,採用圖形化的解釋和舉例的方法,幫助大家理解RLP嵌套等特點、編解碼過程等。
和其他的序列化協議不同,RLP只支持兩種數據類型:
1)byte數組,可以是二進制數組,當然也可以是字元串;
2)byte數組的數組,也就是列表。並支持列表內的嵌套。
對於其他的數據類型,RLP都不支持,需要用戶自己先轉化為數組和列表的類型。
從RLP的命名中就可以看出兩個關鍵字:一個是遞歸Recursive和前綴Prefix。首先,關於遞歸,也就是嵌套結構,結構上非常接近「樹」,在Ethereum WiKi中,更是直接地採用樹的items來進行命名,葉子節點(leaf tress)來存儲「byte數組」,嵌套的節點就是一個樹的分叉(branching trees)。
比如,需要是對如下對象進行RLP的編碼,該對象中包含一個字元數組的列表、一個單個字元的字元數組、一個空字元數組。
< <[cat],[dog]>, [0xbf], [] >
將該對象展開為樹的結構,就如下圖。其中[0xbf]和[]屬於字元數組。<[cat], [dog]>屬於列表,可以嵌套展開,再根據各個節點,進行編碼。然後,對於不同長度的數組和列表,編碼的方法略有不同,這個也就是Length Prefix相關的內容,和「編碼過程」相關的內容,在第二節進行詳細地說明。
關於為什麼以太坊需要單獨設計一種序列化協議,目前還沒有找到官方的描述。但與其他序列化方法相比,RLP協議具有一些直接的優點,比如:
1)在以太坊中,最小貨幣單位為1 Wei,並且1 ETH = 10^18 Wei,所以在編碼中,需要考慮對很大的整數類型的序列化,在RLP中採用去除前導零(leading zero)的大端big-endian方式,可以有效處理大整數;
2)使用了靈活的長度前綴來表示數據的實際長度,並且使用遞歸的方式能編碼相當大的數據;
3)為了實現在鏈上節點的「共識Consensus」,防止出現數據的不一致,以太坊中並不支持浮點數類型,所以一般的序列化協議也不適用。
編碼的過程就是將嵌套結構(nested sequence)的樹形結構,添加長度前綴(Length Prefix)後,轉化為順序結構(flat sequence)的過程。添加長度前綴的目的,就是在反序列化時,可以根據長度前綴(Length Prefix),將(flat sequence)重構出樹的結構(nested sequence)。
關於前綴的生成規則,《Ethereum Yellow Paper》[2]給出了非常形式化的數學符號描述,漂亮是非常漂亮,可惜不是人類的語言,非常難於理解和表達。網上大部分文章的寫法也是引用了Yellow Paper中的5個文字形式上的描述,把原文和翻譯一並給出如下:
將上面這個「長度」Length Prefix的編碼規則,通過「決策樹」可以圖形化的表達如下圖。
首先,根據編碼的類型,進行分類,分為「位元組數組」和「列表」兩類;第二,根據不同的長度,編碼的長度前綴不同。若待編碼對象的長度小於56,就是把長度和「前綴字元」進行求和,佔用一個位元組。反之,待編碼對象的長度大於56,其前綴需要多個位元組,第一個位元組,求出「長度」所佔的位元組數,再加上「前綴字元」,比如:長度為56,佔用1位元組。然後對「長度」進行編碼,其實也是一個嵌套的過程。
還是以上文中的例子,該編碼對象,已經完成了「樹的構建」,然後根據「長度前綴」的原則,對樹的各個項目進行長度前綴的計算。
< <[cat],[dog]>, [0xbf], [] >
-對於<[cat],[dog]>屬於嵌套數組,需要對內部各項非常進行長度編碼的計算
`對於[cat],屬於字元數組,且長度為3,其對應的長度為0x80+3 = 0x83
`對於[dog],屬於字元數組,且長度為3,其對應的長度為0x80+3 = 0x83
`<[cat],[dog]>整體上,其長度前綴為0xc0 + 2(新增的兩個子項的長度所佔用的位元組)+6(待編碼字元的長度)=0xC8
- 對於[0xbf], 屬於字元數組,且長度為1,其對應的長度為0x80+1 = 0x81
- 對於[dog],屬於字元數組,且長度為3,其對應的長度為0x80+3 = 0x83
- 對於[],屬於字元數組,且長度為0,其對應的長度為0x80+0=0x80
總體上,增加的「長度編碼」的位元組數為6,加上原來的長度為10,所以整個對象的長度前綴為0xC0+16d=0xD0。所以最後的編碼結果為:
D0 C8 83636174 83646F67 81B7 83646F67 80
解碼過程將在 《以太坊解讀——Recursive Length Prefix協議圖解(下)》 一文中,給出圖形化的解讀說明。
B. 區塊鏈的六層模型是什麼
區塊鏈總共有六個層級結構,這六個層級結構自下而上是:數據層、網路層、共識層、激勵層、合約層、應用層。
一、數據層
數據層是區塊鏈六個層級結構裡面的最底層。數據層我們可以理解成資料庫,只不過對於區塊鏈來講,這個資料庫是不可篡改的、分布式的資料庫,也就是我們所謂的「分布式賬本」。
在數據層上,也就是在這個「分布式賬本」上,存放著區塊鏈上的數據信息,封裝著區塊的塊鏈式結構、非對稱加密技術、哈希演算法等技術手段,來保證數據在全網公開的情況下的安全性問題。具體的做法是:
在區塊鏈網路上,節點採用共識演算法來維持數據層(也就是這個分布式資料庫)的數據的一致性,採用密碼學中的非對稱加密和哈希演算法,來確保這個分布式資料庫的不可篡改和可追溯。
這就構成了區塊鏈技術中最底層的數據結構。但是,光有分布式資料庫還不夠,還需要讓資料庫裡面的數據信息可以共享交流,下面我們介紹數據層的上一層——網路層。
二、網路層
區塊鏈的網路系統,本質上是一個P2P(點對點)網路,點對點意味著不需要一個中間環節或者中心化伺服器來操控這個系統,網路中的所有資源和服務都是分配在各個節點手中的,信息的傳輸也是兩個節點之間直接往來就可以了。不過,需要注意的是,P2P
(點對點)並不是中本聰發明的,區塊鏈只是融合了這一技術而已。
所以,區塊鏈的網路層實際上就是一個特別強大的點對點網路系統。在這個系統上,每一個節點既可以生產信息,也可以接收信息,就好比發郵件,你既可以編寫自己的郵件,也可以收到別人給你發送的郵件。
在區塊鏈網路上,節點之間需要共同維護這條區塊鏈系統,每當一個節點創造出新的區塊後,他需要以廣播的形式通知其他節點,其他節點收到信息後對該區塊進行驗證,然後在該區塊的基礎上去創建新的區塊。這樣一來,全網便可以共同維護更新區塊鏈系統這個總賬本了。
但是,全網要依據什麼規則來維護更新區塊鏈系統這個總賬本呢,這就涉及到了所謂的「法律法規」(規則),也就是我們接下來要介紹的:共識層。
三、共識層
在區塊鏈的世界裡,共識,簡單來講就是全網要依據一個統一的、大家一致同意的規則來維護更新區塊鏈系統這個總賬本,類似於更新數據的規則。讓高度分散的節點在去中心化的區塊鏈網路中高效達成共識,是區塊鏈的核心技術之一,也是區塊鏈社區的治理機制。
目前主流的共識機制演算法有:比特幣的工作量證明(POW)、以太坊的權益證明
(POS)、EOS的委託權益證明(DPOS)等等。
我們現在介紹了數據層、網路層、共識層,這三層保證了區塊鏈上有數據、有網路,有在網路上更新數據的規則,但是天下沒有免費的午餐,如何讓節點們能夠積極踴躍地參與區塊鏈系統維護呢,這里就涉及到了激勵,也就是我們下面要介紹的:激勵層。
四、激勵層
激勵層就是所謂的挖礦機制,挖礦機制其實可以理解成激勵機制:你為區塊鏈系統做了多少貢獻,你就可以得到多少獎勵。用這種激勵機制,能夠鼓勵全網節點參與區塊鏈上的數據記錄與維護工作。
挖礦機制和共識機制其實是一個道理,共識機制我們可以理解為公司的總規章制度,而挖礦機制可以理解成,在這個總的規章制度之中,你做好了什麼能夠得到什麼獎勵,這種獎勵規則。
就好比比特幣的共識機制PoW,它的規定是多勞多得,誰能夠第一個找到正確哈希值誰就可以得到一定數量的比特幣獎勵;
而以太坊的PoS則規定了誰持幣年齡越久,誰能得到獎勵的概率就越大。
需要注意的是,激勵層一般只有公有鏈才具備,因為公有鏈必須依賴全網節點共同維護數據,所以必須有一套這樣的激勵機制,才能激勵全網節點參與區塊鏈系統的建設維護,進而保證區塊鏈系統的安全性和可靠性。
區塊鏈安全可靠了,還不夠智能對不對,下面我們將要介紹的合約層,可以讓區塊鏈系統變得更加智能。
五.合約層
合約層主要包括各種腳本、代碼、演算法機制及智能合約,是區塊鏈可編程的基礎。我們說的「智能合約」便屬於合約層這個層級上。
如果說比特幣系統不夠智能,那麼以太坊提出的「智能合約」則能夠滿足許多應用場景。合約層的原理主要是將代碼嵌入到區塊鏈系統上,用這種方式來實現能夠自定義的智能合約。這樣一來,在區塊鏈系統上,一旦觸發了智能合約的條款,系統就能夠自動執行命令。
六、應用層
最後就是應用層。應用層很簡單,顧名思義,就是區塊鏈的各種應用場景和案例,我們現在說的「區塊鏈+」就是所謂的應用層。目前已經落地的區塊鏈應用主要是搭建在
ETH、EOS等公鏈上的各類區塊鏈應用,博彩、游戲類的應用比較多,真正實用的應用還沒有出現。
C. 以太坊怎麼挖礦
與所有區塊鏈技術一樣,以太坊使用基於激勵的安全模型。聲稱是網路中的礦工的任何節點都可以嘗試創建並阻止驗證區。世界各地的許多礦工正在同時創建和驗證區塊。
一、以太坊采礦的基本原則
1、與所有區塊鏈技術一樣,以太坊使用基於激勵的安全模型。聲稱是網路中的礦工的任何節點都可以嘗試創建並阻止驗證區。世界各地的許多礦工正在同時創建和驗證區塊。每個礦工通過向塊鏈發送塊來提供數學機制的「證據」。此測試類似於保證:如果此測試存在,則此塊必須有效。
2、對於要添加到主鏈的塊,礦工必須比其他礦工更快地提供此「測試」。通過礦工提供的數學機制的「證明」,每個區塊的確認過程稱為工作測試。經證實,新區塊內的礦工將獲得一定的獎勵。什麼是獎勵?以太坊使用內在數字代幣 - 以太作為獎勵。每次礦工嘗試新的塊時,都會生成一個新的以太坊並將其提供給礦工。
第二、以太坊和比特幣的區別
1、同點:比特幣和以太坊都是成功的區塊鏈技術應用。人們通過比特幣認識區塊鏈技術。通過以太坊,人們意識到區塊鏈可以是獨立的。所有這些都基於區塊鏈,其中交易是公開記錄的,貨幣和資產交易更方便和讓步,並且消除了繁瑣的中間人。
2、差異:比特幣是一種分散的點對點數字支付系統,類似於全球清算銀行。而且這家銀行不是一個集中式組織的成員,它沒有CEO,它沒有管理員,只有代碼的基本原則和共識。從同行轉移價值,沒有其他第三方或信託機構。
3、比特幣總量為2100W。對於每生成21W的塊,塊生成的比特幣數量減少一半,每10分鍾生成一個塊。一般而言,它是一種通貨緊縮的電子貨幣。以太坊的定義是一個分散的點對點虛擬機,可以理解為使用代幣執行價值分配並吸引所有各方建立生態系統的平台。以太坊的總量沒有上限。
三、智能合約和協議ERC20
1、智能合約首先是合同,它以代碼的形式規定交易執行的雙方,並規定了執行合同的某些激活條件。一旦這些條件被激活,商定的交易就會自動執行,通常是一些交易。這些交易將由礦工挖掘出來,並最終合並到公共鏈中,這是不可否認的,不可逆轉。
2、以太坊中的智能合約基本上是互聯網上的開源。任何用戶都可以看到相關介面的定義和激活時間。如果沒有統一的標准,許多智能合約將使每個人都難以理解,這份智能合約究竟做了什麼?此時,ERC20協議已啟動。
3、開發人員可以通過查看其他智能合約然後調用自己的合同輕鬆了解相關界面的角色。標准化是非常有益的,這意味著這些資產可以在不同的平台和項目中使用,否則它們只能在特定情況下使用。
四、為什麼以太坊可以用來發送硬幣
因為智能合同的存在的,合同可以被用來安排貨幣集資最後存入帳戶的用戶,並且因為0x7D0使用相同的標准ERC20如直接交換0x7D0和FAD支持以太坊生態系統這將更容易。
五、以太坊貿易限制
1、對於每筆交易,交易的發起人必須設定交易的Gas限價和Gas價格。不同的操作將產生不同的Gas,Gas成本當礦工完成後,礦工將停止運行並且用過的Gas將被獎勵給礦工。
2、如果某些氣體仍然存在,如果用戶聲明限制值太低或者中間的帳號Eth不足以支付Gas消耗,它將返回到交易的發起人或智能合約的創建者,由於Gas不足,協議將被取消,用於計算的Gas將不會退回賬戶。
六、網路計算能力為太坊全
乙太網中所有當前采礦機器的總計算能力,當前采礦集群是根據該值計算的當前塊的難度。
七、以太坊提取難度
塊的難度用於提高塊驗證區的一致性。 Genesis塊的難度是131,072,並且有一個特殊的公式用於計算之後每個塊的難度。如果檢查塊比前一個塊更快,則以太坊協議將增加塊的難度。通過調整塊的難度,您可以調整驗證區塊所需的時間,即突發速度。檢查時間的自我調整以繼續以恆定速率生成新快。
8、單張卡的計算能力與采礦收入之間的關系
單張卡的計算能力越大,可以進行的檢查越多,獲得公式結果的概率是,情況越大,如果使用地雷組,所提供的股份數量越大,采礦業的收入就越大。
D. 一文讀懂以太坊—ETH2.0,是否值得長期持有
這幾天一直在看關於ETH倫敦升級方面的資料,簡單的聊一下,在加密貨幣的世界裡,無論是投資機構、區塊鏈應用開發者、礦機商,還是個人投資者、硬體供應商、 游戲 行業從業者等等,提起以太坊,或多或少都會有一些了解。
一方面取決於以太坊代幣 ETH 本身的造富效應。從 2014 年首次發行以來,投資回報率已經超過 7400 倍。
另一方面,以太坊作為應用最廣泛的去中心應用編程平台,引來無數開發者在其之上開發應用。這些應用不僅產生了巨大的商業價值,伴隨 DEFI 生態、NFT 生態、DAO 生態蓬勃發展,也給 ETH 帶來了更多使用者。
隨著「倫敦升級計劃」臨近,ETH 再次聚集所有人的關注目光。
以太坊 2.0 到底是什麼?包含哪些升級?目前進展如何?
以太坊 2.0 到來,會對現有以太坊生態的去中心化應用產生哪些影響?
ETH 是否值得持續投資?看完相信你會有自己的判斷。
如果將搭建應用比作造房子,那麼以太坊就提供了牆面、屋頂、地板等模塊,用戶只需像搭積木一樣把房子搭起來,因此在以太坊上建立應用的成本和速度都大大改善。以太坊的出現,迅速吸引了大量開發者進入以太坊的世界編寫出各類去中心應用,極大豐富人們對去中心應用場景的需求。
以太坊應用開發模型示意
以太坊與ETH
現有市場的加密貨幣,只是在區塊鏈技術應用在某一場景下的單一代幣。
以太坊也不例外,它的完整項目名稱是「下一代智能合約與去中心化應用平台」,Ether(以太幣)是其原生加密貨幣,簡稱 ETH。
ETH 除了可以用來與各種類型數字資產之間進行有效交換,還提供支付交易費用的機制,即我們現在做鏈上操作時所支付的 GAS 費用。GAS 費用機制的出現,即保護了以太坊網路上創建的應用不會被惡意程序隨意濫用,又因為 GAS 收入歸礦工所有,讓更多的用戶參與到以太坊網路的記賬當中成為礦工,進一步維護了以太坊網路安全與生態發展。
與 BTC 不同的是,ETH 並沒有採用 SHA256 挖礦演算法,避免了整個挖礦生態出現由 ASIC(專用集成電路)礦機主導以至於大部分算力被中心化機構控制所帶來的系統性風險。
以太坊最初採用的是 PoW(Proof of Work)的工作量證明機制,人們需要通過工作量證明以獲取手續費回報。我們經常聽說礦工使用顯卡挖礦,他們做的就是 POW 工作量證明。顯卡越多,算力越大,那麼工作量就越大,收入也就越高。
當前,整個以太坊網路的總算力大約為 870.26 TH/s,用我們熟悉的消費級顯卡來對比,英偉達 RTX 3080 的顯卡算力大約為 92-93 MH/s,以太坊網路相當於 936 萬張 3080 顯卡算力的總和。
以太坊白皮書內非常明確提到之後會將 PoW 工作證明的賬本機制升級為 POS (Proof of Stake)權益證明的賬本機制。
ETH經濟模型
與 BTC 總量 2100 萬枚不同,ETH 的總量並沒有做上限,而是在首次預售的 ETH 數量基礎上每年增發,增發數量為 0.26x(x 為發售總量)。
但也不用擔心 ETH 會無限通脹下去,長期來看,每年增發幣的數量與每年因死亡或者粗心原因遺失幣的數量大致相同,ETH 的「貨幣供應增長率」是趨近於零的。
ETH 分配模型包含早期購買者,早期貢獻值,長期捐贈與礦工收益,具體分配比例如下表。
現在每年將有 60,102,216 * 0.26 = 15,626,576 個 ETH 被礦工挖出,轉成 PoS 後,每年產出的 ETH 將減少。
目前,市場上流通的 ETH 總量約為 116,898,848 枚,總市值約為 2759 億美元。
以太坊發展歷程
1. 邊境階段(2015年):上線後不久進行了第一次分叉,調整未來挖礦的難度。此版本處於實驗階段,技術並未成熟,最初只能讓少部分開發者參與挖礦,智能合約也僅面向開發者開發應用使用,並沒有用戶參與,以太坊網路處於萌芽期。
邊境階段 ETH 價格:1.24 美元。
2. 家園階段(2016年):以太坊主網於 2016 年 3 月進行了第二次分叉,發布了第一個穩定版本。此版本是第一個成熟的正式版本,採用 100% PoW 證明,引入難度炸彈,隨著區塊鏈數量的增加,挖礦難度呈指數增長,網路的性能大幅提升,以太坊項目也進入到快速成長期。在」家園「版本里,還發生了著名的」The DAO 攻擊事件「,以太坊被社區投票硬分叉為以太坊(ETH)與以太經典(ETC)兩條鏈,V 神站在了 ETH 這邊。
家園階段 ETH 價格:12.50 美元。
3. 都會階段(2017~2019年):都會的開發又分為三個階段,升級分成了三次分叉,分別是 2017 年 10 月的「拜占庭」、2019 年 2 月底的「君士坦丁堡「、以及 2019 年 12 月的「伊斯坦布爾」。這些升級主要改善智能合約的編寫、提高安全性、加入難度炸彈以及一些核心架構的修改,以協助未來從工作量證明轉至權益證明。
在都會階段,以太坊網路正式顯現出其威力,正式進入成熟期。智能合約讓不同鏈上的加密貨幣可以互相交易,ERC-20 也在 2017 代幣發行的標准,成千上萬個項目在以太坊網路進行募資,被稱作「首次代幣發行(ICO)」,相信很多幣圈的老人都是被當時 ICO 造富效應帶進來的。到 2019 年,隨著DeFi 生態的崛起,金融產品正式成為以太鏈上最大的產業。
都會階段 ETH 價格:151.06 美元。
4. 寧靜階段(2020-2023年):與都會分三階段開發相同,寧靜階段目前預計分成三次分叉:柏林(已完成)、倫敦(即將到來)、以及後面的第三次分叉。「寧靜」階段又稱為「以太坊 2.0」,是項目的最終階段,以太坊將從工作量證明方式正式轉向權益證明,並開發第二層擴容方案,提高整個網路的運行效率。
寧靜階段可以說是以太坊網路的集大成之作,如果說前個三階段只是讓以太坊的願景展現的實驗平台,寧靜階段之後的以太坊,將正式成為完全體,不僅有完備的生態應用,超級快的處理速度,眾多網路協同發展,而且 PoS 機制會非常節約能源,真正代表了區塊鏈技術逐漸走向成熟的標志。
寧靜階段 ETH 價格:2021 年 4 月 15 日完成的柏林階段,當天價格為 2454 美元。
即將到來的倫敦協議升級
以太坊生態
以太坊的生態發展,從屬性劃可分為兩大類:一是以太坊網路生態應用建設,二是以太坊網路擴容建設。兩者相互融合,互相成就,應用需要更健壯強大的網路作為承載,網路需要功能完善的應用場景服務用戶。
先說應用生態,以太坊的生態我們又可以分為以下幾大類:
1. 去中心化自製組織(DAO)生態
什麼是去中心化自製組織?還是以我們熟悉的比特幣舉例:比特幣目前市值七千多億美金,在全球資產市值類排名第九,但比特幣並不是某一公司發布的產品,也沒有特定公司組織招聘人員進行維護。比特幣現有的一切,都源於比特幣持有者、比特幣礦工自發形成的分布式組織,他們通過投票方式規劃比特幣發展路線,自發參與維護比特幣程序與網路 —這僅僅因為只要擁有比特幣,所有人都是比特幣網路建設中的受益者,一切維護都源於自身的利益關系。
比特幣的發明與成功運行,突破了由荷蘭人創建、至今流行 400 多年的公司商業架構,開創出一種全新的、無組織架構的、全球分布式的商業模式,這就是 DAO。
再說回以太坊,以太坊的 DAO 可以由智能合約編寫,用戶自定義應用場景。簡單說就是我們規定出程序執行條件與執行范圍,真實世界裡只要觸發設定好的條件,程序就會自動執行運行,且所有過程都會在以太坊的網路上進行去中心化公開驗證,不需要經過人工或者任何第三方組織機構確認。
以太坊 DAO 生態演化出許多商業場景,有慈善機構使用 DAO 建立公開透明的捐款與使用機制,有風投機構使用 DAO 建立公平分配的風險基金。
以太坊生態的很多項目都採用 DAO 自治,代表項目有:Uniswap,AAVE,MakerDAO,Compound,Decred,Dash 等。
2. 去中心化金融(DEFI)生態
在傳統商業世界裡,我們如果需要借錢、存錢,或者買某一公司股票,或者做企業貸款、融資,只要是進行金融活動,總離不開與銀行、證券機構、會計事務所這些金融機構打交道。
而在去中心的世界裡,區塊鏈本質就是集合所有人交易記錄且公開的大賬本,我們可以非常容易的追溯到每一個錢包地址發生過的每一筆交易,查詢到任意一個錢包地址的余額信息,從而對錢包地址里的資產做評估。
舉個例子:全世界個人貸款最貴的國家是印度,印度的年輕人房貸利率目前是 8.8%,最高曾經到過 20%;與此對應,全世界個人存款利率最低的國家是日本,日本政府為了鼓勵民眾消費,在很長一段時間里銀行存款利率是負值,日本人在銀行存款不僅沒有利息,還要給銀行交保管費。理論上,如果日本人將自己的存款借與印度人,雙方都能獲得利益最大化,但現實生活中這樣的場景很難發生。一是每個國家都有外匯管制,日本人的錢並不容易能給到印度人,二是印度人的信用如何日本人也不好評估,大家沒有統一標准,萬一借出去的錢無法歸還,不能沒了收益還要蒙受損失。
但在去中心的世界裡,這樣的事情就簡單的多。
如果印度人的錢包地址里有比特幣,我們就可以利用智能合約,印度人將自己的比特幣質押進去,根據比特幣當時的價格,系統自動給印度人一個授信額度,印度人就可以拿著這個額度去和日本人借款,並規定好還款的周期與利率。如果印度人違約,合約自動將印度人質押進去的比特幣扣除,優先保障日本的權利,這樣,日本人不用擔心安全問題放心享受收益,印度人也有了更多的款項做為流動資金。
這個例子就是去中心金融的簡單應用,實際上,這就是我們參與 DEFI 挖礦是質押理財的原理 —— 當然真正應用實現演算法與場景要復雜的多。
DEFI 根據場景不同,又可以分為很多賽道,比如穩定幣、預言機、AMM 交易所、衍生品、聚合器等等。
DEFI 代表項目有:Dai,Augur,Chainlink,WBTC,0x,Balance,Liquity 等。
3. 非同質化代幣(NFT)生態
世界名畫《蒙娜麗莎》,只有達·芬奇的原版可以展覽在法國盧浮宮博物館,哪怕現代的技術可以無比精細地復刻出來,仿品都不具備原版的收藏價值。
這就是 NFT 的應用場景。NFT是我們可以用來表示獨特物品所有權的代幣,它們讓我們將藝術品、收藏品甚至房地產等現實事物唯一代幣化。雖然文件(作品)本身是可以無限復制,但代表它們的代幣在鏈上可以被追蹤,並為買家提供所有權證明。
相比現實中實物版權、物權的雙重交割相比,NFT 只需要交割描述此物品的唯一代幣。NFT 作品往往存儲在如 IPFS 這樣的分布式存儲網路里,隨用隨取,永不丟失,加之交割簡單方便,很快吸引了大量玩家與投資者收藏轉賣,NFT 出現也給藝術家提供了全新的收入模式。
類似 DEFI 生態,NFT 生態根據應用場景不同也產生了不同賽道,目前比較火熱的賽道有 NFT 交易平台,NFT 游戲 平台,NFT 藝術品平台, NFT 與 DEFI 結合在一起的金融平台。
NFT 代表項目有:CryptoKitties,CryptoPunks,Meebits,Opensea,Rally,Axie Infinity,Enjin Coin,The Sandbox 等。
4. 標准代幣協議(ERC-20)生態
與 NFT 非同質化代幣所對應的,就是同質化代幣。比如我們使用的人民幣就是一種同質化代幣,我們可以用人民幣進行價值交換,即使序號不同也不影響其價值,如果面額相同,不同的鈔票序號對持有者來說沒有區別。
BTC,ETH 和所有我們熟知的加密貨幣,都屬於同質化代幣。同種類的一個比特幣和另一個比特幣沒有任何區別,規格相同,具有統一性。在交易中,只需關注代幣交接的數量即可,其價值可能會根據交換的時間間隔而改變,但其本質並沒有發生變化。
以太坊的 ERC-20 就是定義這種代幣的標准協議,任何人都可以使用 ERC-20 協議,通過幾行代碼,發布自己在以太坊網路上的加密貨幣。
現在,以太坊網路上運行的代幣種類有上百萬個,上邊提到的項目,大多也在以太坊網路中發布了自己的同質化代幣。
ERC-20 代表項目有:USDT,USDC,WBTC 等。
以太坊網路擴容性
我們先引入一個概念:區塊鏈的不可能三角,即無論何種方法,我們都無法同時達到可擴展、去中心化、安全,三者只能得其二。
這其實很好理解,如果我們要去中心化和安全,就需要更多有節點參與網路進行驗證,從而導致驗證人增多、網路效率降低,擴展性下降。網路性能建設就是在三者之間找到平衡點。
用數據舉例,目前比特幣可處理轉賬 7 筆 / 秒,以太坊是 25 筆 / 秒,而 VISA 平均為 4500 筆 / 秒,峰值則達每秒上萬筆。這種業務處理能力的差別,我們就可以簡單理解為是「吞吐量」的差距。而想要提高吞吐量,則需要擴展區塊鏈的業務處理能力,這就是所謂的擴展性。
根據優化方法不同,以太坊網路性能擴容方案可以分為:
1. Layer 1 鏈上擴展,所有交易都保留在以太坊上的擴展解決方案,具有更高的安全性。
鏈上擴展的本質還是改進以太坊主鏈本身,使整個系統擁有更高的拓展性與運行效率。一般的方法有兩種,要麼改變共識協議,比如 ETH 將從 PoW 轉變為 PoS;要麼使用分片技術,優化方法使網路具有更高效率。
2. Layer 2 鏈下擴展,在以太坊協議之上分層單獨做各場景解決方案,具有更好的擴展性。
鏈下擴展可以理解為把計算、交易等業務處理場景拿到以太坊主鏈之外計算,最後將計算好的結果傳回主鏈,主鏈只反映最終的結果而不用管過程,這樣,無論多麼復雜的應用都不會對主鏈產生影響。
我們並不需要明白具體技術實現,只需知道:相比 Layer 1 方案,Layer 2 方案網路不會干擾底層區塊鏈協議,可以替 Layer 1 承擔大部分計算工作,從而降低主網路的負擔提高網路業務處理效率,是目前公認比較好的擴容方案。
以太坊2.0
終於講到以太坊 2.0,回到主題。
通過回顧以太坊的發展 歷史 ,以太坊 2.0 並不是新項目,它只是以太坊開發進程的最後一個階段,它將由整個以太坊生態多個團隊協同完成,目標是使以太坊更具可擴展性、更安全和更可持續,最終成為主流並為全人類服務。
ETH2建設目標:
1. 更具可擴展性。每秒支持 1000 次交易,以使應用程序使用起來更快、更便宜。
2. 更安全。以太坊變得更加安全,以抵禦所有形式的攻擊。
3. 更可持續。提高網路性能的同時減少對能源的消耗,更好地保護環境。
最重要的變化,ETH2 將從 ETH1 使用的 PoW(Proof of Work)工作量證明機制升級為 POS (Proof of Stake)權益證明機制。不再以算力做為驗證方式,而是通過質押加密貨幣的數量做為驗證手段。礦工不需要顯卡也能挖礦,既節省了時間成本與電力成本,又提高了 ETH 的利用率,非常類似錢存在銀行獲得利息。
ETH2 主要使用的技術是分片分層技術實現整個網路擴容。
ETH2 升級將分為三個階段進行:
1. 階段0(正在進行):信標鏈的創建與合並。信標鏈是 ETH2 的主鏈,如同人類的大腦,是 ETH2 得以運行的基礎。
2. 階段1(預計2022年):分片鏈的創建與應用。當信標鏈與 ETH1 合並完成後,就進入分片鏈的開發階段。分片鏈可以理解為將 ETH2 主鏈的整塊數據按一定規則拆分存放,單獨建立新鏈處理,用來分擔主鏈上的數據壓力,目前規劃是建立 64 條分片鏈。
舉個例子,從北京到上海,原來的交通工具只有一條公路,所有的車輛都需要在上邊運行,就會非常擁擠;現在通過分片技術,多出來高鐵、飛機等交通方式,分流的車輛同時到達速度更快,這就是分片鏈起到的作用。
分片鏈與主鏈交互示意圖
3. 階段2(預計2023年):整個網路功能的融合。到了此階段,整個系統的功能全面開始融合,分片鏈的功能會更加強大,新的處理機制開始支持賬戶、智能合約、開發工具的創建,新的生態應用等。
此階段是以太坊網路的最終形態,網路性能得到全面提升,生態應用全面爆發。但要服務全人類,ETH2 每秒 1000 次的交易效率顯然還是遠遠不夠,以太坊也會為它的目標持續優化下去。
ETH2對於大家有什麼影響?
1. 對於以太坊生態開發者。ETH2 在部署應用的時候,是需要選擇應用在哪條分片網路進行部署,造成這種差異的原因是跨分片通信不同步,這就意味著開發者需要根據自己發展計劃做不同的組合。
2. 對與 ETH 持幣者。ETH2 與 ETH1 數據完全同步,代幣也不會有任何變化,你可以繼續使用現在的錢包地址繼續持有 ETH。
3. 對於礦工。雖然 PoW 與 PoS 還會並行一段時間,可以預計的 PoW 礦機的產出會越來越少,應該開始減少 PoW 礦機的投資,開始轉向 PoS 機制。
4. 對於用戶。ETH2 速度更快,交易手續費更低,網路體驗會非常好,唯一值得注意的是,由於 Dapp 部署在不同的分片網路上,可能需要手動選擇應用的網路選項。
ETH是否值得投資?
ETH 是除了 BTC 以外市場的風向標,明確了解 ETH2 非常有助於我們理解其他區塊鏈項目,理解二級市場。
簡單總結幾個點吧:
1. 通過以太坊的項目分析,我們可以清晰地看到:在比特幣之後,以太坊項目的發展史就是目前區塊鏈應用生態的發展史。無論 DEFI 生態,NFT 生態,DAO 生態還是代幣、合約、協議生態,其實在以太坊發布白皮書時已有預見,後來出現的項目,都是圍繞以太坊做驗證。
2. 以太坊的聯合創始人里,只有 V 神還在為以太坊事業做貢獻,但這並不影響以以太坊繁榮發展。以太坊初始團隊只是創建了它,後續的發展是社區、開發者、礦工與用戶共同建立的結果,現在的以太坊早已不是某一個人的思維,它是所有以太坊生態參與者共同的結晶,它屬於全人類。
3. 以太坊在過去的幾年一直沿著既定的開發軌跡發展,雖然中途一度出現過危機,以太坊「被死亡」了好幾百次,以太坊還是頑強的發展下來,並且擁有了繁榮生態。ETH2 還要兩三年時間才能落地,中間也充滿變數,比如其他的公鏈搶佔先機,但可以預見,ETH2 後的以太坊會更加健壯。
4. 不要在抱有任何 BTC 會死亡,區塊鏈行業會消失這樣的偽命題。BTC、ETH 讓我們看到了突破原有公司組織架構,一種全新無組織架構的商業模式存在,這種商業模式顯然更符合這個時代的發展需求,無論項目地發起團隊在不在,無論各國政府如何打壓,只要技術對人類有貢獻,就會由人員自發組織維護,區塊鏈技術是革命。
5. ETH2 的上線,短期看 PoW 獎勵與 PoS 獎勵並行,可能會讓 ETH 總通脹率短期內飆升,長期看 ETH 通脹率始終保持平衡。加上 ETH 本身的生態與應用場景,ETH是值得投資的,目前看不到有其他公鏈代替以太坊公鏈的可能性,ETH2 的上線,甚至會對其他公鏈造成「虹吸效應」,萬鏈歸一。
#比特幣[超話]# #數字貨幣#
E. 以太坊區塊鏈被拆分為多少個不同的鏈
分為64個。
分片鏈機制會將以太坊鏈拆分成64條不同的鏈,拆分以後,將數據處理的任務分配給許多節點,這樣就可以並行處理交易,而非串列。
F. 以太坊是什麼丨以太坊開發入門指南
以太坊是什麼丨以太坊開發入門指南
很多同學已經躍躍欲試投入到區塊鏈開發隊伍當中來,可是又感覺無從下手,本文將基於以太坊平台,以通俗的方式介紹以太坊開發中涉及的各晦澀的概念,輕松帶大家入門。
以太坊是什麼
以太坊(Ethereum)是一個建立在區塊鏈技術之上, 去中心化應用平台。它允許任何人在平台中建立和使用通過區塊鏈技術運行的去中心化應用。
對這句話不理解的同學,姑且可以理解為以太坊是區塊鏈里的Android,它是一個開發平台,讓我們就可以像基於Android Framework一樣基於區塊鏈技術寫應用。
在沒有以太坊之前,寫區塊鏈應用是這樣的:拷貝一份比特幣代碼,然後去改底層代碼如加密演算法,共識機制,網路協議等等(很多山寨幣就是這樣,改改就出來一個新幣)。
以太坊平台對底層區塊鏈技術進行了封裝,讓區塊鏈應用開發者可以直接基於以太坊平台進行開發,開發者只要專注於應用本身的開發,從而大大降低了難度。
目前圍繞以太坊已經形成了一個較為完善的開發生態圈:有社區的支持,有很多開發框架、工具可以選擇。
智能合約
什麼是智能合約
以太坊上的程序稱之為智能合約, 它是代碼和數據(狀態)的集合。
智能合約可以理解為在區塊鏈上可以自動執行的(由事件驅動的)、以代碼形式編寫的合同(特殊的交易)。
在比特幣腳本中,我們講到過比特幣的交易是可以編程的,但是比特幣腳本有很多的限制,能夠編寫的程序也有限,而以太坊則更加完備(在計算機科學術語中,稱它為是「圖靈完備的」),讓我們就像使用任何高級語言一樣來編寫幾乎可以做任何事情的程序(智能合約)。
智能合約非常適合對信任、安全和持久性要求較高的應用場景,比如:數字貨幣、數字資產、投票、保險、金融應用、預測市場、產權所有權管理、物聯網、點對點交易等等。
目前除數字貨幣之外,真正落地的應用還不多(就像移動平台剛開始出來一樣),相信1到3年內,各種殺手級會慢慢出現。
編程語言:Solidity
智能合約的默認的編程語言是Solidity,文件擴展名以.sol結尾。
Solidity是和JavaScript相似的語言,用它來開發合約並編譯成以太坊虛擬機位元組代碼。
還有長像Python的智能合約開發語言:Serpent,不過建議大家還是使用Solidity。
Browser-Solidity是一個瀏覽器的Solidity IDE, 大家可以點進去看看,以後我們更多文章介紹Solidity這個語言。
運行環境:EVM
EVM(Ethereum Virtual Machine)以太坊虛擬機是以太坊中智能合約的運行環境。
Solidity之於EVM,就像之於跟JVM的關系一樣,這樣大家就容易理解了。
以太坊虛擬機是一個隔離的環境,在EVM內部運行的代碼不能跟外部有聯系。
而EVM運行在以太坊節點上,當我們把合約部署到以太坊網路上之後,合約就可以在以太坊網路中運行了。
合約的編譯
以太坊虛擬機上運行的是合約的位元組碼形式,需要我們在部署之前先對合約進行編譯,可以選擇Browser-Solidity Web IDE或solc編譯器。
合約的部署
在以太坊上開發應用時,常常要使用到以太坊客戶端(錢包)。平時我們在開發中,一般不接觸到客戶端或錢包的概念,它是什麼呢?
以太坊客戶端(錢包)
以太坊客戶端,其實我們可以把它理解為一個開發者工具,它提供賬戶管理、挖礦、轉賬、智能合約的部署和執行等等功能。
EVM是由以太坊客戶端提供的。
Geth是典型的開發以太坊時使用的客戶端,基於Go語言開發。 Geth提供了一個互動式命令控制台,通過命令控制台中包含了以太坊的各種功能(API)。Geth的使用我們之後會有文章介紹,這里大家先有個概念。
Geth控制台和Chrome瀏覽器開發者工具里的面的控制台是類似,不過是跑在終端里。
相對於Geth,Mist則是圖形化操作界面的以太坊客戶端。
如何部署
智能合約的部署是指把合約位元組碼發布到區塊鏈上,並使用一個特定的地址來標示這個合約,這個地址稱為合約賬戶。
以太坊中有兩類賬戶:
· 外部賬戶
該類賬戶被私鑰控制(由人控制),沒有關聯任何代碼。
· 合約賬戶
該類賬戶被它們的合約代碼控制且有代碼與之關聯。
和比特幣使用UTXO的設計不一樣,以太坊使用更為簡單的賬戶概念。
兩類賬戶對於EVM來說是一樣的。
外部賬戶與合約賬戶的區別和關系是這樣的:一個外部賬戶可以通過創建和用自己的私鑰來對交易進行簽名,來發送消息給另一個外部賬戶或合約賬戶。
在兩個外部賬戶之間傳送消息是價值轉移的過程。但從外部賬戶到合約賬戶的消息會激活合約賬戶的代碼,允許它執行各種動作(比如轉移代幣,寫入內部存儲,挖出一個新代幣,執行一些運算,創建一個新的合約等等)。
只有當外部賬戶發出指令時,合同賬戶才會執行相應的操作。
合約部署就是將編譯好的合約位元組碼通過外部賬號發送交易的形式部署到以太坊區塊鏈上(由實際礦工出塊之後,才真正部署成功)。
運行
合約部署之後,當需要調用這個智能合約的方法時只需要向這個合約賬戶發送消息(交易)即可,通過消息觸發後智能合約的代碼就會在EVM中執行了。
Gas
和雲計算相似,佔用區塊鏈的資源(不管是簡單的轉賬交易,還是合約的部署和執行)同樣需要付出相應的費用(天下沒有免費的午餐對不對!)。
以太坊上用Gas機制來計費,Gas也可以認為是一個工作量單位,智能合約越復雜(計算步驟的數量和類型,佔用的內存等),用來完成運行就需要越多Gas。
任何特定的合約所需的運行合約的Gas數量是固定的,由合約的復雜度決定。
而Gas價格由運行合約的人在提交運行合約請求的時候規定,以確定他願意為這次交易願意付出的費用:Gas價格(用以太幣計價) * Gas數量。
Gas的目的是限制執行交易所需的工作量,同時為執行支付費用。當EVM執行交易時,Gas將按照特定規則被逐漸消耗,無論執行到什麼位置,一旦Gas被耗盡,將會觸發異常。當前調用幀所做的所有狀態修改都將被回滾, 如果執行結束還有Gas剩餘,這些Gas將被返還給發送賬戶。
如果沒有這個限制,就會有人寫出無法停止(如:死循環)的合約來阻塞網路。
因此實際上(把前面的內容串起來),我們需要一個有以太幣余額的外部賬戶,來發起一個交易(普通交易或部署、運行一個合約),運行時,礦工收取相應的工作量費用。
以太坊網路
有些著急的同學要問了,沒有以太幣,要怎麼進行智能合約的開發?可以選擇以下方式:
選擇以太坊官網測試網路Testnet
測試網路中,我們可以很容易獲得免費的以太幣,缺點是需要發很長時間初始化節點。
使用私有鏈
創建自己的以太幣私有測試網路,通常也稱為私有鏈,我們可以用它來作為一個測試環境來開發、調試和測試智能合約。
通過上面提到的Geth很容易就可以創建一個屬於自己的測試網路,以太幣想挖多少挖多少,也免去了同步正式網路的整個區塊鏈數據。
使用開發者網路(模式)
相比私有鏈,開發者網路(模式)下,會自動分配一個有大量余額的開發者賬戶給我們使用。
使用模擬環境
另一個創建測試網路的方法是使用testrpc,testrpc是在本地使用內存模擬的一個以太坊環境,對於開發調試來說,更方便快捷。而且testrpc可以在啟動時幫我們創建10個存有資金的測試賬戶。
進行合約開發時,可以在testrpc中測試通過後,再部署到Geth節點中去。
更新:testrpc 現在已經並入到Truffle 開發框架中,現在名字是Ganache CLI。
Dapp:去中心化的應用程序
以太坊社區把基於智能合約的應用稱為去中心化的應用程序(DecentralizedApp)。如果我們把區塊鏈理解為一個不可篡改的資料庫,智能合約理解為和資料庫打交道的程序,那就很容易理解Dapp了,一個Dapp不單單有智能合約,比如還需要有一個友好的用戶界面和其他的東西。
Truffle
Truffle是Dapp開發框架,他可以幫我們處理掉大量無關緊要的小事情,讓我們可以迅速開始寫代碼-編譯-部署-測試-打包DApp這個流程。
總結
我們現在來總結一下,以太坊是平台,它讓我們方便的使用區塊鏈技術開發去中心化的應用,在這個應用中,使用Solidity來編寫和區塊鏈交互的智能合約,合約編寫好後之後,我們需要用以太坊客戶端用一個有餘額的賬戶去部署及運行合約(使用Truffle框架可以更好的幫助我們做這些事情了)。為了開發方便,我們可以用Geth或testrpc來搭建一個測試網路。
註:本文中為了方便大家理解,對一些概念做了類比,有些嚴格來不是准確,不過我也認為對於初學者,也沒有必要把每一個概念掌握的很細致和准確,學習是一個逐步深入的過程,很多時候我們會發現,過一段後,我們會對同一個東西有不一樣的理解。
G. 【深度知識】區塊鏈之加密原理圖示(加密,簽名)
先放一張以太坊的架構圖:
在學習的過程中主要是採用單個模塊了學習了解的,包括P2P,密碼學,網路,協議等。直接開始總結:
秘鑰分配問題也就是秘鑰的傳輸問題,如果對稱秘鑰,那麼只能在線下進行秘鑰的交換。如果在線上傳輸秘鑰,那就有可能被攔截。所以採用非對稱加密,兩把鑰匙,一把私鑰自留,一把公鑰公開。公鑰可以在網上傳輸。不用線下交易。保證數據的安全性。
如上圖,A節點發送數據到B節點,此時採用公鑰加密。A節點從自己的公鑰中獲取到B節點的公鑰對明文數據加密,得到密文發送給B節點。而B節點採用自己的私鑰解密。
2、無法解決消息篡改。
如上圖,A節點採用B的公鑰進行加密,然後將密文傳輸給B節點。B節點拿A節點的公鑰將密文解密。
1、由於A的公鑰是公開的,一旦網上黑客攔截消息,密文形同虛設。說白了,這種加密方式,只要攔截消息,就都能解開。
2、同樣存在無法確定消息來源的問題,和消息篡改的問題。
如上圖,A節點在發送數據前,先用B的公鑰加密,得到密文1,再用A的私鑰對密文1加密得到密文2。而B節點得到密文後,先用A的公鑰解密,得到密文1,之後用B的私鑰解密得到明文。
1、當網路上攔截到數據密文2時, 由於A的公鑰是公開的,故可以用A的公鑰對密文2解密,就得到了密文1。所以這樣看起來是雙重加密,其實最後一層的私鑰簽名是無效的。一般來講,我們都希望簽名是簽在最原始的數據上。如果簽名放在後面,由於公鑰是公開的,簽名就缺乏安全性。
2、存在性能問題,非對稱加密本身效率就很低下,還進行了兩次加密過程。
如上圖,A節點先用A的私鑰加密,之後用B的公鑰加密。B節點收到消息後,先採用B的私鑰解密,然後再利用A的公鑰解密。
1、當密文數據2被黑客攔截後,由於密文2隻能採用B的私鑰解密,而B的私鑰只有B節點有,其他人無法機密。故安全性最高。
2、當B節點解密得到密文1後, 只能採用A的公鑰來解密。而只有經過A的私鑰加密的數據才能用A的公鑰解密成功,A的私鑰只有A節點有,所以可以確定數據是由A節點傳輸過來的。
經兩次非對稱加密,性能問題比較嚴重。
基於以上篡改數據的問題,我們引入了消息認證。經過消息認證後的加密流程如下:
當A節點發送消息前,先對明文數據做一次散列計算。得到一個摘要, 之後將照耀與原始數據同時發送給B節點。當B節點接收到消息後,對消息解密。解析出其中的散列摘要和原始數據,然後再對原始數據進行一次同樣的散列計算得到摘要1, 比較摘要與摘要1。如果相同則未被篡改,如果不同則表示已經被篡改。
在傳輸過程中,密文2隻要被篡改,最後導致的hash與hash1就會產生不同。
無法解決簽名問題,也就是雙方相互攻擊。A對於自己發送的消息始終不承認。比如A對B發送了一條錯誤消息,導致B有損失。但A抵賴不是自己發送的。
在(三)的過程中,沒有辦法解決交互雙方相互攻擊。什麼意思呢? 有可能是因為A發送的消息,對A節點不利,後來A就抵賴這消息不是它發送的。
為了解決這個問題,故引入了簽名。這里我們將(二)-4中的加密方式,與消息簽名合並設計在一起。
在上圖中,我們利用A節點的私鑰對其發送的摘要信息進行簽名,然後將簽名+原文,再利用B的公鑰進行加密。而B得到密文後,先用B的私鑰解密,然後 對摘要再用A的公鑰解密,只有比較兩次摘要的內容是否相同。這既避免了防篡改問題,有規避了雙方攻擊問題。因為A對信息進行了簽名,故是無法抵賴的。
為了解決非對稱加密數據時的性能問題,故往往採用混合加密。這里就需要引入對稱加密,如下圖:
在對數據加密時,我們採用了雙方共享的對稱秘鑰來加密。而對稱秘鑰盡量不要在網路上傳輸,以免丟失。這里的共享對稱秘鑰是根據自己的私鑰和對方的公鑰計算出的,然後適用對稱秘鑰對數據加密。而對方接收到數據時,也計算出對稱秘鑰然後對密文解密。
以上這種對稱秘鑰是不安全的,因為A的私鑰和B的公鑰一般短期內固定,所以共享對稱秘鑰也是固定不變的。為了增強安全性,最好的方式是每次交互都生成一個臨時的共享對稱秘鑰。那麼如何才能在每次交互過程中生成一個隨機的對稱秘鑰,且不需要傳輸呢?
那麼如何生成隨機的共享秘鑰進行加密呢?
對於發送方A節點,在每次發送時,都生成一個臨時非對稱秘鑰對,然後根據B節點的公鑰 和 臨時的非對稱私鑰 可以計算出一個對稱秘鑰(KA演算法-Key Agreement)。然後利用該對稱秘鑰對數據進行加密,針對共享秘鑰這里的流程如下:
對於B節點,當接收到傳輸過來的數據時,解析出其中A節點的隨機公鑰,之後利用A節點的隨機公鑰 與 B節點自身的私鑰 計算出對稱秘鑰(KA演算法)。之後利用對稱秘鑰機密數據。
對於以上加密方式,其實仍然存在很多問題,比如如何避免重放攻擊(在消息中加入 Nonce ),再比如彩虹表(參考 KDF機制解決 )之類的問題。由於時間及能力有限,故暫時忽略。
那麼究竟應該採用何種加密呢?
主要還是基於要傳輸的數據的安全等級來考量。不重要的數據其實做好認證和簽名就可以,但是很重要的數據就需要採用安全等級比較高的加密方案了。
密碼套件 是一個網路協議的概念。其中主要包括身份認證、加密、消息認證(MAC)、秘鑰交換的演算法組成。
在整個網路的傳輸過程中,根據密碼套件主要分如下幾大類演算法:
秘鑰交換演算法:比如ECDHE、RSA。主要用於客戶端和服務端握手時如何進行身份驗證。
消息認證演算法:比如SHA1、SHA2、SHA3。主要用於消息摘要。
批量加密演算法:比如AES, 主要用於加密信息流。
偽隨機數演算法:例如TLS 1.2的偽隨機函數使用MAC演算法的散列函數來創建一個 主密鑰 ——連接雙方共享的一個48位元組的私鑰。主密鑰在創建會話密鑰(例如創建MAC)時作為一個熵來源。
在網路中,一次消息的傳輸一般需要在如下4個階段分別進行加密,才能保證消息安全、可靠的傳輸。
握手/網路協商階段:
在雙方進行握手階段,需要進行鏈接的協商。主要的加密演算法包括RSA、DH、ECDH等
身份認證階段:
身份認證階段,需要確定發送的消息的來源來源。主要採用的加密方式包括RSA、DSA、ECDSA(ECC加密,DSA簽名)等。
消息加密階段:
消息加密指對發送的信息流進行加密。主要採用的加密方式包括DES、RC4、AES等。
消息身份認證階段/防篡改階段:
主要是保證消息在傳輸過程中確保沒有被篡改過。主要的加密方式包括MD5、SHA1、SHA2、SHA3等。
ECC :Elliptic Curves Cryptography,橢圓曲線密碼編碼學。是一種根據橢圓上點倍積生成 公鑰、私鑰的演算法。用於生成公私秘鑰。
ECDSA :用於數字簽名,是一種數字簽名演算法。一種有效的數字簽名使接收者有理由相信消息是由已知的發送者創建的,從而發送者不能否認已經發送了消息(身份驗證和不可否認),並且消息在運輸過程中沒有改變。ECDSA簽名演算法是ECC與DSA的結合,整個簽名過程與DSA類似,所不一樣的是簽名中採取的演算法為ECC,最後簽名出來的值也是分為r,s。 主要用於身份認證階段 。
ECDH :也是基於ECC演算法的霍夫曼樹秘鑰,通過ECDH,雙方可以在不共享任何秘密的前提下協商出一個共享秘密,並且是這種共享秘鑰是為當前的通信暫時性的隨機生成的,通信一旦中斷秘鑰就消失。 主要用於握手磋商階段。
ECIES: 是一種集成加密方案,也可稱為一種混合加密方案,它提供了對所選擇的明文和選擇的密碼文本攻擊的語義安全性。ECIES可以使用不同類型的函數:秘鑰協商函數(KA),秘鑰推導函數(KDF),對稱加密方案(ENC),哈希函數(HASH), H-MAC函數(MAC)。
ECC 是橢圓加密演算法,主要講述了按照公私鑰怎麼在橢圓上產生,並且不可逆。 ECDSA 則主要是採用ECC演算法怎麼來做簽名, ECDH 則是採用ECC演算法怎麼生成對稱秘鑰。以上三者都是對ECC加密演算法的應用。而現實場景中,我們往往會採用混合加密(對稱加密,非對稱加密結合使用,簽名技術等一起使用)。 ECIES 就是底層利用ECC演算法提供的一套集成(混合)加密方案。其中包括了非對稱加密,對稱加密和簽名的功能。
<meta charset="utf-8">
這個先訂條件是為了保證曲線不包含奇點。
所以,隨著曲線參數a和b的不斷變化,曲線也呈現出了不同的形狀。比如:
所有的非對稱加密的基本原理基本都是基於一個公式 K = k G。其中K代表公鑰,k代表私鑰,G代表某一個選取的基點。非對稱加密的演算法 就是要保證 該公式 不可進行逆運算( 也就是說G/K是無法計算的 )。 *
ECC是如何計算出公私鑰呢?這里我按照我自己的理解來描述。
我理解,ECC的核心思想就是:選擇曲線上的一個基點G,之後隨機在ECC曲線上取一個點k(作為私鑰),然後根據k G計算出我們的公鑰K。並且保證公鑰K也要在曲線上。*
那麼k G怎麼計算呢?如何計算k G才能保證最後的結果不可逆呢?這就是ECC演算法要解決的。
首先,我們先隨便選擇一條ECC曲線,a = -3, b = 7 得到如下曲線:
在這個曲線上,我隨機選取兩個點,這兩個點的乘法怎麼算呢?我們可以簡化下問題,乘法是都可以用加法表示的,比如2 2 = 2+2,3 5 = 5+5+5。 那麼我們只要能在曲線上計算出加法,理論上就能算乘法。所以,只要能在這個曲線上進行加法計算,理論上就可以來計算乘法,理論上也就可以計算k*G這種表達式的值。
曲線上兩點的加法又怎麼算呢?這里ECC為了保證不可逆性,在曲線上自定義了加法體系。
現實中,1+1=2,2+2=4,但在ECC演算法里,我們理解的這種加法體系是不可能。故需要自定義一套適用於該曲線的加法體系。
ECC定義,在圖形中隨機找一條直線,與ECC曲線相交於三個點(也有可能是兩個點),這三點分別是P、Q、R。
那麼P+Q+R = 0。其中0 不是坐標軸上的0點,而是ECC中的無窮遠點。也就是說定義了無窮遠點為0點。
同樣,我們就能得出 P+Q = -R。 由於R 與-R是關於X軸對稱的,所以我們就能在曲線上找到其坐標。
P+R+Q = 0, 故P+R = -Q , 如上圖。
以上就描述了ECC曲線的世界裡是如何進行加法運算的。
從上圖可看出,直線與曲線只有兩個交點,也就是說 直線是曲線的切線。此時P,R 重合了。
也就是P = R, 根據上述ECC的加法體系,P+R+Q = 0, 就可以得出 P+R+Q = 2P+Q = 2R+Q=0
於是乎得到 2 P = -Q (是不是與我們非對稱演算法的公式 K = k G 越來越近了)。
於是我們得出一個結論,可以算乘法,不過只有在切點的時候才能算乘法,而且只能算2的乘法。
假若 2 可以變成任意個數進行想乘,那麼就能代表在ECC曲線里可以進行乘法運算,那麼ECC演算法就能滿足非對稱加密演算法的要求了。
那麼我們是不是可以隨機任何一個數的乘法都可以算呢? 答案是肯定的。 也就是點倍積 計算方式。
選一個隨機數 k, 那麼k * P等於多少呢?
我們知道在計算機的世界裡,所有的都是二進制的,ECC既然能算2的乘法,那麼我們可以將隨機數k描 述成二進制然後計算。假若k = 151 = 10010111
由於2 P = -Q 所以 這樣就計算出了k P。 這就是點倍積演算法 。所以在ECC的曲線體系下是可以來計算乘法,那麼以為這非對稱加密的方式是可行的。
至於為什麼這樣計算 是不可逆的。這需要大量的推演,我也不了解。但是我覺得可以這樣理解:
我們的手錶上,一般都有時間刻度。現在如果把1990年01月01日0點0分0秒作為起始點,如果告訴你至起始點為止時間流逝了 整1年,那麼我們是可以計算出現在的時間的,也就是能在手錶上將時分秒指針應該指向00:00:00。但是反過來,我說現在手錶上的時分秒指針指向了00:00:00,你能告訴我至起始點算過了有幾年了么?
ECDSA簽名演算法和其他DSA、RSA基本相似,都是採用私鑰簽名,公鑰驗證。只不過演算法體系採用的是ECC的演算法。交互的雙方要採用同一套參數體系。簽名原理如下:
在曲線上選取一個無窮遠點為基點 G = (x,y)。隨機在曲線上取一點k 作為私鑰, K = k*G 計算出公鑰。
簽名過程:
生成隨機數R, 計算出RG.
根據隨機數R,消息M的HASH值H,以及私鑰k, 計算出簽名S = (H+kx)/R.
將消息M,RG,S發送給接收方。
簽名驗證過程:
接收到消息M, RG,S
根據消息計算出HASH值H
根據發送方的公鑰K,計算 HG/S + xK/S, 將計算的結果與 RG比較。如果相等則驗證成功。
公式推論:
HG/S + xK/S = HG/S + x(kG)/S = (H+xk)/GS = RG
在介紹原理前,說明一下ECC是滿足結合律和交換律的,也就是說A+B+C = A+C+B = (A+C)+B。
這里舉一個WIKI上的例子說明如何生成共享秘鑰,也可以參考 Alice And Bob 的例子。
Alice 與Bob 要進行通信,雙方前提都是基於 同一參數體系的ECC生成的 公鑰和私鑰。所以有ECC有共同的基點G。
生成秘鑰階段:
Alice 採用公鑰演算法 KA = ka * G ,生成了公鑰KA和私鑰ka, 並公開公鑰KA。
Bob 採用公鑰演算法 KB = kb * G ,生成了公鑰KB和私鑰 kb, 並公開公鑰KB。
計算ECDH階段:
Alice 利用計算公式 Q = ka * KB 計算出一個秘鑰Q。
Bob 利用計算公式 Q' = kb * KA 計算出一個秘鑰Q'。
共享秘鑰驗證:
Q = ka KB = ka * kb * G = ka * G * kb = KA * kb = kb * KA = Q'
故 雙方分別計算出的共享秘鑰不需要進行公開就可採用Q進行加密。我們將Q稱為共享秘鑰。
在以太坊中,採用的ECIEC的加密套件中的其他內容:
1、其中HASH演算法採用的是最安全的SHA3演算法 Keccak 。
2、簽名演算法採用的是 ECDSA
3、認證方式採用的是 H-MAC
4、ECC的參數體系採用了secp256k1, 其他參數體系 參考這里
H-MAC 全程叫做 Hash-based Message Authentication Code. 其模型如下:
在 以太坊 的 UDP通信時(RPC通信加密方式不同),則採用了以上的實現方式,並擴展化了。
首先,以太坊的UDP通信的結構如下:
其中,sig是 經過 私鑰加密的簽名信息。mac是可以理解為整個消息的摘要, ptype是消息的事件類型,data則是經過RLP編碼後的傳輸數據。
其UDP的整個的加密,認證,簽名模型如下:
H. Quorum介紹
Quorum和以太坊的主要區別:
Quorum 的主要組件:
1,用其自己實現的基於投票機制的共識方式 來代替原來的 「Proof of work」 。
2,在原來無限制的P2P傳輸方式上增加了許可權功能。使得P2P傳輸只能在互相允許的節點間傳輸。
3, 修改區塊校驗邏輯使其能支持 private transaction。
4, Transaction 生成時支持 transaction 內容的替換。這個調整是為了能支持聯盟中的私有交易。
Constellation 模塊的主要職責是支持 private transaction。Constellation 由兩部分組成:Transaction Manager 和 Enclave。Transaction Manager 用來管理和傳遞私有消息,Enclave 用來對私有消息的加解密。
在私有交易中,Transaction Manager 會存儲私有交易的內容,並且會將這條私有交易內容與其他相關的 Transaction Manager 進行交互。同時它也會利用 Enclave 來加密或解密其收到的私有交易。
為了能更有效率的處理消息的加密與解密,Quorum 將這個功能單獨拉出並命名為 Enclave 模塊。Enclave 和 Transaction Manager 是一對一的關系。
在 Quorum 中有兩種交易類型,」Public Transaction」 和 「Privat Transaction」。在實際的交易中,這兩種類型都採用了以太坊的 Transaction 模型,但是又做了部分修改。Quorum 在原有的以太坊 tx 模型基礎上添加了一個新的 「privateFor」 欄位。同時,針對一個 tx 類型的對象添加了一個新的方法 「IsPrivate」。用 「IsPrivate」 方法來判斷 Transaction是 public 還是 private,用 「privateFor」 來記錄 事務只有誰能查看。
Public Transaction 的機理和以太坊一致。Transaction中的交易內容能被鏈上的所有人訪問到。
Private Transaction 雖然被叫做 「Private」,但是在全網上也會出現與其相關的交易。只不過交易的明細只有與此交易有關系的成員才能訪問到。在全網上看到的交易內容是一段hash值,當你是交易的相關人員時,你就能利用這個hash值,然後通過 Transaction Manager 和 Enclave 來獲得這筆交易的正確內容。
Public Transaction的處理流程和以太坊的Transaction流程一致。Transaction 廣播全網後,被礦工打包到區塊中。節點收到區塊並校驗區塊中的 事務 信息。然後根據 Transaction信息更新本地的區塊
Private Transaction也會將 Transaction 廣播至全網。但是它的 Transaction payload已經從原來的真實內容替換為一個hash值。這個hash值是由Transaction Manager提供的。
有兩個共識機制:QuorumChain Consensus 和 Raft-Based Consensus。
在 Quorum 1.2 之前的 Release 版本都採用了 QuorumChain。
從 2.0 版本開始,Quorum 廢棄了 QuorumChain 轉而只支持 Raft-based Consensus。
QuorumChain Consensus 是一個基於投票的共識演算法。其主要特點有:
相比較以太坊的POW,Raft-based 提供了更快更高效的區塊生成方式。相比 QuorumChain,Raft-based 不會產生空的區塊,而且在區塊的生成上比前者更有效率。
要想了解Raft-based Consensus,必須先了解Raft演算法
Raft演算法
Raft是一種一致性演算法,是為了確保容錯性,也就是即使系統中有一兩個伺服器當機,也不會影響其處理過程。這就意味著只要超過半數的大多數伺服器達成一致就可以了,假設有N台伺服器,N/2 +1 就超過半數,代表大多數了。
Raft的工作模式:
raft的工作模式是一個Leader和多個Follower模式,即我們通常說的領導者-追隨者模式。除了這兩種身份,還有Candidate身份。下面是身份的轉化示意圖
1,leader的選舉過程
raft初始狀態時所有server都處於Follower狀態,並且隨機睡眠一段時間,這個時間在0~1000ms之間。最先醒來的server A進入Candidate狀態,Candidate狀態的server A有權利發起投票,向其它所有server發出投票請求,請求其它server給它投票成為Leader。
2,Leader產生數據並同步給Follower
Leader產生數據,並向其它Follower節點發送數據添加請求。其它Follower收到數據添加請求後,判斷該append請求滿足接收條件(接收條件在後面安全保證問題3給出),如果滿足條件就將其添加到本地,並給Leader發送添加成功的response。Leader在收到大多數Follower添加成功的response後。提交後的log日誌就意味著已經被raft系統接受,並能應用到狀態機中了。
Leader具有絕對的數據產生權利,其它Follower上存在數據不全或者與Leader數據不一致的情況時,一切都以Leader上的數據為主,最終所有server上的日誌都會復製成與Leader一致的狀態。
Raft的動態演示: http://thesecretlivesofdata.com/raft/
安全性保證,對於異常情況下Raft如何處理:
1,Leader選舉過程中,如果有兩個FollowerA和B同時醒來並發出投票請求怎麼辦?
在一次選舉過程中,一個Follower只能投一票,這就保證了FollowerA和B不可能同時得到大多數(一半以上)的投票。如果A或者B中其一幸運地得到了大多數投票,就能順利地成為Leader,Raft系統正常運行下去。但是A和B可能剛好都得到一半的投票,兩者都成為不了Leader。這時A和B繼續保持Candidate狀態,並且隨機睡眠一段時間,等待進入到下一個選舉周期。由於所有Follower都是隨機選擇睡眠時間,所以連續出現多個server競選的概率很低。
2,Leader掛了後,如何選舉出新的Leader?
Leader在正常運行時候,會周期性的向Follower節點發送數據的同步請求,同時也是起到一個心跳作用。Follower節點如果在一段時間之內(一般是2000ms左右)沒有收到數據同步請求,則認為Leader已經死了,於是進入到Candidate狀態,開始發起投票競選新的Leader,每個新的Leader產生後就是一個新的任期,每個任期都對應一個唯一的任期號term。這個term是單調遞增的,用來唯一標識一個Leader的任期。投票開始時,Candidate將自己的term加1,並在投票請求中帶上term;Follower只會接受任期號term比自己大的request_vote請求,並為之投票。 這條規則保證了只有最新的Candidate才有可能成為Leader。
3,Follower的數據的生效時間
Follower在收到一條添加數據請求後,是否立即保存並將其應用到狀態機中去?如果不是立即應用,那麼由什麼來決定該條日誌生效的時間?
首先會檢查這條數據同步請求的來源信息是否與本地保存的leader信息符合,包括leaderId和任期號term。檢查合法後就將日誌保存到本地中,並給Leader回復添加log成功,但是不會立即將其應用到本地狀態機。Leader收到大部分Follower添加log成功的回復後,就正式將這條日誌commit提交。Leader在隨後發出的心跳append_entires中會帶上已經提交日誌索引。Follower收到Leader發出的心跳append_entries後,就可以確認剛才的log已經被commit(提交)了,這個時候Follower才會把日誌應用到本地狀態機。下表即是append_entries請求的內容,其中leaderCommit即是Leader已經確認提交的最大日誌索引。Follower在收到Leader發出的append_entries後即可以通過leaderCommit欄位決定哪些日誌可以應用到狀態機。
4,向raft系統中添加新機器時,由於配置信息不可能在各個系統上同時達到同步狀態,總會有某些server先得到新機器的信息,有些server後得到新機器的信息。比如在raft系統中有三個server,在某個時間段中新增加了server4和server5這兩台機器。只有server3率先感知到了這兩台機器的添加。這個時候如果進行選舉,就有可能出現兩個Leader選舉成功。因為server3認為有3台server給它投了票,它就是Leader,而server1認為只要有2台server給它投票就是Leader了。raft怎麼解決這個問題呢?
產生這個問題的根本原因是,raft系統中有一部分機器使用了舊的配置,如server1和server2,有一部分使用新的配置,如server3。解決這個問題的方法是添加一個中間配置(Cold, Cnew),這個中間配置的內容是舊的配置表Cold和新的配置Cnew。這個時候server3收到添加機器的消息後,不是直接使用新的配置Cnew,而是使用(Cold, Cnew)來做決策。比如說server3在競選Leader的時候,不僅需要得到Cold中的大部分投票,還要得到Cnew中的大部分投票才能成為Leader。這樣就保證了server1和server2在使用Cold配置的情況下,還是只可能產生一個Leader。當所有server都獲得了添加機器的消息後,再統一切換到Cnew。raft實現中,將Cold,(Cold,Cnew)以及Cnew都當成一條普通的日誌。配置更改信息發送Leader後,由Leader先添加一條 (Cold, Cnew)日誌,並同步給其它Follower。當這條日誌(Cold, Cnew)提交後,再添加一條Cnew日誌同步給其它Follower,通過Cnew日誌將所有Follower的配置切換到最新。
Raft演算法和以太坊結合
所以為了連接以太坊節點和 Raft 共識,Quorum 採用了網路節點和 Raft 節點一對一的方式來實現 Raft-based 共識
一個Transaction完整流程
1,客戶端發起一筆 Transaction並通過 RPC 來呼叫節點。
2,節點通過以太坊的 P2P 協議將節點廣播給網路。
3,當前的 Raft leader 對應的以太坊節點收到了 Transaction後將它打包成區塊。
區塊被 編碼後傳遞給對應的 Raft leader。
leader 收到區塊後通過 Raft 演算法將區塊傳遞給 follower。這包括如下步驟:
3.1,leader 發送 AppendEntries 指令給 follower。
3.2,follower 收到這個包含區塊信息的指令後,返回確認回執給 leader。
3.3,leader 收到不少於指定數量的確認回執後,發送確認 append 的指令給 follower。
3.4,follower 收到確認 append 的指令後將區塊信息記錄到本地的 Raft log 上。
3.5,Raft 節點將區塊傳遞給對應的 Quorum 節點。Quorum 節點校驗區塊的合法性,如果合法則記錄到本地鏈上。
參考鏈接: http://blog.csdn.net/about_blockchain/article/details/78684901
I. 以太坊技術系列-以太坊數據結構
本篇文章和大家介紹一下以太坊的數據結構,上篇文章我們提到,以太坊為了實現智能合約這一功能,使用了基於賬戶的模型。我們來看看以太坊中數據結構。
既然是基於賬戶的模型,我們需要通過賬戶地址找到賬戶的狀態。就像通過銀行卡號可以找到你在銀行中的各種信息一樣。最簡單的想法當然是一個簡單的哈希表 key是賬戶地址 value是賬戶狀態。但這里有個問題解決不了。
輕節點如何校驗賬戶合法性?
上篇我們說過,區塊鏈中有2類節點,全節點和輕節點,輕節點只會存儲block header,所以輕節點如何才能校驗賬號是否合法呢?
這個思路和我們平時用的md5校驗一致,我們會對區塊內的信息進行hash運算從而得出區塊內信息唯一確定的值,區塊鏈所有節點中這個值都是相同的。
在這個過程中我們用到了一種數據結構Merkle Tree(哈希樹),我們先看下Merkle Tree(哈希樹)的示意圖。
上篇文章說到區塊鏈中的鏈表(哈希鏈)和我們平時常見鏈表不同的是將指針從地址改為了hash指,這里也一樣,哈希樹和二叉樹的區別有2個
1.將地址改為了哈希值
2.只有葉子節點存儲數據
回到之前的問題輕節點是如何校驗1個賬戶或交易是否是在鏈上的呢?
整個流程如上圖所示
1.輕節點需要判斷1個賬號是否合法
2.輕節點由於只存儲block header,所以拿到1個賬號的時候會向全節點發出請求
3.全節點存儲了所有賬戶狀態,將賬戶路徑中的需要計算用到的hash值返回給輕節點
4.輕節點本地進行計算根hash值,如果計算結果和自己存儲一致則賬戶合法,不一致則不合法。
那以太坊中的賬戶信息的數據結構就是這樣嗎?
直接用這樣的數據結構來存儲賬戶信息會有2個問題
查找困難
生成hash值不確定
第1個問題應該比較容易發現,在這個樹中尋找1個賬號需要的復雜度是O(n),因為沒有任何順序。
第2個問題其實也是因為無序導致的,無序的組合每個節點針對同一批賬戶生成的hash值不一致,這就導致無法達成共識。
既然2個問題都和順序有關,那我們類似二叉排序樹一樣,使用哈希排序樹是不是就可以解決問題了呢?
使用排序樹後會帶來另外1個問題
插入困難
因為要維持樹是有序的,很可能帶來樹結構的很大變動。
以太坊中使用了另外一種數據結構字典樹。和哈希樹不同,字典樹應該是很多地方都有使用。我們簡單來看下字典樹的結構。
字典樹能夠較好地解決哈希樹的2個缺點1.查找困難 2.生成的hash值不確定以及排序二叉樹的1個缺點 插入困難。
但字典樹我們可以看到可能樹的深度可能由於部分元素導致整棵樹深度非常深。
這時我們可以進一步優化,將相同路徑進行壓縮。這就是壓縮字典樹。
將哈希樹和壓縮字典樹結合,就可以得到以太坊存儲賬戶的最終數據結構-MPT。
將壓縮字典樹裡面的指針從地址改為指針,並且將數據存儲在葉子節點中即可。
介紹完狀態樹的數據結構,我們接下來討論1個問題,區塊中存儲的賬戶狀態是什麼樣的范圍。有2種選擇。
只保存當時區塊中產生交易的賬戶狀態。
保存全局所有的賬戶。
我們可以看下這2種方式,無非就是空間和時間的平衡,只保存當前區塊產生的交易意味著是做懶載入(需要的時候才去尋找賬戶),在區塊鏈中這個代價是非常大的,因為尋找的賬戶之前從未交易過,這樣會遍歷整個區塊鏈。另外一種保存全局的賬戶方式雖然看起來空間消耗較大,但查找快捷,而且空間的問題我們可以通過其他方式優化。所以最終以太坊選擇了第2種每個區塊都報錯全局所有賬戶的方式。
我們來看下以太坊中是如何保存狀態樹的。
可以看到以太坊中雖然每個區塊都保存了全部賬戶,但是會將未發生變化的賬戶狀態指向前1個節點,本身只存儲發生變化的狀態,這樣可以較大程度優化空間佔用。
介紹完以太坊中比較復雜的狀態樹後,我們繼續來看看以太坊中的另外兩棵樹,交易樹和收據樹。
首先介紹一下,為什麼需要交易樹&收據樹。
1.交易樹
雖然以太坊是基於賬戶的模型,但是就像銀行不僅會存儲銀行卡的余額,還會存儲卡中的每筆錢怎麼來的以及怎麼花的。交易樹中就存儲著當前區塊中的包含的所有交易。
2.收據樹
由於智能合約的引入增加了不少復雜性,所以以太坊用收據樹存儲著一些交易操作的額外信息。比如交易過程中執行日誌就包含在收據樹中方便查詢。收據樹和交易樹是一一對應的。每發生一次交易就會有一次收據。
和狀態樹不同交易樹和收據樹只維護當前區塊內發生的交易,因為當時區塊發生交易時不需要再去查找另外1個交易,也就之前需要可能遍歷整個區塊鏈的查找操作了。
由於以太坊中的出塊速度較快,我們進行一些查詢一些符合條件交易的時候會面臨大量數據遍歷困難的問題。收據樹中引入了布隆過濾器可以幫助我們有效緩解這一困難。
布隆過濾器將大集合中每個元素進行hash運算映射到1個較小的集合,這時再來1個元素要判斷是否在大集合的時候,不需要遍歷整個大集合,而是去進行hash運算去小集合中尋找是否存在,如果不存在,肯定不在大集合中,如果存在則不能說明任何問題。
如上圖所示,布隆過濾器只能證明某1個元素不在集合中,不能證明1個元素在結合中。
以太坊中如果我們要在較多區塊中尋找某1個交易,則可以利用布隆過濾器,過濾掉肯定不存在目標交易的區塊,然後進入收據樹內繼續利用布隆過濾器篩選,剩下的才是可能的目標交易的交易,進行一一比對即可。
我們介紹了以太坊的核心數據結構,狀態樹&交易樹&收據樹,他們都是使用相同的數據結構-哈希壓縮字典樹。但狀態樹是維護1顆全局賬戶樹,交易樹和收據樹則是維護本區塊內的交易或收據。
介紹完數據結構後,後面我們會用幾篇文章來介紹以太坊中的一些核心演算法,比如共識機制,挖礦演算法等。
J. 如何看待以太坊ETH2.0
我個人不是特別看好以太坊2.0。
以目前以太坊的發展情況來看,以太坊已經成為了世界上最大的一條公鏈,這點毫無疑問。伴隨著以太坊得進一步發展,我們會發現區塊鏈行業也取得了長足的進步。
一、我先講一下關於目前以太坊的現狀。
以太坊在這一次牛市中非常亮眼,換而言之,這一次的牛市就是因為以太坊上面的應用而拉起的。目前的以太坊有幾個困境:第1個困境是交易費率太高,嚇跑了很多人。第2個困境是交易速度太慢,網路擁堵問題非常嚴重。第3個困境是交易相對繁瑣,其他公鏈顯然要優於以太坊。這正是以太坊需要破局的地方,當以太坊升級到2.0以後,這些問題都會相應解決。