1、前言node
要了解以太坊,首先須要瞭解一下比特幣和區塊鏈;程序員
1.比特幣介紹算法
1.1 概念數據庫
比特幣由中本聰在2009年提出;是構建在區塊鏈技術之上的加密數字貨幣;比特幣使用分佈式帳簿記錄網絡中出現的每一筆交易;分佈式帳簿就是說這個帳簿會在不少網絡機器上存儲;比特幣是一種P2P形式的數字貨幣,點對點的傳輸意味着一個去中心化的支付系統。與大多數貨幣不一樣,比特幣不依靠特訂貨幣機構發行,它依據特定算法,經過大量的計算產生,比特幣經濟使用整個P2P網絡中衆多節點構成的分佈式數據庫來確認並記錄全部的交易行爲,並使用密碼學的設計來確保貨幣流通各個環節安全性。它以一個「無信任」的交易系統來運行—一個個體在不須要信任任何第三方或對方的狀況下進行點對點交易的架構。比特幣發行總量將永遠被限制在2100萬個。比特幣是基於區塊鏈技術的第一個落地應用。編程
1.2 比特幣利用到的核心以下:後端
(1)數字簽名技術數組
簽名和驗籤保護了每一筆交易和用戶帳戶的安全性;緩存
(2)哈希技術 安全
哈希技術構建了交易的帳本,也就是區塊,它具備不可篡改和可溯源的做用服務器
(3)博弈論(共識算法)
納什均衡的穩定狀態保證了沒有節點能夠經過不誠實的行爲得到更高的回報。做惡成本高。
1.3 關鍵術語解析:
礦工:其工做內容是產生初始帳簿,收集交易、填寫帳簿、驗證帳簿有效性等,比特幣是礦工工做量的一個報酬體現。從事虛擬貨幣挖礦的人,其實並不用親自動手,買一臺專用的計算設備,下一個挖礦軟件,保證礦機電力供應和網絡鏈接就能夠進行挖礦了。
工做量證實:是一種對應服務與資源濫用、或是阻斷服務攻擊的經濟對策。通常是要求用戶進行一些耗時適當的複雜運算,而且答案能被服務方快速驗算,以此耗用的時間、設備與能源作爲擔保成本,以確保服務與資源是被真正的需求所使用。工做量證實最經常使用的技術原理是散列函數。
比特幣挖礦:挖礦的本質則是在爭奪記帳權,是工做量證實的過程;
比特幣中還涉及到公鑰、私鑰、地址的概念;每一個交易都必須含有比特幣持股人的私鑰數字簽名,不然該筆交易就是無效的;
私鑰例子(純數字16進制展現):1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD
地址例子(包括數字和字母):1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy
2.區塊鏈介紹
2.1 區塊鏈概念
區塊鏈是多種技術整合的一個結果,包括數學、密碼學、經濟學、網絡科學等,這些技術以特定方式組合在一塊兒,造成一種新的去中心化數據記錄與存儲體系,如同一個分佈式帳本;區塊鏈是分佈式數據存儲、點對點傳輸、共識機制、加密算法等計算機技術的新型應用模式。所謂共識機制是區塊鏈系統中實現不一樣節點之間創建信任、獲取權益的數學算法。區塊鏈技術是比特幣的底層技術,比特幣是區塊鏈的第一個應用。
區塊鏈:由不少區塊組成的鏈條,能夠把區塊鏈簡單比喻爲一本帳本,把區塊比喻爲帳本的一頁記錄
區塊鏈具備「共享狀態的加密安全單機」;
共享狀態:在這一個系統中,存儲的狀態對每個人都是透明和開放的;
加密安全:是指數字貨幣的創造是經過複雜的數學算法來保證的,很難破解;相似系統防火牆,這使得你沒法在區塊鏈創造虛假或刪除交易記錄
安全單機:是指有一個單機實例,就能夠負責產生系統中全部的交易;
2.2 區塊鏈系統結構
區塊鏈系統由數據層、網絡層、共識層、激勵層、合約層和應用層組成
2.3 區塊鏈特色
區塊鏈具備以下特色:去中心化、開放性、自治性、信息不可篡改、數據可溯源、匿名性等特色;
a.去中心化:不存在中心化的硬件或管理機構,任意節點的權利和義務都是均等的;
b.開放性:系統是開放的,除了交易各方的私有信息被加密外,區塊鏈的數據對全部人公開,任何人均可以經過公開的接口查詢區塊鏈數據和開發相關應用,所以整個系統信息高度透明。
c.自治性:區塊鏈採用基於協商一致的規範和協議(好比一套公開透明的算法)使得整個系統中的全部節點可以在去信任的環境自由安全的交換數據,使得對「人」的信任改爲了對機器的信任,任何人爲的干預不起做用。
d.信息不可篡改:一旦信息通過驗證並添加至區塊鏈,就會永久的存儲起來,除非可以同時控制住系統中超過51%的節點,不然單個節點上對數據庫的修改是無效的,所以區塊鏈的數據穩定性和可靠性極高。
e.數據可溯源:區塊鏈是一個分散的數據庫,分散數據庫記錄了區塊鏈每筆交易的輸入輸出,從而能夠輕鬆的追蹤資產數量變化和交易活動
f.匿名性:因爲節點之間的交換遵循固定的算法,其數據交互是無需信任的(區塊鏈中的程序規則會自行判斷活動是否有效),所以交易對手無須經過公開身份的方式讓對方對本身產生信任,對信用的累積很是有幫助。
2.4 區塊鏈技術
區塊鏈主要解決的交易的信任和安全問題,所以它針對這個問題提出了四個技術創新:
第一個叫分佈式帳本,就是交易記帳由分佈在不一樣地方的多個節點共同完成,並且每個節點都記錄的是完整的帳目,所以它們均可以參與監督交易合法性,同時也能夠共同爲其做證。
第二個叫作非對稱加密和受權技術,存儲在區塊鏈上的交易信息是公開的,可是帳戶身份信息是高度加密的,只有在數據擁有者受權的狀況下才能訪問到,從而保證了數據的安全和我的的隱私。
第三個叫作共識機制,就是全部記帳節點之間怎麼達成共識,去認定一個記錄的有效性,這既是認定的手段,也是防止篡改的手段。區塊鏈提出了四種不一樣的共識機制,適用於不一樣的應用場景,在效率和安全性之間取得平衡。
最後一個技術特色叫智能合約,智能合約是基於這些可信的不可篡改的數據,能夠自動化的執行一些預先定義好的規則和條款。以保險爲例,若是說每一個人的信息(包括醫療信息和風險發生的信息)都是真實可信的,那就很容易的在一些標準化的保險產品中,去進行自動化的理賠。
2.5 區塊鏈的應用
2.5.1 區塊鏈1.0
是以比特幣爲表明的虛擬貨幣的時代,表明了虛擬貨幣的應用,包括其支付,流通等虛擬貨幣的職能.主要具有的是去中心化的數字貨幣交易支付功能,目標是實現貨幣的去中心化與支付手段。比特幣就是區塊鏈1.0最典型的表明
2.5.2 區塊鏈2.0
區塊鏈2.0是指智能合約,智能合約與貨幣相結合,對金融領域提供了更加普遍的應用場景,區塊鏈2.0的表明是'以太坊',以太坊 = 區塊鏈 + 智能合約
2.5.3 區塊鏈3.0
是指區塊鏈在金融行業以外的各行業的應用場景.可以知足更加複雜的商業邏輯.區塊鏈3.0被稱爲互聯網技術以後的新一代技術創新,足以推進更大的產業改革。區塊鏈3.0是爲了解決各行各業的互信問題與數據傳遞安全性的技術落地與實現。
2.6 區塊鏈總結
2.6.1 區塊鏈的去中介化、數據不可篡改及可溯源、共識(信任)機制等特性都將對現有社會產生很大沖擊;
信任角度看:
主流社會制度的「痛點」顯然不止「中心化」這麼一項,「信任」就是另一個「痛點」,尤爲是陌生人之間的信任。「信任」是個大問題,司法、貨幣、銀行、公證、徵信,甚至政府的存在等,幾乎都是爲了實現社會成員的守信和相互信任,「中心化」某種程度上也是由於「中心」更可信。
人們的信任都是創建在中介機構之上,這樣勢必相互之間交易的價值就會縮水;好比買賣房屋,買家和賣家之間達成交易的信任是創建在第三方房地產中介上的;勢必買賣雙方都須要支付一筆「信任」費用至第三方;假設第三方中介做假,那買賣雙方交易就會產生問題,這就涉及到複雜的維權了;而區塊鏈的出現對買賣雙方的信任關係直接創建在區塊鏈上;這樣就解決了買家與賣家之間信任的問題。
激勵機制
任何一種制度機制,首要的功能顯然應當是「激勵」,其次纔是約束,有效的激勵是社會進步真正的動力。比特幣、以太幣以及其餘各類虛擬代幣(token),正是區塊鏈具有激勵功能的體現。中本聰所設計的區塊鏈是試驗之做,自己並沒有商業價值,爲了引發關注、發展聯結點,同時激勵參與者不斷經過「挖礦」式計算來建立新的區塊,共同維護鏈條的延展存續,他必需要給予爲此而作出努力的人以「報酬」。
我的隱私看:
因爲人們之間的信任是創建在第三方機構(中心機構)之上,也就是說人們的我的隱私就都所有裸露在中心機構裏,不法分子很容易經過這些中心機構獲取到你的我的隱私,進行做惡,想一想這是多麼可怕的事情;而區塊鏈是徹底去中心化的,全部數據也是通過加密的;全部人要窺看別人的隱私都必須通過他本人的受權;假設區塊鏈我的私鑰丟失,將沒法找回其財產,這是區塊鏈隱私方面須要解決的問題。
數據不可篡改及可溯源看:
假設某個事物從產生到使用,其過程均記錄在區塊鏈上;那麼它在任什麼時候候都能追溯到它以前發生變化的任何狀態;它就起到了存證的做用;這就大大提升了現實社會存證難的問題;
從以上幾點分析能夠看到,區塊鏈生來就可信、精準、不可篡改。區塊鏈的出現改變的是人們之間信任的生活方式;當全部人習慣於這樣的一個生產關係的時候,不會以爲有多麼的不妥;就像在喬布斯發明蘋果手機以前 ,人們從未以爲鍵盤手機有什麼不適。在現實世界中,每一個人的人生階段都是處在各式各樣的關係契約中,全部人在各類契約約定下參與社會的生產和生活。區塊鏈技術最終將能促進生產關係虛擬化,推進生產力的發展。在此以前,區塊鏈還有很長的一段路要走。
2.6.2 目前區塊鏈的痛點
因爲其去中心化特性,須要每一個全量節點都存儲完整數據,並達成共識;隨着數據體量的增大,龐大的數據勢必會產生一系列問題,好比TPS性能、網絡傳輸等;程序一旦部署,更新難;
真正殺手級應用程序向淘寶微信等,須要具有如下特性:
a.須要超高速的數據處理能力,每秒處理上萬甚至幾十萬的交易
b.須要超大的存儲來保存海量數據
c.須要方便易用,讓一個我們爸媽輩的人通過短期的學習和練習也能使用,就如如今的微信聊天和支付同樣
現有的區塊鏈解決方案遠遠不能解決這三個問題
目前區塊鏈行業提出了不少解決方案,好比EOS的分片,分層,比特幣側鏈、子鏈技術等。
2、以太坊
1.以太坊概念
以太坊(Ethereum blockchain)在2013至2014年間由V神(Vitalik Buterin)提出,是一個開源的有智能合約功能的公共區塊鏈平臺,經過其專用加密貨幣以太幣(Ether)提供去中心化的虛擬機(「以太虛擬機」 Ethereum Virtual Machine)來處理點對點合約。以太坊經過一套圖靈完備的腳本語言(EthereumVirtual Machinecode,簡稱EVM語言)來創建應用,它相似於彙編語言。
以太坊是一個平臺,它上面提供各類模塊讓用戶來搭建應用,平臺之上的應用,其實就是合約,這是以太坊的核心;
2.名詞術語解析
汽油(Gas):Gas, 是以太坊系統裏對全部活動進行消耗資源計量的單位。在以太坊區塊鏈上實現了一個EVM(以太坊虛擬機)的代碼運行環境,在鏈上執行寫入操做時,網絡中的每一個全節點都會進行相同的計算並存儲相同的值,這種執行的消耗是昂貴的,爲了促使你們將能在鏈下進行的運算都不放到鏈上進行,也爲了獎勵礦工,所以在鏈上每執行一個寫入操做時,都須要支付必定的費用,用gas爲單位來計數,每一個在鏈上能夠執行的命令都設置了一個消耗的gas值,例:PUSH操做須要消耗3個gas,一次轉帳通常要消耗21000gas,gas使用ETH來支付。
gas limit:即單個區塊容許的最多gas總量,以此能夠用來決定單個區塊中能打包多少筆交易。咱們每一次交易或合約調用都要設置一個gas limit,若是該次操做所使用的gas數量小於或等於您所設置的gas limit,則會被執行,但若是gas總消耗量超過gas limit,全部的操做都會被重置,但費用依舊會被收取。在執行中實際消耗的gas值總和叫gas used,沒有使用完的gas會退還到原帳號。
gas price:在發起交易或合約調用時,咱們能夠本身設置gas的價格,即gas price,通常以GWei(1 ETH = 1000000000 GWei)爲單位。經過gas price能夠節省礦工費用,但也會減慢礦工打包的速度,礦工會優先打包gas price設置高的交易,若是您想加快轉帳,您能夠把gas price設置得更高,這樣您就能夠插隊靠前。實際支付的費用 = gas used * gas price。
Gas Limit和Gas Price表明發送方願意爲執行交易支付的最大金額。
例如,發送方將Gas Limit設置爲50,000,一個Gas Price設置爲20 gwei。這意味着發送者願意花費最多50,000 x 20 gwei,也就是:1,000,000,000,000,000 Wei(0.001以太幣)來執行這一交易。
以太幣(Ether):是Ethereum世界中使用的數字貨幣,也就是常說的以太幣,Ethereum系統裏全部的活動,均可以用Ether來計量(貨幣概念)
EVM:EVM代碼是以太坊虛擬機代碼,以太坊的區塊鏈能夠包含的編程語言的代碼。與賬戶相關聯的EVM 代碼在每次消息被髮到這個帳戶的時候被執行,而且具備讀/寫存儲和自身發送消息的能力。
3. 以太坊區塊鏈工做原理
以太坊區塊鏈,本質上是一個交易服務的狀態機;以太坊狀態機運行從一個元狀態(空白石板),交易執行時,就轉變成最終狀態,任什麼時候候的最終狀態都表明着以太坊區塊鏈的現狀;
以太坊系統中運行着數百萬筆交易,這些交易被分組歸類爲「區塊」。一個區塊包含一系列交易,每一個塊與其前面的區塊串聯在一塊兒。
要從一個狀態轉到另外一個狀態,必須證實交易是有效的。若是一個交易被認爲是有效的,就必須經過一個驗證過程,這一過程稱爲「挖礦」。網絡中任何聲明本身是「礦工」的節點均可以嘗試建立和驗證區塊,全世界有許多礦工試圖同時建立和驗證區塊。若是要在主區塊鏈上添加一個區塊,礦工必須比其餘競爭對手更快地對其證實。經過讓礦工提供數學證實來驗證每一個區塊的過程被稱爲「工做量證實」。一個礦工若是建立了新的區塊,就會當即廣播出去通知其餘節點進行該區塊有效性的驗證,這個驗證過程被稱爲「達成共識」。一個礦工建立的區塊若是被驗證經過了,那麼這個礦工就會獲得必定數額的價值回報(以太幣)。
若是鏈條被分開,即產生了多條鏈「分叉」,若是擁有多個狀態(或鏈條)會破壞整個系統,所以咱們一般會避免分叉,迫令人們選擇他們「相信」的鏈條。
爲了肯定哪一個路徑是最有效的,並防止分叉的發生,以太坊使用了一種叫作「GHOST協議」的機制。簡單地說,GHOST協議讓咱們必須選擇在鏈上作最多計算的路徑。肯定該路徑的一種方法是使用最新區塊的數量,來表示當前路徑中的區塊總數(不計算起源塊)。塊數越多,路徑越長,挖礦的難度越大,最終就必定會到達最新區塊。使用這個方式讓咱們對當前區塊鏈狀態的惟一版本達成一致。
4.以太坊主要組成部分
賬戶
Gas與費用
交易
區塊
交易執行
工做量證實
4.1 帳戶分兩種:外部帳戶(私人密鑰控制,無相關代碼關聯)、合約帳戶(合約代碼控制,與代碼關聯),合約帳戶不能自行產生新交易,只能根據它們收到的其餘交易進行交易;
4.2 Gas和費用:在以太坊中,費用的計算是一個很是重要的概念。在以太坊網絡上進行的每一筆交易都會產生費用ーー沒有免費的午飯!這筆費用被稱爲「Gas」。
4.3 交易能夠看作是一個由外部擁有的賬戶生成的序列化加密簽名指令,而後提交給區塊鏈
全部交易都包含如下組件:
Nonce:發送方發送的交易數量的計數;
gasPrice:發送方願意支付每單位Gas所需執行交易的Wei數量;
gasLimit:發送方願意支付的執行這一交易的Gas最大數量。這個數額是預先設定和支付的;
to:接收方的地址,在建立合約的交易中,合約賬戶地址還不存在,所以使用了空值;
Value:從發送方轉移到收件方的金額,在建立合約的交易中,這個Value做爲新建立合約帳戶內的起始餘額;
v, r, s:用於生成識別交易發送方的簽名;
Init(只存在於建立合同的交易中):用於初始化新合約賬戶的EVM代碼片斷,它只運行一次,而後被丟棄,當init第一次運行時,它會返回賬戶代碼的主體,這個代碼是與合約賬戶永久關聯的一段代碼;
data(只存在於消息調用中的可選字段):消息調用的輸入數據(即參數)。例如,若是一個智能合約充當域名註冊服務,那麼對該合約的調用可能會有諸如域名以及IP地址等輸入字段。
4.4 以太坊的區塊:全部交易都被組合成爲區塊
區塊頭
Parenthash:一個父區塊頭的哈希(這就是爲何區塊鏈被稱爲區塊「鏈」);
Ommershash:當前區塊ommer列表的哈希;
beneficiary:收取採礦費用的賬戶地址;
Stateroot:狀態樹的根節點哈希;
transactionsRoot:包含在此區塊中列出的全部交易樹根節點的哈希值;
receiptsRoot :包含本區塊中列出的全部交易樹根節點的哈希的收據;
logsBloom:一個由log組成的Bloom過濾器(數據結構);
difficulty:這個區塊的難度水平;
編號:當前區塊的記數(元區塊的編號爲0;每一個後續區塊的塊數增長1);
gasLimit:當前每一個區塊的Gas限制;
gasUsed:本區塊交易所使用的總Gas之和;
時間戳:這個區塊注入的unix時間戳;
extraData:與此區塊相關的其餘數據;
mixHash:當與nonce結合時,證實這個區塊執行了足夠計算的哈希值;
Nonce:當與mixHash結合時,證實這個區塊已經執行了足夠計算的哈希值;
每一個區塊頭包含三個樹結構:
狀態根(stateRoot);
交易根(transactionsRoot);
收據根(receiptsRoot)。
4.5 交易的執行:太坊協議中最複雜的部分
執行條件:
交易必須是正確的RLP格式(RLP是「遞歸長度前綴」的縮寫,是用於二進制數據編碼嵌套數組的數據格式,RLP是以太坊使用的序列化對象的格式)。
有效的交易簽名。
有效的交易nonce,回想一下,一個賬戶的nonce是從該賬戶發送的交易的統計,爲了有效,交易nonce必須與發送方賬戶的nonce相等。
交易的Gas限額必須等於或大於交易所使用的內部Gas;
發送方的帳戶餘額必須有足夠的以太幣來支付前期的Gas費用
交易開始執行。在交易的整個執行過程當中,以太坊都跟蹤「子狀態」。子狀態記錄交易中產生的信息,這些信息也是交易完成後所立刻須要用到的。具體來講,它包含:
自毀集合:交易完成後將丟棄的一組賬戶(若是有的話);
日誌序列:虛擬機代碼執行的存檔和可索引的檢查點;
退款餘額:交易完成後退還給發送者帳戶的餘額。
一旦處理完交易中的全部步驟,並假定沒有無效狀態,則經過肯定向發送方退還未使用的Gas數量,來最終斷定最終狀態。除了未使用的Gas外,發送方還從上文所的「退款餘額」中退還了一些餘額。
4.6 工做量證實(在覈心技術中主講)
5.以太坊關鍵技術
以太坊採用了許多信息安全及密碼學的相關技術,大體有5個,工做量證實(POW),橢圓曲線密碼,哈希函數,Merkle Tree,以及電子時間戳機制。
5.1 工做量證實
工做量證實機制(Proof of Work, POW)爲區塊鏈關鍵技術。主要特徵是工做者需要作出必定難度的工做才能得出結果,但驗證方卻能夠根據該結果很容易的檢查出工做者是否作了相對應的工做。
5.2 橢圓曲線密碼
在區塊鏈中使用的公鑰密碼算法是基於橢圓代數的特性開發的橢圓曲線算法。橢圓曲線算法的安全性依賴於著名的數學難題,離散對數問題。橢圓曲線密碼的加解密過程以下圖。
用戶Alice選定一條橢圓曲線Ep(a,b),並取橢圓曲線上一點,做爲基點P;用戶A選擇一個私有密鑰k,並生成公開密鑰L=kP;用戶A將Ep(a,b)和點L、P傳給用戶Bob;用戶Bob接到信息後,將待傳輸的明文編碼到Ep(a,b)上一點M,併產生一個隨機整數x(x小於r);用戶Bob計算點C1=M+xL,C2=xP;用戶Bob將C1,C2傳給用戶Alice;用戶Alice接到信息後,計算C1-LC2,結果就是點M。
橢圓曲線加密方法與RSA方法相比,有如下優勢:(1)安全性能更高。加密算法的安全性能通常經過該算法的抗攻擊強度來反映。ECC和其餘幾種公鑰系統相比,其抗攻擊性具備絕對的優點。如160bitECC與1024bitRSA、有相同的安全強度。(2)處理速度快,在私鑰處理上(簽名與解密),ECC遠比RSA快。(3)存儲空間佔用小,ECC的密鑰尺寸比RSA要小的多。
5.3 Merkle Tree
Merkle Tree多數是用來進行比對和驗證處理。Merkle Tree協議對以太坊的長期持續性能夠說是相當重要的。區塊鏈網絡中存儲全部區塊的所有數據的節點所需的內存空間急速增加。Merkle Tree協議使以太坊在運行過程當中,只需下載區塊頭,使用區塊頭確認工做量證實,而後只下載與其交易相關的默克爾樹「分支」。這使得節點只要下載整個區塊鏈的一小部分就能夠安全地肯定任何一筆比特幣交易的狀態和帳戶的當前餘額。
5.4 時間戳機制
在以太坊中,要求參與交易各方不可否認其行爲。這其中須要在通過數字簽名的交易上打上一個可信賴的時間戳,從而解決一系列的實際和法律問題。時間戳服務工做流程大體以下:首先用戶對文件數據進行Hash摘要處理;用戶提出時間戳的請求,Hash值被傳遞給時間戳服務器;時間戳服務器對哈希值和一個日期/時間記錄進行簽名,生成時間戳;時間戳數據和文件信息綁定後返還,用戶進行下一步電子交易操做。
5.5哈希函數
一個可靠的單向哈希函數必須具有如下特性:(1)輸入任意長度數據必須輸出固定長度的散列值;(2)可以快速計算出散列值;(3)輸入數據有細小差異也要致使散列值差異很大;(4)具有單向性,沒法根據散列值反推出原始數據。常見的單向散列函數包括MD4/MD五、SHA-1/SHA-256/SHA-384/SHA-5十二、RIPEMD/RIPEMD-160、以及以Keccak算法做爲標準的SHA-3系列函數。其中MD4/MD五、SHA-一、RIPEMD已經存在攻破的算法,不推薦在極其敏感環境下使用。以太坊中經常使用的哈希函數有SHA-256,Keccak-256等。
6. 源碼目錄結構
accounts 實現了一個高等級的以太坊帳戶管理 bmt 二進制的默克爾樹的實現 build 主要是編譯和構建的一些腳本和配置 cmd 命令行工具,又分了不少的命令行工具,下面一個一個介紹 /abigen Source code generator to convert Ethereum contract definitions into easy to use, compile-time type-safe Go packages /bootnode 啓動一個僅僅實現網絡發現的節點 /evm 以太坊虛擬機的開發工具, 用來提供一個可配置的,受隔離的代碼調試環境 /faucet /geth 以太坊命令行客戶端,最重要的一個工具 /p2psim 提供了一個工具來模擬http的API /puppeth 建立一個新的以太坊網絡的嚮導 /rlpdump 提供了一個RLP數據的格式化輸出 /swarm swarm網絡的接入點 /util 提供了一些公共的工具 /wnode 這是一個簡單的Whisper節點。 它能夠用做獨立的引導節點。此外,能夠用於不一樣的測試和診斷目的。 common 提供了一些公共的工具類 compression Package rle implements the run-length encoding used for Ethereum data. consensus 提供了以太坊的一些共識算法,好比ethhash, clique(proof-of-authority) console console類 contracts core 以太坊的核心數據結構和算法(虛擬機,狀態,區塊鏈,布隆過濾器) crypto 加密和hash算法, eth 實現了以太坊的協議 ethclient 提供了以太坊的RPC客戶端 ethdb eth的數據庫(包括實際使用的leveldb和供測試使用的內存數據庫) ethstats 提供網絡狀態的報告 event 處理實時的事件 les 實現了以太坊的輕量級協議子集 light 實現爲以太坊輕量級客戶端提供按需檢索的功能 log 提供對人機都友好的日誌信息 metrics 提供磁盤計數器 miner 提供以太坊的區塊建立和挖礦 mobile 移動端使用的一些warpper node 以太坊的多種類型的節點 p2p 以太坊p2p網絡協議 rlp 以太坊序列化處理 rpc 遠程方法調用 swarm swarm網絡處理 tests 測試 trie 以太坊重要的數據結構Package trie implements Merkle Patricia Tries. whisper 提供了whisper節點的協議。
7. 以太坊核心功能說明
7.1 以太坊智能合約帳戶
以太坊中的帳戶分兩種:外部帳戶和合約帳戶。
帳戶狀態由四個部分組成:nance(Number once的縮寫)交易數量或合約數量、balance以太幣數量、storageRoot 一個Merkle Patricia樹根節點的哈希、codeHash:EVM(以太坊虛擬機)的哈希值代碼。 對於合約賬戶,這是一個被哈希後並存儲爲codeHash的代碼。對於外部賬戶,codeHash字段是空字符串的哈希。
以太坊智能合約就是在以太坊虛擬機上運行的計算機程序。以太坊虛擬機是爲以太坊智能合約在容器沙箱中運行而設計的一個徹底隔離的環境。這意味着在以太坊虛擬機中運行的每一個智能合約都沒法訪問託管虛擬機的計算機上運行的網絡架構,文件系統或其餘進程。
以太坊網絡中有兩種賬戶:智能合約帳戶和外部擁有賬戶。每一個賬戶都由一個地址來標識,全部的賬戶共享相同的地址空間,即以太坊虛擬機接受長度爲160位的地址。
帳戶是160位字符索引;
每一個賬戶中都包含餘額,隨機數,字節碼和存儲的數據(簡稱存儲,下同)四個部分。但這兩種帳戶之間存在一些差別。例如,外部擁有賬戶並無代碼部分和存儲部分,而智能合約賬戶的這兩個部分分別存儲它們的字節碼和整個狀態樹的默克爾樹( Merkle Tree)根哈希。此外,外部擁有賬戶具備與其相應的私鑰,而智能合約賬戶卻沒有。智能合約賬戶除了對每筆以太坊交易進行常規的密碼學簽名以外,全部的操做都由智能合約中的代碼控制。
經過上圖,你會了解到,外部擁有帳戶由私鑰控制,且外部擁有帳戶中不包含以太坊虛擬機代碼,而智能合約帳戶含有以太坊虛擬機代碼,並由代碼控制。
7.2 MPT樹形結構
MPT其實是三種數據結構的組合,分別是Trie樹, Patricia Trie, 和Merkle樹
每個以太坊的區塊頭包含三顆MPT樹,分別是
這三類數據先存儲與緩存中,每次調用Commit操做的時候,會增長Trie樹的cache時代。 cache時代會被附加在node節點上面,若是當前的cache時代 - cachelimit參數 大於node的cache時代,那麼node會從cache裏面卸載,以便節約內存。 其實這就是緩存更新的LRU算法, 若是一個緩存在多久沒有被使用,那麼就從緩存裏面移除,以節約內存空間。
數據庫存儲db是後端的KV存儲,trie的結構最終都是須要經過KV的形式存儲到數據庫裏面去,而後啓動的時候是須要從數據庫裏面加載的;
序列化主要是指把內存表示的數據存放到數據庫裏面, 反序列化是指把數據庫裏面的Trie數據加載成內存表示的數據。 序列化的目的主要是方便存儲,減小存儲大小等。
proof證實是從根節點到葉子節點的全部節點的hash值列表。 VerifyProof方法,接受一個roothash值、proofDb證實和key列表來驗證key是否可以和數據庫裏面的可以對應上
以太坊中數據庫:
在Ethereum的世界裏,數據的最終存儲形式是[k,v]鍵值對,目前使用的[k,v]型底層數據庫是LevelDB;levelDB支持按照文件大小切分文件的功能,因此咱們看到的區塊鏈的數據都是一個一個小文件,其實這些小文件都是同一個levelDB實例。
上述數據單元如Block,stateObject,StateDB等,均大量使用Merkle-PatriciaTrie(MPT)數據結構以組織和管理[k,v]型數據。利用MPT高效的分段哈希驗證機制和靈活的節點(Node)插入/載入設計,調用方都可快速且高效的實現對數據的插入、刪除、更新、壓縮和加密。
7.3 以太坊虛擬機(EVM)
7.3.1 執行模式
實際處理交易的部分是以太坊本身的虛擬機,被稱爲EVM。就像以前定義的那樣,EVM是一個「圖靈完備」的虛擬機。惟一的不一樣是EVM有內在Gas的約束。所以,能夠完成的計算總量本質上受到所提供Gas數量的限制。
此外,EVM 有一個基於棧機器的架構。棧機器是一種使用「後入先出」的堆棧來保存臨時值的計算機。EVM中每一個棧條目的大小爲256位,最大爲1024位。這就是EVM與典型的馮·諾伊曼結構的不一樣,馮·諾伊曼結構中程序代碼是在內存或存儲中。
EVM也有本身的語言——EVM字節碼。當程序員在以太坊上寫智能合約的時候,一般用高級語言寫代碼,好比Solidity。而後,能夠編譯成EVM字節碼,以便EVM能夠理解執行。
7.3.2 以太坊虛擬機架構圖
a. 以太坊虛擬機在整個以太坊架構中的位置
b.以太坊虛擬機架構
c.以太坊的運行模型
7.4 消息調用機制
智能合約能夠經過消息調用機制調用其餘智能合約。
每當智能合約須要調用另外一個智能合約的函數時,它都會經過生成一個消息調用。每一個消息調用都有發送者,接收者,有效載荷,以太幣傳輸數量和必定量的以太坊燃料。消息調用的深度被限制爲小於1024級。
每一個智能合約均可以決定在消息調用時發送的燃料數量。
因爲每次消息調用均可以以燃料耗盡(out-of-gas,OOG)結束,爲了不安全問題,發送方要至少保留剩餘燃料的1/64。
經過這種機制,發送者能夠避免出現內部燃料耗盡異常,確保在耗盡燃料以前完成智能合約的執行。
以太坊虛擬機能夠經過消息調用來輸入外部數據,以太坊虛擬機能夠輸出日誌,也能夠給調用智能合約輸出返回值
以太坊虛擬機的數據管理
除了智能合約代碼,至少能夠區分出四種主要類型的數據:堆棧,calldata,內存和存儲。接下來依次對它們作出分析。
7.5 共識算法
目前以太坊採用 PoW 算法,並計劃逐步替換成 PoS。
目前主流的共識算法主要包括:POW、POS、DPOS、PBFT、PAXOS、RAFT等
7.5.1 POW:Proof of Work,工做證實。(最終一致性,適用公有鏈)
要獲得合理的Block Hash須要通過大量嘗試計算,計算時間取決於機器的哈希運算速度。尋找合理hash是一個機率事件。當節點擁有佔全網n%的算力時,該節點即有n/100的機率找到Block Hash。
簡單說明:pow主要是依靠計算機的機器的性能(計算能力)來出塊,性能越高,出塊機率越大;就是誰更有權,誰就更容易產生塊;這會致使大量資源浪費、網絡性能低、算力太集中偏離了去中心化軌道;
7.5.2 POS:Proof of Stake,股權證實。(最終一致性,適用公有鏈)
PoS 試圖解決 PoW 機制中大量資源被浪費的狀況。這種機制經過計算你持有佔總幣數的百分比以及佔有幣數的時間來決定記帳權。每出一次塊,時間會清零從新計算;PoS 就是資本主義,按錢分配,錢生錢。POS雖然解決了POW的能耗的問題,但全節點確認會讓區塊確認的效率提不起來,且時間越長,也越容易產生馬太效應,即持有幣越多的人會得到更多的幣獎勵,從而加大貧富差距,最終產生超過50%的中心化節點
7.5.3 DPOS:Delegated Proof of Stake,委任權益證實(最終一致性,適用公有鏈)
股份受權證實機制(又稱受託人機制),它的原理是讓每個持有比特股的人進行投票,由此產生101位表明 , 咱們能夠將其理解爲101個超級節點或者礦池,而這101個超級節點彼此的權利是徹底相等的。DPOS有點像是議會制度或人民表明大會制度。優勢是整個網絡的能耗大大降低,網絡運行成本更低;理論上更去中心化;缺點小散投票積極性不高,壞節點不能被即時處理,老是要通過一個選舉才能清除壞節點。
7.5.4 PBFT:Practical Byzantine Fault Tolerance,實用拜占庭容錯算法。(強一致性,適用私有鏈聯盟鏈)
n是總投票人數,f是叛徒人數,因爲多數者勝,因此只有當n-2f>f的狀況下,將軍纔會作出正確的決定,即n>3f,n最小須要取3f+1。最終決定是由中心節點肯定;
拜占庭容錯系統一致性協議至少包括五個階段:請求(request)、序號分配(pre-prepare)、相互交互(prepare)、序號確認(commit)和響應(reply)
7.5.5 PAXOS(強一致性,適用私有鏈聯盟鏈)
Paxos解決這一問題利用的是選舉,少數服從多數的思想,只要2N+1個節點中,有N個以上贊成了某個決定,則認爲系統達到了一致;
Paxos看上去是一個無主的協議,但實際上在paxos的第一個階段,就是一個leader搶奪戰,每一個主機在第一階段都會有一個提案編號,這個提案編號越大,則優先級越高。Paxos第一階段要得到主動權,另外還須要把數據肯定,這樣才能展開第二個階段
paxos共識系統包含五種角色:Client(客戶端)、Proposer(提議者)、Acceptor(接收者)、Learner(學習者)、Leader(領導者)
7.5.6 RAFT
raft的第一階段(選主)則不涉及到數據的問題,raft的第一個階段直選主,由於leader一旦肯定,那麼數據也就隨之肯定了,由於raft的數據是單向的從leader向follower流動的。
(1)Leader在時。由Leader向Follower同步日誌
(2)Leader掛掉了,選一個新Leader,Leader選舉算法。
7.6 以太坊分析
7.6.1 以太坊Gas
以太坊整個系統的運行圍繞着Gas燃料,Gas至關於以太坊的血液;每筆交易都必須設定必定Gas,區塊鏈每筆交易的肯定都須要消耗必定的Gas;Gas簡單理解就是交易費用的手續費,也可理解爲小費。Gas只存在於Ethereum虛擬機的內部,做爲執行多少工做的計算數量。
初看這個會以爲有點奇怪。 爲什麼不直接在以太網絡中計算出手續費?
答案是,以太網絡,如比特幣,擁有快速變化市場價格!但計算成本不會由於以太網絡幣價的變化而上漲或降低。 因此將計算的價格與以太幣token的價格分開是有幫助的,每次幣價市場走動時,操做的成本都沒必要改變。
而以太坊每筆交易收取費用的目的是使整個網絡不會因用戶的不當使用而變得負擔太重。
7.6.2 智能合約
一個智能合約是一套以數字形式定義的承諾(Promises),包括合約參與方 能夠在上面執行這些承諾的協議。定義中的一套承諾指的是合約參與方贊成的(常常是相互的)權利和義務。這些 承諾定義了合約的本質和目的。以一個銷售合約爲典型例子。賣家承諾發送貨物,買 家承諾支付合理的貨款。數字形式意味着合約不得不寫入計算機可讀的代碼中。這是 必須的,由於只要參與方達成協定,智能合約創建的權利和義務是由一臺計算機或者 計算機網絡執行的。在區塊鏈技術出現之前,智能合約因爲沒有可信的執行環境,一直 沒有流行起來。區塊鏈爲智能合約提供了可信的執行環境,因此智能合約的概念在區 塊鏈領域從新流行起來,並被應用到實踐之中。這也就是以太坊如此流行重要緣由之一。
4、目前以太坊問題
目前的以太坊存在的問題還不少,好比一直都存在的可擴展性問題,因爲以太坊節點須要存儲這個區塊鏈網絡上發生的全部事情,所以存儲成本很是昂貴,而且這種成本可能會隨着系統的擴展而呈現指數增加。針對這一問題,以太坊的創始人提出了「分片」的解決方案,具體思想是標是將狀態以某種形式進行分片, 從而讓多個在大多數狀況下獨立的應用程序以並行的方式處理。很天然地,咱們會懷疑,在分片以後,發起一筆交易將就只會在涉及到的幾個節點間引發波動,還能確保它們相互之間傳遞的信息的真實性嗎?針對這一問題,以太坊是依靠驗證管理合約來保證真實性的。每個區塊,和每個分片,都會通過隨機可靠的驗證管理合約核實查證。
三. 將來區塊鏈見解
基於目前區塊鏈的火熱,將來會出現格式各樣的區塊鏈產品:
一類是各式各樣的數字貨幣,勢必會產生一堆須要解決的問題,好比你們的區塊鏈產品都基於本身發行數字貨幣爲激勵制度,隨着區塊鏈產品的不斷增長,那麼礦工的選擇有有限,那是否會產生不少被節點遺棄區塊鏈產品呢?那是否會出現一種統一的發幣鏈激勵制度呢?
二類是公有鏈、私有鏈、聯盟鏈等在種類的多樣性;另外因爲多種鏈的存在,就涉及TPS性能問題以及鏈與鏈之間交互問題;會不會出現一種專門用於連接它們的獨立鏈呢?
三類是技術標準:日前有專家表示,區塊鏈就像是1992年的互聯網,標準化尚未徹底作完,應用和推廣還會受到限制,處在早期的技術儲備階段,一旦有了標準,各類技術研發才能走得下去。區塊鏈技術的突破也是影響它發展重要因素,因此在技術的深究上對於技術開發人員將是一個空前的機會。
理論上言,能夠將現實生活中互聯網可及的全部事物都裝在一個巨大的區塊鏈中,從而完全解決平等、公平、失信、犯罪等一切問題,區塊鏈技術彷佛也蘊含了這樣遠大的理想。但這種理想無異於「烏托邦」,不只科技水平不支持,世俗國家林立的世界也不容許存在這樣的「鏈」。
區塊鏈目前的實用價值尚且不高。但在多方當事人參與,且呈流程化延展的交易場景裏,好比供應鏈交易、票據流通,乃至訴訟程序等場合,區塊鏈無疑具備明顯的應用優點,實踐中成功的案例也在不斷涌現。
技術從不因人而停滯,人卻因技術而解放。將來,隨着互聯技術的不斷進步,信息傳輸速度和軟硬件性能的不斷提升,相信區塊鏈終將克服全部障礙,而成爲最有效、最流行的技術方案,其所蘊含的全新的制度機制也必將綻開出人類文明之花。