在以前的文章中,我們分別了解了比特幣挖礦和以太坊挖礦的區別。本文重點介紹以太坊挖礦及礦機部分。
以太坊是一個開源的有智能合約功能的公共區塊鏈平台,通過其專用加密貨幣ETH提供去中心化的以太虛擬機來處理點對點合約。目前ETH的挖礦主要是通過顯卡礦機,所謂顯卡礦機,其實就是類似家用台式機,只不過每台機器裡面有6-10張顯卡,並且沒有顯示器(如圖)。
圖:顯卡礦機
之所以以太坊沒有發展出類似於BTC一樣的ASIC礦機,主要是由於ETH的特殊挖礦機制決定的。
在ETH挖礦過程中,會產生一個DAG文件,該文件需要一直被調用,因此必須有專門的存儲空間放置。這個對於存儲空間的硬性需求會導致即使生產出來了ASIC晶元,也並不能大幅度降低單位算力的成本。簡單來說,就是性價比很差。
以太坊的DAG大小自2016年6月份引入Dagger-Hashimoto 演算法時的1GB開始,以每年約520MB的速度增大到了現在的 3.7G,預計2020年底以太坊的DAG大小將增加至4G。屆時,顯存小於4G的顯卡都將被陸續淘汰。
還需要介紹一點的是,由於顯卡礦機的體積通常是比特幣礦機的2-4倍,而消耗的電力卻只有比特幣礦機的1/2甚至更低,這就導致一般人不願意修建專門的顯卡礦機礦場(因為礦場主要賺取的是電費差價,同樣面積的場地,可以放置的顯卡數量少,消耗的電量更少)。即使有少量的顯卡礦場,收取的電費成本通常也比比特幣礦機礦場的高。
⑵ 以太坊stratum協議原理
參照比特幣的 stratum協議 和 NiceHash的stratum協議規范 編寫了一版以太坊版本的stratum協議說明.
stratum協議是目前最常用的礦機和礦池之間的TCP通訊協議。
以太坊是一個去中心化的網路架構,通過安裝Mist客戶端的節點來轉發新交易和新區塊。而礦機、礦池也同時形成了另一個網路,我們稱之為礦工網路。
礦工網路分成礦機、礦池、錢包等幾個主要部分,有時礦池軟體與錢包安裝在一起,可合稱為礦池。
礦機與礦池軟體之間的通訊協議是 stratum ,而礦池軟體與錢包之間的通訊是 bitcoinrpc 介面。
stratum是 JSON 為數據格式.
礦機啟動,首先以 mining.subscribe 方法向礦池連接,用來訂閱工作。
礦池以 mining.notify 返回訂閱號、ExtraNonce1和ExtraNonce2_size。
Client:
Server:
其中:
是 訂閱號 ;
080c是 extranonce ,Extranonce可能最大3位元組;
礦機以 mining.authorize 方法,用某個帳號和密碼登錄到礦池,密碼可空,礦池返回 true 登錄成功。該方法必須是在初始化連接之後馬上進行,否則礦機得不到礦池任務。
Client:
Server:
難度調整由礦池下發給礦機,以 mining.set_difficulty 方法調整難度, params 中是難度值。
Server:
礦機會在下一個任務時採用新難度,礦池有時會馬上下發一個新任務並且把清理任務設為true,以便礦機馬上以新難度工作。
該命令由礦池定期發給礦機,當礦機以 mining.subscribe 方法登記後,礦池應該馬上以 mining.notify 返回該任務。
Server:
任務ID : bf0488aa ;
seedhash : 。每一個任務都發送一個seedhash來支持盡可能多的礦池,這可能會很快地在貨幣之間交換。
headerhash : 。
boolean cleanjobs : true 。如果設為true,那麼礦工需要清理任務隊列,並立即開始從事新提供的任務,因為所有舊的任務分享都將導致陳舊的分享錯誤。如果是 false 則等當前任務結束才開始新任務。
礦工使用seedhash識別DAG,然後帶著headerhash,extranonce和自己的minernonce尋找低於目標的share(這是由提供的難度而產生的)。
礦機找到合法share時,就以」 mining.submit 「方法向礦池提交任務。礦池返回true即提交成功,如果失敗則error中有具體原因。
Client:
任務ID : bf0488aa
minernonce : 6a909d9bbc0f 。注意minernonce是6個位元組,因為提供的extranonce是2個位元組。如果礦池提供3位元組的extranonce,那麼minernonce必須是5位元組
Server:
一般的礦機與礦池通訊過程就如下所示:
⑶ 以太坊技術系列-以太坊共識機制
區塊鏈的特點之一是去中心化。也就是節點會分布在各個地方組成分布式系統。各個節點需要對1個問題達成一致,理想情況下,只需要同步狀態即可。
如上圖所示 B節點將a=1=> a=2的狀態同步給 ACDE四個節點,這時系統中狀態變為a=2, 但如果其中有惡意節點 AE 收到通知後把a=1=>a=3修改為錯誤的節點,這個時候大家的狀態就不一致了,此時需要共識機制使系統中得到1個唯一正確的狀態。
如上面說到分布式系統存在惡意節點導致系統中狀態不一致的情況有1個比較著名的虛擬問題-拜占庭將軍問題。
拜占庭將軍問題是指,N個將軍去攻打一座城堡,如果大於一定數量的將軍同時進攻則可以攻打成功,如果小於則進攻失敗。將軍中可能存在叛徒。
這個時候有2種情況
1.如果2個叛徒都在BCDE中,那麼共識演算法需要讓其餘2個將軍聽從A的正確決策進攻城堡。
2.如果A是1個叛徒,共識演算法需要讓BCDE中剩餘的3個忠誠將軍保持一致。
這個問題有很多種解法,大家有興趣可以自行查閱(推薦學習PBFT),我們重點來看看以太坊中目前正在使用的Nakamoto 共識和將要使用的 Casper Friendly Finality Gadget共識是如何解決拜占庭將軍問題的。
說到Nakamoto共識和Casper Friendly Finality Gadget共識可能大家不太熟悉,但他們的部分組成應該都比較熟悉-POW(工作量證明)和POS(權益證明)。
POW或POS稱之為Sybil抗性機制,為什麼需要Sybil抗性機制呢,剛剛我們說到拜占庭將軍問題,應該很容易看出惡意節點越多,達成正確共識的難度也就越大,Sybil攻擊就是指1個攻擊者可以偽裝出大量節點來進行攻擊,Sybil抗性是指抵禦這種攻擊能力。
POW通過讓礦工或驗證者投入算力,POS通過讓驗證者質押以太坊,如果攻擊者要偽裝多個節點攻擊則必將投入大量的算力或資產,會導致攻擊成本高於收益。在以太坊中保障的安全性是除非攻擊者拿到整個系統51%算力或資產否則不可能進攻成功。
在解決完Sybil攻擊後,通過選取系統中的最長鏈作為大家達成共識的鏈。
很多人平時為了簡化將pow和pos認為是共識機制,這不夠准確,但也說明了其重要作用,我們接下來分析pow和pos。
通過hash不可逆的特性,要求各個礦工不停地計算出某個值的hash符合某一特徵,比如前多少位是000000,由於這個過程只能依賴不停的試錯計算hash,所以是工作量證明。計算完成後其他節點驗證的值符合hash特徵非常容易驗證。驗證通過則成為成為合法區塊(不一定是共識區塊,需要在最長鏈中)。
以太坊中的挖礦演算法用到2個數據集,1個小數據集cache,1個大數據集DAG。這2個數據集會隨著區塊鏈中區塊增多慢慢變大,初始大小cache為16M DAG為1G。
我們先來看這2個數據集的生成過程
cache生成規則為有1個種子隨機數seed,cache中第1個元素對seed取hash,後面數組中每個元素都是前1個元素取hash獲得。
DAG生成規則為 找到cache中對應的元素後 根據元素中的值計算出下次要尋找的下標,循環256次後獲得cache中最終需要的元素值進行hash計算得到DAG中元素的值。
然後我們再看看礦工如何進行挖礦以及輕節點如何驗證
礦工挖礦的過程為,選擇Nonce值映射到DAG中的1個item,通過item中的值計算出下次要找的下標,循環64次,得到最終item,將item中的值hash計算得到結果,結果和target比較,符合條件
則證明挖到區塊,如果不符合則更換nonce繼續挖礦。礦工在挖礦過程中需要將1G的DAG讀取到內存中。
輕節點驗證過程和礦工挖礦過程基本一致,
將塊頭裡面的Nonce值映射到DAG中的1個item,然後通過cache數組計算出該item的值,通過item中的值計算出下次要找的下標,循環64次,得到最終item,將item中的值hash計算得到結果,結果和target比較,符合條件則驗證通過。輕節點在驗證過程中不需要將1G的DAG讀取到內存中。每次用到DAG的item值都使用cache進行計算。
以太坊為什麼需要這2個不同大小的數組進行輔助hash運算呢,直接進行hash運算會有什麼問題?
如果只是進行重復計算會導致挖礦設備專業化,減少去中心化程度。因為我們日常使用的計算機內存和計算力是都需要的,如果挖礦只需要hash運算,挖礦設備則會設計地擁有超高算力,但對內存可以縮小到很小甚至沒有。所以我們選用1G的大內存增加對內存訪問的頻率,增加挖礦設備對內存訪問需求,從而更接近於我們日常使用的計算機。
我們看看在Nakamoto共識是如何解決拜占庭將軍問題的。首先看看區塊鏈中的拜占庭將軍問題是什麼?
區塊鏈中需要達成一致的是哪條鏈為主鏈,雖然採用了最長鏈原則,但由於分叉問題,還是會帶來拜占庭將軍問題。
本來以太坊pow目標是抵抗51%以下的攻擊,但如上圖如果惡意節點沿著自己挖出的區塊不斷挖礦,由於主鏈上有分叉存在,惡意節點不需要達到51%算力就可以超過主鏈進而成為新的主鏈,為此以太坊使用了ghost協議給上圖中的B1和C1也分配出塊獎勵,盡快合並到主鏈中,這樣主鏈長度(按照合並後的總長度算,長度只是抽象概念,以太坊中按照區塊權重累加)還是大於惡意節點自己挖礦的。
網路中的用戶通過質押一定數量的以太坊成為驗證者。每次系統從這些驗證者從隨機選擇出區塊創建者,其餘驗證者去驗證創建出的區塊是否合法。驗證者會獲得出塊獎勵,沒有被選中的區塊不進行驗證則會被扣除一定質押幣,如果進行錯誤驗證則會被扣除全部質押幣。
如上圖,權益證明在每隔一定區塊的地方設置一個檢查點,對前面的區塊進行驗證,2/3驗證者通過則驗證通過,驗證通過則該區塊所在鏈成為最長合法鏈(不能被回滾)。
我們簡化地只分析了權益證明本身,在以太坊中權益證明較為復雜的點在於和分片機制結合在一起時的運行流程,這部分會在後面單獨將分片機制的一篇文章中詳述。
本篇文章主要討論了共識機制是解決分布式系統中的拜占庭將軍問題,以及分析了以太坊中的共識機制一般包括最長鏈選擇和一種sybil抗性機制(pow或pos)。重點分析了pow和pos的流程以及設計思想。後續將開始重點討論智能合約的部分。
⑷ 以太坊虛擬機(EVM)是什麼
以太坊是一個可編程的區塊鏈。與比特幣不同,以太坊並沒有給用戶提供一組預定義的操作(比如比特幣交易),而是允許用戶創建他們自己的操作,這些操作可以任意復雜。這樣,以太坊成為了多種不同類型去中心化區塊鏈的平台,包括但是不限於密碼學貨幣。
EVM為以太坊虛擬機。以太坊底層通過EVM模塊支持智能合約的執行和調用,調用時根據合約的地址獲取到代碼,生成具體的執行環境,然後將代碼載入到EVM虛擬機中運行。通常目前開發智能合約的高級語言為Solidity,在利用solidity實現智能合約邏輯後,通過編譯器編譯成元數據(位元組碼)最後發布到以坊上。
EVM架構概述
EVM本質上是一個堆棧機器,它最直接的的功能是執行智能合約,根據官方給出的設計原理,EVM的主要的設計目標為如下幾點:
簡單性
確定性
空間節省
為區塊鏈服務
安全性保證
便於優化
針對以上幾點通過對EVM源代碼的閱讀來了解其具體的設計思想和工程實用性。
EVM存儲系統機器位寬
EVM機器位寬為256位,即32個位元組,256位機器字寬不同於我們經常見到主流的64位的機器字寬,這就標明EVM設計上將考慮一套自己的關於操作,數據,邏輯控制的指令編碼。目前主流的處理器原生的支持的計算數據類型有:8bits整數,16bits整數,32bits整數,64bits整數。一般情況下寬位元組的計算將更加的快一些,因為它可能包含更多的指令被一次性載入到pc寄存器中,同時伴有內存訪問次數的減少。目前在X86的架構中8bits的計算並不是完全的支持(除法和乘法),但基本的數學運算大概在幾個時鍾周期內就能完成,也就是說主流的位元組寬度基本上處理器能夠原生的支持,那為什麼EVM要採用256位的字寬。主要從以下兩個方面考慮:
時間,智能合約是否能執行得更快
空間,這樣是否整體位元組碼的大小會有所減少
gas成本
時間上主要體現在執行的效率上,我們以兩個整型數相加來對比具體的操作時間消耗。32bits相加的X86
的匯編代碼
mov eax, dword [9876ABCD] //將地址9876ABCD中的32位數據放入eax數據寄存器
add eax, dword [1234DCBA] //將1234DCBA地址指向32位數和eax相加,結果保存在eax中
64bits相加的X86匯編代碼
mov rax, qword [123456789ABCDEF1] //將地址指向的64位數據放入64位寄存器
add rax, qword [1020304050607080] //計算相加的結果並將結果放入到64位寄存器中
鏈喬教育在線旗下學碩創新區塊鏈技術工作站是中國教育部學校規劃建設發展中心開展的「智慧學習工場2020-學碩創新工作站 」唯一獲準的「區塊鏈技術專業」試點工作站。專業站立足為學生提供多樣化成長路徑,推進專業學位研究生產學研結合培養模式改革,構建應用型、復合型人才培養體系。
⑸ 以太坊是騙人的嗎怎麼做
不是騙人的,必須要懂行的人帶你入行,不然不熟的人帶你你就會走進資金盤,做以太坊可以有兩個方向,
第一:下載交易所軟體在上面交易,跟股票交易一樣的,可以買多,也可以做空,也可以量化,也可以開合約,也可以開杠桿,總之跟股票操作差不多,這種來錢快,虧欠也快。
第二種:就是去廠家買顯卡或者礦機回來連網通電就可以在電腦上挖礦,每天都有收益可以提現,這個很輕松沒有風險,只有回本周期,這行就屬於投資越大回本越快賺得越多。
希望可以幫到你
⑹ 【深度知識】區塊鏈之加密原理圖示(加密,簽名)
先放一張以太坊的架構圖:
在學習的過程中主要是採用單個模塊了學習了解的,包括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的整個的加密,認證,簽名模型如下:
⑺ 以太坊解讀——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協議圖解(下)》 一文中,給出圖形化的解讀說明。
⑻ 以太坊是什麼
隨著區塊鏈技術的創新,一個新的平台誕生了,它就是以太坊。以太坊不像比特幣那樣只是一種加密貨幣,它還存在其它特徵,使其成為了一個巨大的分布式計算機。
那麼,到底什麼是以太坊?
具體來說,以太坊(Ethereum)是一個可編程、可視化、更易用的區塊鏈,它允許任何人編寫智能合約和發行代幣。就像比特幣一樣,以太坊是去中心化的,由全網共同記賬,賬本公開透明且不可竄改。
與比特幣不同的是,以太坊是可編程的區塊鏈,它提供了一套圖靈完備的腳本語言,因此,開發人員可以直接用C語言等高級語言編程,轉換成匯編語言,大大降低了區塊鏈應用的開發難度。
為了更易理解,打個比方,以太坊就像是區塊鏈里的Android,它是一個開發平台,讓我們可以像基於Android Framework一樣基於區塊鏈技術寫應用。它上面提供各種模塊讓用戶來搭建應用,如果將搭建應用比作造房子,那麼以太坊就提供了牆面、屋頂、地板等模塊,用戶只需像搭積木一樣把房子搭起來,因此在以太坊上建立應用的成本和速度都大大改善。
事實上,在沒有以太坊之前,寫區塊鏈應用是這樣的:拷貝一份比特幣代碼,然後去改底層代碼如加密演算法,共識機制,網路協議等等(很多山寨幣就是這樣,改改就出來一個新幣)。
至於以太坊如何運作?
與其它區塊鏈一樣,以太坊需要幾千人在自己的計算機上運行一個軟體,為該網路提供動力。網路中的每個節點(計算機)運行一個叫做以太坊虛擬機(EVM)的軟體。如果將以太坊虛擬機想像成一個操作系統,它能理解並執行通過以太坊特定編程語言編寫的軟體,由以太坊虛擬機執行的軟體/應用程序被稱為「智能合約」。
不過,在這台計算機上操作並不是免費的,需要支付該網路自帶的加密貨幣,叫做以太幣(Ether)。以太幣與比特幣大致相同,除了一點,即以太幣可以為在以太坊上執行智能合約而付費。
回到以太坊的發展史,以太坊的概念首次在2013至2014年間由程序員Vitalik Buterin受比特幣啟發後提出,大意為「下一代加密貨幣與去中心化應用平台」,在2014年通過ICO眾籌開始得以發展。
截至2018年2月,以太幣是市值第二高的加密貨幣,僅次於比特幣。
對於許多程序工程師和投資人而言,2015年7月30號這一天是一個大日子,經過18個月的醞釀期後,以太坊區塊鏈平台終於正式誕生了,當天在位於布魯克林的辦公室上午11:45左右,當以太坊區塊鏈產生第一個創世區塊,隨即有很多狂熱的礦工在後頭想要贏得第一個區塊,也就是以太坊專屬電子貨幣,以太幣的所有權。當時整個辦公室掌聲雷動,那一天天氣很糟糕,紐約一帶下了大雷雨,每個人的智能手機不時傳來嘈雜的洪水警告訊號。
根據該公司網站資料的說明,以太坊是一個去中心化的應用平台,以智能合約為例,設計師可以完全排除死機被監控,被詐騙或者是被第三方橫加干預的可能,跟比特幣一樣,以太坊利用以太幣吸引參加者,建立驗證交易平台的網路架構,維持網路架構的運作,並且以共識決定哪些是真正發生過存在的事件,但是以太坊和比特幣也有所不同,以太坊提供一些功能強大的工具,讓投入開發的人創造出去,具有去中心化的軟體服務,使用范圍可以從線上 游戲 橫跨到股票交易。
以太坊的構想源自於2013年,當時才19歲的俄裔加拿大人為例,維塔利克布特林,他當時跟比特幣的核心開發者爭論,區塊鏈網路架構需要有更穩固的手稿語言才能發展其他的應用軟體,不過他的想法沒有被採納,促成了他打定主意要開發一套符合自己理念的區塊鏈網路架構共識,這家公司可以說是他跨出的第一步,在以太坊區塊鏈上推出了應用軟體,如果我們把時間往回倒轉幾年,就會發現一個很有趣的對照。
有位大師托瓦茲推出Linux作業系統的舉動,正如布特林推出以太坊一樣如出一轍。共識系統公司的聯合創始人約瑟夫魯賓談到區塊鏈以太坊的興起時表示,我愈發覺得走上街頭去貼海報訴求是很浪費時間的一件事,倒不如一起合作,在這個失衡的 社會 的經濟體制帶來要比較實際得改變。
跟許多創業者一樣,魯賓提出的願望也很有企圖心,他不只想要創立一家了不起的公司,也想借機克服這個世界上難解的問題。這個公司的應用程序會對十多個其他領域的產業帶來震撼力十足的效果,他們的計劃包括分布式的三重記賬會計體系,針對原本廣受好評,但是後來卻因為集中管控兒而遭受爭議的reddit論壇推出分布式的新版本,自動執行的文件格式進行管理,系統現在叫智能合約,涵蓋商務 體育 和 娛樂 領域的預測市場、公開競標的能源市場、足以和蘋果電腦分庭抗禮的一整套可以供大規模協作集體創造,實現無管理階層公司之共同管理機制的商務工具。
以太坊Ethereum由V神(Vitalik Buterin)在2014年創辦,它是一個區塊鏈底層系統,類似於互聯網的操作系統,基於它開發的DAPP(去中心化應用)類似於基於互聯網操作系統開發的軟體APP。
它的出現主要是彌補比特幣的不足,比特幣只能實現點對點的電子現金交易系統,但是區塊鏈技術在其他場景的應用卻無法實現。如果每用於一個場景,就搭建一個底層基礎系統,再進行開發,太耗時間和精力,成本也很高。為此,以太坊就建了一個底層系統供開發者使用,開發者只需要在其基礎上開發自己的DAPP應用就可以了。去年5月數據顯示,全球就已有200多個以太坊應用。
此外,以太坊也是區塊鏈比較優秀的公鏈之一。不過,它的交易速度太慢令眾多開發者詬病,以太坊開發者正在不斷嘗試研發分片技術對此現象進行改變。
以太坊的本質是一個可編程可視化而且操作簡單的區塊鏈,允許任何人編寫智能合約和發行代幣(這也是為什麼市面上各類空氣幣、傳銷幣如此之多的一個原因之一)。和比特幣一樣,以太坊也是去中心化的,全網共同記錄以太坊的所有情況,而且公開透明不可篡改。
那你想問,以太坊和比特幣的不同之處在哪?通俗地講,你可以把以太坊理解成為能夠編程的區塊鏈,它提供了一套圖靈完備的腳本語言,後續的開發人員可以直接在這個基礎上進行c語言等語言編程,之後轉變成匯編語言,由此降低了區塊鏈的應用的開發難度。就好像安卓系統上,准備好了api和介面,用戶直接開發app就可以這樣的邏輯。從以太坊誕生之初到現在,以太坊上已經誕生了幾百個應用,俄羅斯政府甚至也與以太坊基金會合作。
希望我的回答能夠幫助你!
在基礎層面上,以太坊是基於區塊鏈技術的軟體平台。該平台允許構建和部署分散式應用程序。以太坊里的「以太」是什麼?對Ethereum感興趣的人們經常會問「以太是什麼?」
了解以太是非常重要的,因為它是以太坊功能的基礎。就像所有機器使用某種燃料一樣,區塊鏈也是如此。以太坊使用乙太網,這是一種獨特的代碼,可用作支付運行應用程序或程序的方式。就像老虎機需要硬幣(或者現在的預付卡)來運行硬幣一樣,客戶必須使用乙醚作為付款才能在以太坊運行他們所要求的操作。
大家其他人的答案真的都是太麻煩了
講得太復雜了
以太坊
簡單來說就是這么一個結論:
以太坊等於 BTC+智能合約+合同自由+通縮資產+使用價值
這個結論其實不難理解的
官方定義更加詭詐:
開源的有智能合約功能的公共區塊鏈平台。通過其專用加密貨幣以太幣(Ether,又稱「以太幣」)提供去中心化的虛擬機
以太坊簡單來說就是這么一個結論:
以太坊等於 BTC+智能合約+合同自由+通縮資產+使用價值
我給大家簡單地來說說吧
首先先來看下面這個視頻:也就是以太坊創始人V神的視頻 特別好的解釋
以太坊簡單來說就是這么一個結論:
以太坊等於 BTC+智能合約+合同自由+通縮資產+使用價值
官方定義更加詭詐:
以太坊是一個可編程,可視化的區塊鏈平台。其操作功能非常多,計算匯總各類數據等等。
以太坊是區塊鏈技術的一個質的飛躍!就好比http是互聯網底層支撐技術而以太坊就是可以基於以太坊智能合約做各種生態dapp
以太坊是什麼?
以太坊是互聯網新時代的基礎:
內建貨幣與支付。
用戶擁有個人數據主權,且不會被各類應用監聽或竊取數據。
人人都有權使用開放金融系統。
基於中立且開源的基礎架構,不受任何組織或個人控制。
以太坊的創建以太坊主網於 2015 年上線,是世界領先的可編程區塊鏈。
和其它區塊鏈一樣,以太坊也擁有原生加密貨幣,叫作 Ether (ETH)。 ETH 是一種數字貨幣, 和比特幣有許多相同的功能。 它是一種純數字貨幣,可以即時發送給世界上任何地方的任何人。 ETH 的供應不受任何政府或組織控制,它是去中心化且具稀缺性的。 全世界的人們都在使用 ETH 進行支付,或將其作為價值存儲和抵押品。
但與其它區塊鏈不同的是,以太坊可以做更多的工作。 以太坊是可編程的,開發者可以用它來構建不同於以往的應用程序。
以太坊的作用這些去中心化的應用程序(或稱「dapps」)基於加密貨幣與區塊鏈技術, 因而值得信任,也就是說 dapps 一旦被「上傳」到以太坊,它們將始終按照編好的程序運行。 這些應用程序可以控制數字資產,以便創造新的金融應用; 同時還是去中心化的,這意味著沒有任何單一實體或個人可以控制它們。
目前,全世界有成千上萬名開發者正在以太坊上構建應用程序、發明新的應用程序,其中有許多現在已經可以使用:
1.加密貨幣錢包:讓你可以使用 ETH 或其他數字資產進行低成本的即時支付
2.金融應用程序:讓你可以借貸、投資數字資產
3.去中心化市場:讓你可以交易數字資產,甚至就現實世界事件的「預測」進行交易
4. 游戲 :你可以擁有 游戲 內的資產,甚至可以由此獲得現實收益以及更多。
以太坊社區以太坊社區是世界上最大最活躍的區塊鏈社區。它包括核心協議開發者、加密經濟研究員、密碼朋克、挖礦組織、ETH 持有者、應用開發者、普通用戶、無政府主義者、財富 500 強公司。
沒有公司或中心化的組織能夠控制以太坊。 一直以來,以太坊由多元化的全球性社區貢獻者來協同進行維護和改善,社區成員耕耘於以太坊的方方面面,從核心協議到應用程序。
以太坊擁堵的元兇找到了,竟然是它!
⑼ 可不可以通俗點解釋一下以太坊
以太坊其實並不是某種貨幣,是一種去中心化的智能協議。可以將其理解為一個碩大的全球通用的賬本。這種智能協議的邏輯,在執行上並不需要特定的伺服器支撐他的日常運行,取而代之的是各個散落的用戶間自動執行者在進入之前給定的協議條款。這算是一種去中心化演化而來的應用。
與比特幣作對比後我們可以發現,以太坊建立一種新式的加密技術,對於其的程序開發難度與比特幣相比要更為簡單。這一突破對於應用區塊鏈技術的開發者來說,大大的減輕了開發成本,和開發時間。以太坊的出現再一次的重申了拆分中心化的必要性,以及將去中心化分布式應用的可行性與優勢,給現有的經濟市場,金融界一個發展的全新方向和拋給社會一個全新的創業理念與機遇。
⑽ 以太坊架構是怎麼樣的
以太坊最上層的是DApp。它通過Web3.js和智能合約層進行交換。所有的智能合約都運行在EVM(以太坊虛擬機)上,並會用到RPC的調用。在EVM和RPC下面是以太坊的四大核心內容,包括:blockChain, 共識演算法,挖礦以及網路層。除了DApp外,其他的所有部分都在以太坊的客戶端里,目前最流行的以太坊客戶端就是Geth(Go-Ethereum)