導航:首頁 > 以太坊區 > 以太坊內盤源碼

以太坊內盤源碼

發布時間:2023-05-17 06:24:45

1. 以太坊虛擬機(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位的字寬。主要從以下兩個方面考慮:

時間上主要體現在執行的效率上,我們以兩個整型數相加來對比具體的操作時間消耗。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-學碩創新工作站 」唯一獲準的「區塊鏈技術專業」試點工作站。專業站立足為學生提供多樣化成長路徑,推進專業學位研究生產學研結合培養模式改革,構建應用型、復合型人才培養體系。

2. 以太坊源碼go-ethereum怎麼運行

以太幣(ETH)是以太坊(Ethereum)的一種數字代幣,開發者們需要支付以太幣(ETH)來支撐應用的運行。以太幣和其他數字貨幣一樣,可以在交易平台上進行買賣。
通俗一點說,以太坊是開源平台數字貨幣和區塊鏈平台,它為開發者提供在區塊鏈上搭建...

3. 以太坊用什麼代碼寫的

用Solidity語言代碼寫的。Solidity,文件擴展名以sol結尾。Solidity是和JavaScript相似的語言,用它來開發合約並編譯成以太坊虛擬機位元組代碼。

4. Windows下VS2015編譯以太坊源碼cpp-ethereum失敗

1.准備工作。windows64位系統,C盤預留一定空間,下載並安裝vs2015(官方註明只支持VS2015,待驗證),cmake我用的3.10.1,將系統語言調成非unicode語言,如英文(美國),否則最後編譯時會有錯誤。
2.項目clone到本地,項目地址:
3.執行 submole updata --init。
4.將script目錄下install_deps.bat拷貝至根目錄並執行,該步驟會將hunter、boost、libjson等一系列下載至C盤,時間較長,請耐心等待。
5.控制台cd到項目所在目錄並創建build子目錄,

5. 以太坊源碼分析(一 簡介)

以太坊作為目前區塊鏈技術2.0的代表作品,無論是它獨創的智能合約以及它本身交易的速度都優於bitcoin,通過看它的白皮書以及一些文章也略微了解了它的一些原理,但是總體還是對它的實現半知半解。
因此就想分析下它的實現源碼,再結合白皮書也許可以深入的理解它的實現。

每個包的作用大致為:

以上為個人初步理解,如有不當之處望指正

註:資料查詢主要位置 wiki eip

6. 以太坊是一個什麼樣的東西怎麼開發

以太坊是一種區塊鏈的實現。在以太坊網路中,眾多的節點彼此連接,構成了以太坊網路: 以太坊節點軟體提供兩個核心功能:數據存儲、合約代碼執行。在每個以太坊全節點中,都保存有完整的區塊鏈數據。以太坊不僅將交易數據保存在鏈上,編譯後 的合約代碼同樣也保存在鏈上。以太坊全節點中,同時還提供了一個虛擬機來執行合約代碼。以太坊虛擬機 以太坊區塊鏈不僅存儲數據和代碼,每個節點中還包含一個虛擬機(EVM:Ethereum Virtual Machine)來執行 合約代碼 —— 聽起來就像計算機操作系統。事實上,這一點是以太坊區別於比特幣(Bitcoin)的最核心的一點:虛擬機的存在使區塊鏈邁入了2.0 時代,也讓區塊鏈第一次成為應用開發者友好的平台。以上內容來自:以太坊DApp開發入門教程

7. 什麼是以太幣/以太坊ETH

以太幣(ETH)是以太坊(Ethereum)的一種數字代幣,被視為「比特幣2.0版」,採用與比特幣不同的區塊鏈技術「以太坊」(Ethereum),一個開源的有智能合約成果的民眾區塊鏈平台,由全球成千上萬的計算機構成的共鳴網路。開發者們需要支付以太幣(ETH)來支撐應用的運行。和其他數字貨幣一樣,以太幣可以在交易平台上進行買賣 。

溫馨提示:以上解釋僅供參考,不作任何建議。入市有風險,投資需謹慎。您在做任何投資之前,應確保自己完全明白該產品的投資性質和所涉及的風險,詳細了解和謹慎評估產品後,再自身判斷是否參與交易。
應答時間:2020-12-02,最新業務變化請以平安銀行官網公布為准。
[平安銀行我知道]想要知道更多?快來看「平安銀行我知道」吧~
https://b.pingan.com.cn/paim/iknow/index.html

8. 【深度知識】以太坊數據序列化RLP編碼/解碼原理

RLP(Recursive Length Prefix),中文翻譯過來叫遞歸長度前綴編碼,它是以太坊序列化所採用的編碼方式。RLP主要用於以太坊中數據的網路傳輸和持久化存儲。

對象序列化方法有很多種,常見的像JSON編碼,但是JSON有個明顯的缺點:編碼結果比較大。例如有如下的結構:

變數s序列化的結果是{"name":"icattlecoder","sex":"male"},字元串長度35,實際有效數據是icattlecoder 和male,共計16個位元組,我們可以看到JSON的序列化時引入了太多的冗餘信息。假設以太坊採用JSON來序列化,那麼本來50GB的區塊鏈可能現在就要100GB,當然實際沒這么簡單。

所以,以太坊需要設計一種結果更小的編碼方法。

RLP編碼的定義只處理兩類數據:一類是字元串(例如位元組數組),一類是列表。字元串指的是一串二進制數據,列表是一個嵌套遞歸的結構,裡面可以包含字元串和列表,例如["cat",["puppy","cow"],"horse",[[]],"pig",[""],"sheep"]就是一個復雜的列表。其他類型的數據需要轉成以上的兩類,轉換的規則不是RLP編碼定義的,可以根據自己的規則轉換,例如struct可以轉成列表,int可以轉成二進制(屬於字元串一類),以太坊中整數都以大端形式存儲。

從RLP編碼的名字可以看出它的特點:一個是遞歸,被編碼的數據是遞歸的結構,編碼演算法也是遞歸進行處理的;二是長度前綴,也就是RLP編碼都帶有一個前綴,這個前綴是跟被編碼數據的長度相關的,從下面的編碼規則中可以看出這一點。

對於值在[0, 127]之間的單個位元組,其編碼是其本身。

例1:a的編碼是97。

如果byte數組長度l <= 55,編碼的結果是數組本身,再加上128+l作為前綴。

例2:空字元串編碼是128,即128 = 128 + 0。

例3:abc編碼結果是131 97 98 99,其中131=128+len("abc"),97 98 99依次是a b c。

如果數組長度大於55, 編碼結果第一個是183加數組長度的編碼的長度,然後是數組長度的本身的編碼,最後是byte數組的編碼。

請把上面的規則多讀幾篇,特別是數組長度的編碼的長度。

例4:編碼下面這段字元串:

The length of this sentence is more than 55 bytes, I know it because I pre-designed it
這段字元串共86個位元組,而86的編碼只需要一個位元組,那就是它自己,因此,編碼的結果如下:

184 86 84 104 101 32 108 101 110 103 116 104 32 111 102 32 116 104 105 115 32 115 101 110 116 101 110 99 101 32 105 115 32 109 111 114 101 32 116 104 97 110 32 53 53 32 98 121 116 101 115 44 32 73 32 107 110 111 119 32 105 116 32 98 101 99 97 117 115 101 32 73 32 112 114 101 45 100 101 115 105 103 110 101 100 32 105 116
其中前三個位元組的計算方式如下:

184 = 183 + 1,因為數組長度86編碼後僅佔用一個位元組。
86即數組長度86
84是T的編碼
例5:編碼一個重復1024次"a"的字元串,其結果為:185 4 0 97 97 97 97 97 97 ...。
1024按 big endian編碼為004 0,省略掉前面的零,長度為2,因此185 = 183 + 2。

規則1~3定義了byte數組的編碼方案,下面介紹列表的編碼規則。在此之前,我們先定義列表長度是指子列表編碼後的長度之和。

如果列表長度小於55,編碼結果第一位是192加列表長度的編碼的長度,然後依次連接各子列表的編碼。

注意規則4本身是遞歸定義的。
例6:["abc", "def"]的編碼結果是200 131 97 98 99 131 100 101 102。
其中abc的編碼為131 97 98 99,def的編碼為131 100 101 102。兩個子字元串的編碼後總長度是8,因此編碼結果第一位計算得出:192 + 8 = 200。

如果列表長度超過55,編碼結果第一位是247加列表長度的編碼長度,然後是列表長度本身的編碼,最後依次連接各子列表的編碼。

規則5本身也是遞歸定義的,和規則3相似。

例7:

["The length of this sentence is more than 55 bytes, ", "I know it because I pre-designed it"]
的編碼結果是:

248 88 179 84 104 101 32 108 101 110 103 116 104 32 111 102 32 116 104 105 115 32 115 101 110 116 101 110 99 101 32 105 115 32 109 111 114 101 32 116 104 97 110 32 53 53 32 98 121 116 101 115 44 32 163 73 32 107 110 111 119 32 105 116 32 98 101 99 97 117 115 101 32 73 32 112 114 101 45 100 101 115 105 103 110 101 100 32 105 116
其中前兩個位元組的計算方式如下:

248 = 247 +1
88 = 86 + 2,在規則3的示例中,長度為86,而在此例中,由於有兩個子字元串,每個子字元串本身的長度的編碼各佔1位元組,因此總共佔2位元組。
第3個位元組179依據規則2得出179 = 128 + 51
第55個位元組163同樣依據規則2得出163 = 128 + 35

例8:最後我們再來看個稍復雜點的例子以加深理解遞歸長度前綴,

["abc",["The length of this sentence is more than 55 bytes, ", "I know it because I pre-designed it"]]
編碼結果是:

248 94 131 97 98 99 248 88 179 84 104 101 32 108 101 110 103 116 104 32 111 102 32 116 104 105 115 32 115 101 110 116 101 110 99 101 32 105 115 32 109 111 114 101 32 116 104 97 110 32 53 53 32 98 121 116 101 115 44 32 163 73 32 107 110 111 119 32 105 116 32 98 101 99 97 117 115 101 32 73 32 112 114 101 45 100 101 115 105 103 110 101 100 32 105 116
列表第一項字元串abc根據規則2,編碼結果為131 97 98 99,長度為4。
列表第二項也是一個列表項:

["The length of this sentence is more than 55 bytes, ", "I know it because I pre-designed it"]
根據規則5,結果為

248 88 179 84 104 101 32 108 101 110 103 116 104 32 111 102 32 116 104 105 115 32 115 101 110 116 101 110 99 101 32 105 115 32 109 111 114 101 32 116 104 97 110 32 53 53 32 98 121 116 101 115 44 32 163 73 32 107 110 111 119 32 105 116 32 98 101 99 97 117 115 101 32 73 32 112 114 101 45 100 101 115 105 103 110 101 100 32 105 116
長度為90,因此,整個列表的編碼結果第二位是90 + 4 = 94, 佔用1個位元組,第一位247 + 1 = 248

以上5條就是RPL的全部編碼規則。

各語言在具體實現RLP編碼時,首先需要將對像映射成byte數組或列表兩種形式。以go語言編碼struct為例,會將其映射為列表,例如Student這個對象處理成列表["icattlecoder","male"]

如果編碼map類型,可以採用以下列表形式:

[["",""],["",""],["",""]]

解碼時,首先根據編碼結果第一個位元組f的大小,執行以下的規則判斷:

1.如果f∈ [0,128),那麼它是一個位元組本身。

2.如果f∈[128,184),那麼它是一個長度不超過55的byte數組,數組的長度為 l=f-128

3.如果f∈[184,192),那麼它是一個長度超過55的數組,長度本身的編碼長度ll=f-183,然後從第二個位元組開始讀取長度為ll的bytes,按照BigEndian編碼成整數l,l即為數組的長度。

4.如果f∈(192,247],那麼它是一個編碼後總長度不超過55的列表,列表長度為l=f-192。遞歸使用規則1~4進行解碼。

5.如果f∈(247,256],那麼它是編碼後長度大於55的列表,其長度本身的編碼長度ll=f-247,然後從第二個位元組讀取長度為ll的bytes,按BigEndian編碼成整數l,l即為子列表長度。然後遞歸根據解碼規則進行解碼。

以上解釋了什麼叫遞歸長度前綴編碼,這個名字本身很好的解釋了編碼規則。

(1) 以太坊源碼學習—RLP編碼( https://segmentfault.com/a/1190000011763339 )
(2)簡單分析RLP編碼原理
( https://blog.csdn.net/itchosen/article/details/78183991 )

9. 以太坊C++源碼解析(九)區塊頭

區塊頭定義位於libethcore\BlockHeader.h文件中,是一個非常簡單的類,我們來看看它包含哪些重要數據:

10. [以太坊源碼分析][p2p網路07]:同步區塊和交易

同步,也就是區塊鏈的數據的同步。這里分為兩種同步方式,一是本地區塊鏈與遠程節點的區塊鏈進行同步,二是將交易均勻的同步給相鄰的節點。

01.同步區塊鏈
02.同步交易
03.總結

ProtocolManager 協議管理中的 go pm.syncer() 協程。

先啟動了 fetcher ,輔助同步區塊用的。然後等待不同的事件觸發不同的同步方式。

同步的過程調用 pm.synchronise 方法來進行。

ProtocolManager 協議管理中的 go pm.txsyncLoop() 協程。

同步交易循環 txsyncLoop 分為三個部分的內容:

發送交易的函數。

挑選函數。

三個監聽協程的 case 。

閱讀全文

與以太坊內盤源碼相關的資料

熱點內容
什麼是數字貨幣和數字錢包 瀏覽:458
比特幣150萬轉人民幣是多少 瀏覽:670
北京板塊數字貨幣 瀏覽:159
比特幣與數字貨幣的共性 瀏覽:572
虛擬貨幣委託訂單是什麼意思 瀏覽:40
禁比特幣對中國損失 瀏覽:162
比特幣挖礦機長城電源 瀏覽:597
手機刷中國比特幣 瀏覽:687
幾分鍾BTC價格波動 瀏覽:741
以太坊創辦人坐的是什麼 瀏覽:695
查虛擬貨幣的App 瀏覽:181
比特幣中國官網chbtc 瀏覽:491
數字貨幣央視 瀏覽:323
虛擬貨幣的數據挖掘 瀏覽:531
數字貨幣牌照申請多少錢 瀏覽:979
數字貨幣傭金是什麼意思 瀏覽:977
比特幣分叉隊以太 瀏覽:42
深圳沃爾瑪數字貨幣 瀏覽:852
數字貨幣GTS 瀏覽:682
以太坊價錢今日的價格 瀏覽:591