當前位置:首頁 » 以太坊知識 » 調試以太坊源代碼

調試以太坊源代碼

發布時間: 2024-12-10 23:01:17

⑴ 【深度知識】以太坊數據序列化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 )

⑵ 以太坊源碼(01):P2P網路及節點發現機制

本文深入探討以太坊底層的P2P網路結構及其核心機制Kademlia網路,簡稱Kad。以太坊採用Kad實現分布式網路,此技術由美國紐約大學的研究人員於2002年提出,廣泛應用於BitTorrent、BitComet、Emule等軟體。

Kad網路中,節點間距離計算遵循異或運算原則。節點間通信基於UDP,主要通過PING-PONG握手確認節點在線。這種設計確保了網路中數據的高效傳輸。

在以太坊網路中,節點距離的計算方法如下:節點1與節點2間距離=節點1的節點ID與節點2的節點ID進行異或運算的結果。這使得Kad網路能夠實現高效的數據查找與定位。

以太坊的Kad網路使用稱為K桶的數據結構構建路由表,K桶內存儲節點ID、距離、端點、IP等信息。網路中節點距離按照與目標節點的距離進行排序,共有256個K桶,每個K桶包含16個節點。該設計有助於提升網路查找性能與效率。

以太坊的Kad網路節點發現機制基於鄰居節點。系統啟動時隨機生成本機節點ID,之後通過PING-PONG握手將公共節點信息加入K桶。系統每隔7200毫秒刷新K桶,確保網路信息的實時更新。

鄰居節點發現流程包含以下幾個關鍵步驟:隨機生成目標節點ID,計算目標節點與本地節點的距離,查找距離目標節點更近的K桶節點,向這些節點發送FindNODE命令。接收到命令的節點同樣執行類似過程,最終將找到的節點信息返回至本地節點,完成鄰居節點的更新。

以太坊Kad網路的鄰居節點網路拓撲具有動態特性,允許網路在不斷變化中保持高效與穩定。這種機制確保了以太坊網路的高可用性與數據傳輸的可靠性。

相比傳統Kad網路,以太坊Kad網路在實現與優化方面具有獨特之處,為構建去中心化、高效、穩定的區塊鏈網路提供了有力支持。

⑶ 什麼是以太坊

以太坊是一種區塊鏈技術平台。


以太坊是一個開放源代碼的區塊鏈,它被設計為支持智能合約的公有鏈。下面進行詳細解釋:


基本定義


以太坊是一種區塊鏈技術協議,其目的是提供一個去中心化的全球平台,允許各種加密貨幣和智能合約進行交互。它允許開發者在其平台上建立和部署去中心化應用。這些應用可以在以太坊網路上進行各種操作,如數字身份驗證、貨幣交易等。以太坊的核心特性是智能合約功能,即合約的自動執行,確保了交易的安全性和不可篡改性。通過這種方式,以太坊技術能為用戶提供更高效、更安全的金融服務和其他數字服務。


技術特點


以太坊採用了區塊鏈技術,這意味著它是一個分布式資料庫,不包含中央控制或單一的管理員。其交易記錄公開透明,全網可查詢。由於使用加密演算法保護數據,以太坊的交易具有極高的安全性。此外,由於智能合約的存在,以太坊能夠實現更復雜的業務邏輯和操作,如資產代幣化、投票系統等。開發者可以使用特定的編程語言在以太坊上編寫和部署智能合約,進而創建去中心化的應用。隨著生態系統的不斷完善和發展,以太坊已成為區塊鏈技術領域最受歡迎的開源平台之一。


生態發展與應用前景


隨著時間的推移,以太坊生態系統已經吸引了大量的開發者和企業加入其中。越來越多的項目和應用程序都在使用以太坊的智能合約功能,實現了從數字身份到金融交易等各種應用場更加豐富的業務場景的實現提供了可能性。由於其開源和靈活的特性,以及日益擴大的社區支持,以太坊正逐步成為區塊鏈行業的主導力量之一,未來將有更廣泛的應用前景。同時隨著技術的不斷進步和應用場景的不斷拓展以太坊的安全性、可擴展性和用戶體驗將得到進一步提升滿足更多用戶需求為構建一個更加高效、去中心化的互聯網基礎設施做出貢獻。


綜上所述以太坊作為一種區塊鏈技術平台通過智能合約等特性為全球范圍內的交易提供了更加安全、高效的服務並擁有廣闊的應用前景和發展空間。

⑷ 死磕以太坊源碼分析之挖礦流程

以太坊的挖礦流程主要由miner包負責,它通過miner對象來管理操作,內部使用worker對象實現整體功能。miner決定礦工的啟動與停止,並能設置礦工地址以獲取獎勵。

worker.go文件中的worker對象負責挖礦的細節,其工作流程包含四個主要循環,通過多個channel完成任務調度、新任務提交、任務結果處理等。

新任務由newWorkLoop循環產生,此過程中,resubmitAdjustCh與resubmitIntervalCh兩個輔助信號用於調整計時器的頻率,resubmitAdjustCh根據歷史情況計算合理的間隔時間,而resubmitIntervalCh則允許外部實時修改間隔時間。

mainLoop循環則負責提交新任務並處理結果。TaskLoop提交任務,resultLoop則在新塊成功生成後執行相關操作。

啟動挖礦的參數設置定義在cmd/utils/flags.go文件中,提供了一系列選項,如開啟自動挖礦、設置並行PoW計算的協程數、配置挖礦通知、控制區塊驗證、設置Gas價格、確定Gas上限、指定挖礦獎勵賬戶、自定義區塊頭額外數據、設置重新挖礦間隔等。

可以採用多種方式啟動挖礦,例如通過控制台命令、RPC介面等。設置參數時,可參考官方文檔或相關指南進行調整。

分析代碼從miner.go的New函數開始,初始化canStart狀態以控制挖礦流程。若Downloader模塊正在同步或已完成,則啟動挖礦,否則停止。隨後進入mainLoop處理startCh,清除舊任務、提交新任務。

生成新任務通過newWorkCh完成,進入CommitNewWork函數,其中包含組裝header、初始化共識欄位、創建挖礦環境、添加叔塊等步驟。添加叔塊時進行校驗,確保區塊符合規定。若條件允許,任務會提交空塊、填充交易,並執行交易以生成最終塊。

交易執行成功後,塊數據被存入資料庫,並廣播至網路。若執行出錯,則回滾至上一個快照狀態。成功出塊後,新區塊被驗證、確認,並納入未確認區塊集中。若新區塊穩定,將正式插入鏈中。

整個挖礦流程相對簡單,主要由四個循環相互協作完成從挖礦啟動到新任務生成、任務提交、成功出塊的全過程。共識處理細節將在後續文章中詳細闡述。

⑸ 以太坊是什麼

以太坊是一種去中心化的區塊鏈技術平台。它提供了一個智能合約和去中心化應用的平台,允許開發者在其上建立和部署各種應用。以太坊利用區塊鏈技術,實現了去中心化、高度安全和不可篡改的特性。以下是詳細解釋:


一、基本概念


以太坊是一個開源的區塊鏈平台,旨在為全球用戶提供一種便捷的方式來創建、部署和管理去中心化應用。這個平台通過智能合約的功能,使得開發者可以在其上編寫和運行各種應用程序代碼。這些智能合約自動執行、驗證和存儲交易,而不需要任何第三方的參與。


二、技術特點


以太坊的技術架構包括區塊鏈、以太坊虛擬機和智能合約等關鍵部分。區塊鏈負責記錄所有交易和狀態變更,確保數據的不可篡改性。以太坊虛擬機則提供了一個運行智能合約的環境,確保代碼的可靠執行。智能合約是用戶自定義的業務邏輯代碼,可以在以太坊平台上部署和執行。


三、應用前景


由於以太坊的開放性和靈活性,它吸引了大量的開發者和創新者在其上開發各種應用。這些應用包括數字貨幣、去中心化金融、非同質化代幣等。以太坊的生態系統還允許創建各種新的業務模式和服務,推動了區塊鏈技術的廣泛應用和發展。


總的來說,以太坊是一個強大的區塊鏈技術平台,為開發者提供了一個構建去中心化應用的生態系統。其智能合約功能和開放源代碼模型使得開發者可以方便地創建和部署各種應用,推動了區塊鏈技術的發展和應用。

熱點內容
幣圈零錢通轉賬有限額嗎 發布:2025-02-11 21:03:31 瀏覽:96
trx4攀爬好么 發布:2025-02-11 20:55:09 瀏覽:652
trx4輪轂改裝 發布:2025-02-11 20:42:11 瀏覽:95
光伏發電能源管理器區塊鏈 發布:2025-02-11 20:39:55 瀏覽:816
幣圈最新資訊加密貨幣 發布:2025-02-11 20:20:10 瀏覽:768
比特幣礦工費怎麼算 發布:2025-02-11 20:03:05 瀏覽:785
區塊鏈里後一個區塊內容里包含前面 發布:2025-02-11 19:55:22 瀏覽:215
區塊鏈的龍頭企業 發布:2025-02-11 19:44:32 瀏覽:18
天下三挖礦技能等級 發布:2025-02-11 19:41:17 瀏覽:445
空投讓輸入eth地址 發布:2025-02-11 19:34:32 瀏覽:506