公鑰加密以太坊
❶ 【深度知識】區塊鏈之加密原理圖示(加密,簽名)
先放一張以太坊的架構圖:
在學習的過程中主要是採用單個模塊了學習了解的,包括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的整個的加密,認證,簽名模型如下:
❷ 以太坊架構是怎麼樣的
以太坊最上層的是DApp。它通過Web3.js和智能合約層進行交換。所有的智能合約都運行在EVM(以太坊虛擬機)上,並會用到RPC的調用。在EVM和RPC下面是以太坊的四大核心內容,包括:blockChain, 共識演算法,挖礦以及網路層。除了DApp外,其他的所有部分都在以太坊的客戶端里,目前最流行的以太坊客戶端就是Geth(Go-Ethereum)
❸ 以太坊是什麼東西
以太坊(英語:Ethereum)是一個開源的有智能合約功能的公共區塊鏈平台。通過其專用加密貨幣以太幣(Ether,又稱「以太幣」)提供去中心化的虛擬機(稱為「以太虛擬機」EthereumVirtualMachine)來處理點對點合約。
坊區塊鏈上的代幣稱為以太幣(Ether),代碼為ETH,可在許多加密貨幣的外匯市場上交易,它也是以太坊上用來支付交易手續費和運算服務的媒介。
以太坊的概念首次在2013至2014年間由程序員VitalikButerin,受比特幣啟發後提出,大意為「下一代加密貨幣與去中心化應用平台」,在2014年通過ICO眾籌得以開始發展。截至2018年2月,以太幣是市值第二高的加密貨幣,僅次於比特幣。
(3)公鑰加密以太坊擴展閱讀:
以太坊平台本身沒有特點,沒有價值性。和編程語言相似,它由企業家和開發者決定其用途。不過很明顯,某些應用類型較之其他更能從以太坊的功能中獲益。以太坊尤其適合那些在點與點之間自動進行直接交互或者跨網路促進小組協調活動的應用。
例如,協調點對點市場的應用,或是復雜財務合同的自動化。比特幣使個體能夠不藉助金融機構、銀行或政府等其他中介來進行貨幣交換。以太坊的影響可能更為深遠。
理論上,任何復雜的金融活動或交易都能在以太坊上用編碼自動且可靠地進行。除金融類應用外,任何對信任、安全和持久性要求較高的應用場景——比如資產注冊、投票、管理和物聯網——都會大規模地受到以太坊平台影響。
❹ eth/btc是什麼意思
BTC比特幣
比特幣是第一個創建的分布式數字資產平台。自2009年發布以來,它已被證明不僅是最受歡迎的,也是最大的市場資本價值。此外,它也是最貴的,每個幣在2018年2月17日的價值為10,710美元。比特幣引入了第一個專門用於記錄所有交易的區塊鏈分布式賬本,並擺脫了用戶需要中央機構處理或驗證交易的功能。
其目標是為用戶提供一個平台,讓他們可以跨境進行交易,而無需任何中介,也就是我們所說的去中心化。該平台的最大貨幣(BTC)供應量約為2100萬。在這個數字中,約有1650萬已被開采,目前正在流通。它在全球無時無刻的被開采著,來確保硬幣的流通性。
優點:
1、它的分布式系統為用戶提供了很大的自由。
2、高便攜性。
3、這是一個安全的網路。
缺點:
1、價格波動較大。
2、用戶可能會丟失密鑰。
ETH以太坊
以太坊也是一個分布式的平台,由網路程序員Vitalik Buterin於2015年7月創建。以太坊旨在使用戶能夠創建和部署智能合同。智能合約的一個主要功能是允許創建在Ethereum網路上運行的加密資產或令牌。以太坊代幣用於購買雲存儲空間等各種功能。這些令牌存儲在與以太坊區塊鏈兼容的數字錢包中。
以太坊的數字貨幣Ether充當了執行智能合約的介質。目前,已有約9800萬個以太幣已被開采和流通,流通供應量每年增加約1800萬。以太幣被創建為在以太坊網路上運行,它可以用於補償參與者節點,也可以從一個用戶轉移到另一個用戶。
優點:
1、構建了多平台。
2、能夠運行智能合約。
3、安全性極高。
缺點:流通量較多。
(4)公鑰加密以太坊擴展閱讀:
產生原理:
從比特幣的本質說起,比特幣的本質其實就是一堆復雜演算法所生成的特解。特解是指方程組所能得到有限個解中的一組。而每一個特解都能解開方程並且是唯一的。
以鈔票來比喻的話,比特幣就是鈔票的冠字型大小碼,某張鈔票上的冠字型大小碼,就擁有了這張鈔票。而挖礦的過程就是通過龐大的計算量不斷的去尋求這個方程組的特解,這個方程組被設計成了只有2100萬個特解,所以比特幣的上限就是2100萬個。
要挖掘比特幣可以下載專用的比特幣運算工具,然後注冊各種合作網站,把注冊來的用戶名和密碼填入計算程序中,再點擊運算就正式開始。
完成Bitcoin客戶端安裝後,可以直接獲得一個Bitcoin地址,當別人付錢的時候,只需要自己把地址貼給別人,就能通過同樣的客戶端進行付款。
在安裝好比特幣客戶端後,它將會分配一個私鑰和一個公鑰。需要備份你包含私鑰的錢包數據,才能保證財產不丟失。如果不幸完全格式化硬碟,個人的比特幣將會完全丟失。
❺ Gate.io芝麻開門之以太坊是什麼
以太坊是由 V 神(Vitalik Buterin)創建的加密貨幣,目前市值排名第二。
他和比特幣一樣,都是基於點對點(P2P)和密碼學而建立起的一種區塊鏈網路, 但不同的是,它在比特幣網路 1.0 的基礎上進行了升級,改變了原有區塊鏈網路存在的一些問題。
例如,在共識機制方面,將逐漸由 POW 轉變為 POS,以此來降低能源消耗、 減少手續費、縮短共識時間、提高效率。
在創新方面,增加了智能合約。智能合約是存在於以太坊區塊網路節點上的一個程序,除了可以記錄數據,還可以進行數據處理。 以太坊支持項目方在區塊鏈網路上編寫智能合約,但是所有的開發都是需要在遵守智能合約基礎協議的情況下才可以進行,之後智能合約程序將會按照合約內容進行執行且無法修改信息。
其實智能合約類似於一種操作系統,它提供多種介面和 API 供項目方接入使用, 由於完整的區塊鏈網路應用開發是一件很難的事情,因此讓很多團隊望而卻步。 但有了以太坊提供的多種介面支持,讓應用的開發變得簡單,不用去投入太多時間、技術和資金從頭做起,只需要遵守智能合約條款進行開發即可。
所以,這方便了很多數字貨幣的誕生。 目前市面上流通的數字貨幣,90%都是基於以太坊的 ERC-20 協議開發的。
❻ 以太坊源碼分析--p2p節點發現
節點發現功能主要涉及 Server Table udp 這幾個數據結構,它們有獨自的事件響應循環,節點發現功能便是它們互相協作完成的。其中,每個以太坊客戶端啟動後都會在本地運行一個 Server ,並將網路拓撲中相鄰的節點視為 Node ,而 Table 是 Node 的容器, udp 則是負責維持底層的連接。下面重點描述它們中重要的欄位和事件循環處理的關鍵部分。
PrivateKey - 本節點的私鑰,用於與其他節點建立時的握手協商
Protocols - 支持的所有上層協議
StaticNodes - 預設的靜態 Peer ,節點啟動時會首先去向它們發起連接,建立鄰居關系
newTransport - 下層傳輸層實現,定義握手過程中的數據加密解密方式,默認的傳輸層實現是用 newRLPX() 創建的 rlpx ,這不是本文的重點
ntab - 典型實現是 Table ,所有 peer 以 Node 的形式存放在 Table
ourHandshake - 與其他節點建立連接時的握手信息,包含本地節點的版本號以及支持的上層協議
addpeer - 連接握手完成後,連接過程通過這個通道通知 Server
Server 的監聽循環,啟動底層監聽socket,當收到連接請求時,Accept後調用 setupConn() 開始連接建立過程
Server的主要事件處理和功能實現循環
Node 唯一表示網路上的一個節點
IP - IP地址
UDP/TCP - 連接使用的UDP/TCP埠號
ID - 以太坊網路中唯一標識一個節點,本質上是一個橢圓曲線公鑰(PublicKey),與 Server 的 PrivateKey 對應。一個節點的IP地址不一定是固定的,但ID是唯一的。
sha - 用於節點間的距離計算
Table 主要用來管理與本節點與其他節點的連接的建立更新刪除
bucket - 所有 peer 按與本節點的距離遠近放在不同的桶(bucket)中,詳見之後的 節點維護
refreshReq - 更新 Table 請求通道
Table 的主要事件循環,主要負責控制 refresh 和 revalidate 過程。
refresh.C - 定時(30s)啟動Peer刷新過程的定時器
refreshReq - 接收其他線程投遞到 Table 的 刷新Peer連接 的通知,當收到該通知時啟動更新,詳見之後的 更新鄰居關系
revalidate.C - 定時重新檢查以連接節點的有效性的定時器,詳見之後的 探活檢測
udp 負責節點間通信的底層消息控制,是 Table 運行的 Kademlia 協議的底層組件
conn - 底層監聽埠的連接
addpending - udp 用來接收 pending 的channel。使用場景為:當我們向其他節點發送數據包後(packet)後可能會期待收到它的回復,pending用來記錄一次這種還沒有到來的回復。舉個例子,當我們發送ping包時,總是期待對方回復pong包。這時就可以將構造一個pending結構,其中包含期待接收的pong包的信息以及對應的callback函數,將這個pengding投遞到udp的這個channel。 udp 在收到匹配的pong後,執行預設的callback。
gotreply - udp 用來接收其他節點回復的通道,配合上面的addpending,收到回復後,遍歷已有的pending鏈表,看是否有匹配的pending。
Table - 和 Server 中的ntab是同一個 Table
udp 的處理循環,負責控制消息的向上遞交和收發控制
udp 的底層接受數據包循環,負責接收其他節點的 packet
以太坊使用 Kademlia 分布式路由存儲協議來進行網路拓撲維護,了解該協議建議先閱讀 易懂分布式 。更權威的資料可以查看 wiki 。總的來說該協議:
源碼中由 Table 結構保存所有 bucket , bucket 結構如下
節點可以在 entries 和 replacements 互相轉化,一個 entries 節點如果 Validate 失敗,那麼它會被原本將一個原本在 replacements 數組的節點替換。
有效性檢測就是利用 ping 消息進行探活操作。 Table.loop() 啟動了一個定時器(0~10s),定期隨機選擇一個bucket,向其 entries 中末尾的節點發送 ping 消息,如果對方回應了 pong ,則探活成功。
Table.loop() 會定期(定時器超時)或不定期(收到refreshReq)地進行更新鄰居關系(發現新鄰居),兩者都調用 doRefresh() 方法,該方法對在網路上查找離自身和三個隨機節點最近的若干個節點。
Table 的 lookup() 方法用來實現節點查找目標節點,它的實現就是 Kademlia 協議,通過節點間的接力,一步一步接近目標。
當一個節點啟動後,它會首先向配置的靜態節點發起連接,發起連接的過程稱為 Dial ,源碼中通過創建 dialTask 跟蹤這個過程
dialTask表示一次向其他節點主動發起連接的任務
在 Server 啟動時,會調用 newDialState() 根據預配置的 StaticNodes 初始化一批 dialTask , 並在 Server.run() 方法中,啟動這些這些任務。
Dial 過程需要知道目標節點( dest )的IP地址,如果不知道的話,就要先使用 recolve() 解析出目標的IP地址,怎麼解析?就是先要用藉助 Kademlia 協議在網路中查找目標節點。
當得到目標節點的IP後,下一步便是建立連接,這是通過 dialTask.dial() 建立連接
連接建立的握手過程分為兩個階段,在在 SetupConn() 中實現
第一階段為 ECDH密鑰建立 :
第二階段為協議握手,互相交換支持的上層協議
如果兩次握手都通過,dialTask將向 Server 的 addpeer 通道發送 peer 的信息
❼ 可不可以通俗點解釋一下以太坊
以太坊其實並不是某種貨幣,是一種去中心化的智能協議。可以將其理解為一個碩大的全球通用的賬本。這種智能協議的邏輯,在執行上並不需要特定的伺服器支撐他的日常運行,取而代之的是各個散落的用戶間自動執行者在進入之前給定的協議條款。這算是一種去中心化演化而來的應用。
與比特幣作對比後我們可以發現,以太坊建立一種新式的加密技術,對於其的程序開發難度與比特幣相比要更為簡單。這一突破對於應用區塊鏈技術的開發者來說,大大的減輕了開發成本,和開發時間。以太坊的出現再一次的重申了拆分中心化的必要性,以及將去中心化分布式應用的可行性與優勢,給現有的經濟市場,金融界一個發展的全新方向和拋給社會一個全新的創業理念與機遇。
❽ 什麼是公鑰、私鑰、密碼、助記詞、Keystore
公鑰、私鑰、密碼、助記詞、Keystore是在使用數字貨幣錢包時,必須要弄清的概念:如果不搞清楚,很可能會造成數字資產的嚴重損失。
1.公鑰:
相當於所屬錢包的地址,可理解成銀行賬戶。
公鑰的地址可理解成銀行卡號,是由公鑰通過計算得來,就像銀行先給你開戶,後給你銀行卡卡號。
錢包地址的主要用途是收款,也可以作為轉賬的憑證,就像別人匯款給你時你需要告訴他銀行卡卡號一樣。
常見的錢包地址樣式:
比特幣:普通地址:1開頭、隔離見證地址:3開頭
以太坊地址:0x開頭:(包括基於以太坊平台代幣)瑞波幣地址:r開頭。
萊特幣地址:L開頭。
2.私鑰:
非常重要,相當於銀行卡號+銀行卡密碼。
創建錢包後,輸入密碼即可導出私鑰。私鑰是由字母數字組成的字元串,一個錢包地址只有一個私鑰且不能修改。私鑰要離線保存,不要進行網路傳輸,可用紙張記錄並保存。
主要用途,導入錢包。有了私鑰就可以在同系列的任何一款錢包上,輸入私鑰並設置一個新的密碼就可以把之前的A錢包的資產導入B錢包。比如手機丟了,只要你有私鑰就可以恢復。
3.密碼 :
相當於銀行卡密碼。
在創建數字貨幣錢包時,需要設置一個密碼,一般要求不少於8個字元。
主要用途:①轉賬時需要輸入密碼,可理解成你用銀行卡給別人轉賬需要輸入密碼;②用Keystore導入錢包時,必須輸入這個密碼。
密碼可以進行修改或重置。輸入原密碼後,就可以直接修改新的密碼了;但如果原密碼忘記,可以用私鑰或是助記詞導入錢包,同時設置新的密碼。數字貨幣錢包中,一個錢包在不同手機上可以用不同的密碼,彼此相互獨立,互不影響。
4.助記詞
等於私鑰=銀行卡號+銀行卡密碼
由於私鑰由64位字元串組成,不便於記錄,非常容易抄錯,於是就出現了助記詞,方便用戶記憶和記錄。由12個單片語成,每個單詞之間有一個空格,助記詞和私鑰具有同樣的功能:只要輸入助記詞並設置一個新的密碼,就可以導入錢包。
一個錢包只有一套助記詞且不能修改。助記詞只能備份一次,備份後,在錢包中便不會再顯示。因此,在備份時一定要抄寫下來,防止抄寫錯誤,盡量多次檢驗。
5.Keystore:
Keystore+密碼=私鑰=銀行卡號+銀行卡密碼、Keystore ≠ 銀行卡號
Keystore相當於加密過後的私鑰,在導入錢包時,只要輸入Keystore 和密碼,就能進入錢包了。這一點和用私鑰或助記詞導入錢包不一樣,後兩者不需要知道原密碼,而是直接重置密碼。
keystore進行交易轉賬等錢包操作,必須知道該keystore的密碼。keystore的密碼是無法更改的,一個keystore對應一個密碼。但是可以通過該錢包的助記詞,重新生成一個keystore。這個keystore可以用新的密碼生成,重新生成新的keystore之後,最好將舊的keystore刪除。
總結:
一個數字貨幣錢包創建完成後,公鑰和私鑰是成對出現的。公鑰,私鑰都是由字母,數字組成的較長的字元串。
keystore和助記詞可以理解為私鑰的另一種表現形式。助記詞作為錢包私鑰的友好格式,非常方便備份和導入。
地址可以通過私鑰、助記詞、keystore+密碼,導入錢包找回。密碼可以通過私鑰、助記詞,導入錢包重置密碼。如果私鑰、助記詞、Keystore+密碼,有一個信息泄漏,別人就可以擁有你錢包的控制權,錢包內的幣就會被別人轉移走。
私鑰通過加密生成公鑰,公鑰轉換一下格式生成地址。私鑰可以推導出公鑰,公鑰可以推導出地址,但無法通過輸出地址、公鑰推導出私鑰。
在生活中,銀行開戶是「開設銀行賬戶—銀行卡號—設置銀行卡密碼—開戶成功
在幣圈裡,是先設置「密碼」(私鑰),再得到「銀行賬戶」(公鑰),最後給地址。對於錢包安全管理,主要注意防盜和防丟。防止私鑰泄露及丟失。
注意事項:
1.關於各種騙局誘導交出私鑰、助記詞的行為,都要謹慎操作;
2.重視私鑰、助記詞、Keystore+密碼的備份和保存!多重備份,多次備份,多重驗證,防止抄寫錯誤。
3.私鑰不好備份的情況下,可選用備份助記詞,具體根據錢包的備份要求。
4.不要進行聯網備份,或通過微信、qq、郵箱等任何第三方工具進行傳輸發送你的私鑰、助記詞、keystore。不要截圖。
5.備份內容放到安全、妥善的地方,並告訴家人(以防突發事故發生)
數字貨幣錢包的作用是安全存儲資產,這是最重要的!從投資紀律來講,本金安全是一切的基礎。對於理財類的錢包,聲稱賺取收益高回報等,應該叫「數字資產理財」更恰當。你的資產他們可以隨意動用拿去投資。你對資產沒有完全的掌控權,如果投資順利,本息安全,如果投資失敗,血本無歸。所以,請慎重使用這類錢包,應該注重的是資產的安全和私密性。
❾ 手機可以下載以太坊錢包嗎
可以的,手機應用中搜索,然後點擊下載安裝即可。
在以太坊飛速發展的今天,以太坊錢包也運應而生了。為什麼會有以太錢包的誕生呢。在以太坊,各種各樣的轉賬都需要賬戶,而在我們交易平台上的交易都需要發起和接收的一方,缺一不可。
雖然我們擁有加密的公鑰,私鑰,以及對應生成的地址,但是私鑰一旦丟失,我們的幣也隨之丟失了。我們用錢包來管理賬戶,而同時做好備份也是很重要的。我們需要自己掌控自己的錢包。
❿ 以太坊:它是什麼,它有什麼價值
區視網分享,以太坊是一個開源的有智能合約功能的公共區塊鏈平台。通過其專用加密貨幣以太幣(提供去中心化的虛擬機來處理點對點合約。關鍵點:開源的、有智能合約功能、公鏈平台、以太幣。