以太坊交易所 以太坊交易所
Ctrl+D 以太坊交易所
ads
首頁 > FIL > Info

深入理解以太坊交易處理機制_END:lend幣未來前景

Author:

Time:1900/1/1 0:00:00

前言

區塊鏈是一個以"去中心化"、"去信任化"方式集體維護的分布式賬本,這里的"分布式"不僅體現在數據的分布式存儲,也體現在數據的分布式記錄,即由系統參與者共同維護,作為"賬本"的區塊鏈自然少不了記賬,而交易自然而然的成為了重中之重。知道創宇區塊鏈安全實驗室將從源代碼視角對以太坊交易池數據結構、交易費用設置、交易構建、交易入池、交易簽名、交易驗證等邏輯設計進行簡要淺析,并通過對以太坊交易安全機制設計來研究公鏈安全機制設計。基本概念

交易流程示意圖大致如下所示:

流程說明:首先由用戶通過網絡發起交易請求,并使用自己的私鑰對交易進行簽名,之后進行交易廣播,進而將交易添加到交易池中,礦工從交易池中獲取交易信息,然后將其進行打包并生成區塊,之后通過進行共識出塊,最后向全網廣播交易區塊。數據流向:交易池的數據來源:本地提交,第三方應用通過調用本地以太坊節點的RPC服務提交交易;遠程同步,通過廣播同步的形式,將其他以太坊節點的交易數據同步至本地節點。交易池的數據去向:由miner(礦工)獲取并驗證,用于挖礦,挖礦成功后寫進區塊被廣播,交易被寫入規范鏈后會從交易池中進行刪除,如果交易被寫進分叉則交易池中的交易不會減少,之后等待重新打包。數據結構

首先來看一下TxPoolConfig的配置信息:

默認配置如下:

TxPool數據結構如下所示:

基礎配置

在分析交易執行我們首先需要來看一些基本的配置,例如:交易手續費是有有最大的上限/下限、交易池配置、交易最大信息檢索數量等,在這里我們僅對一些關鍵的點進行查看:01交易手續費

02交易池配置

03交易檢索數量

初始化池

交易池的初始化通過NewTxPool來實現,具體代碼如下所示:

Bondly獲OKEx Blockdream Ventrues投資 雙方將深入探索NFT領域:據官方消息,Bondly已獲OKEx Blockdream Ventrues(OKEx BDV)投資,雙方將深入探索NFT領域,為NFT優質區塊鏈項目發展提供服務和資源支持。一方面,Bondly將通過NFT形式為OKEx BDV合作的優質項目提供LaunchPad服務;另一方面,雙方共同把優秀品牌帶到Bprotect,也將以NFT創新形式與OKExChain生態資產進行品牌合作。

Bondly是一種可互操作、透明、便捷的資產兌換協議,旨在徹底改變傳統的資產托管方法,并使每個藝術創作人都能進入自己的數字市場,旗下產品包括BSwap(NFT發售平臺)、Bondly LaunchPad(IDO平臺)、BProtect(NFT交易平臺)。OKEx BDV初始資金1 億美金,致力于發現和投資最前沿的產品技術創新類區塊鏈項目,投資方向包括基礎設施、交易及金融項目、公鏈生態類項目、應用類流量入口等。[2021/5/6 21:28:39]

在這里首先調用sanitize函數對配置參數進行校驗,以規避設置不合理的gasprices。

之后使用默認配置初始化一個交易池(txpool):

之后初始化本地賬戶并將配置的本地賬戶地址加到交易池:

之后創建更加gasprices排序的交易:

具體實現代碼如下所示:

之后調用reset更新交易池:

reset具體實現如下:

之后啟動reorg循環,使其能夠處理日志加載期間生成的請求:

聲音 | 光明日報:推動區塊鏈技術在民生領域更廣泛、更深入地應用:《光明日報》今日發表題為“大力探索“區塊鏈+”在民生領域的運用”評論文章。文章指出,自問世以來,區塊鏈就以其作為數字貨幣的底層技術而受到各界褒貶,但把區塊鏈技術等同于數字貨幣,就像把互聯網等同于“萬維網”一樣,窄化了區塊鏈的內涵。從區塊鏈自身的邏輯來說,它的核心功能主要有3個:一是機器信任,二是價值傳遞,三是智能合約。這也是適合區塊鏈落地的應用場景。文章中表示,“區塊鏈+”在民生領域的更多應用還需要“腦洞大開”的創新實踐。我們既要加快區塊鏈核心技術的突破創新,不斷完善監管機制,也要抓住區塊鏈技術融合、功能拓展、產業細分的契機,推動區塊鏈技術在民生領域更廣泛、更深入地應用,實實在在地增進人民群眾的民生福祉。[2019/10/31]

scheduleReorgLoop具體實現代碼如下所示,該函數主要用于reset和promoteExecutable的執行計劃。

此時如果本地交易開啟那么從本地磁盤加載本地交易。

之后訂閱相關交易事件并開啟主循環:

主循環loop具體實現代碼如下,它是txPool的一個goroutine,也是主要的事件循環,它主要用于等待和響應外部區塊鏈事件以及各種報告和交易驅逐事件:

構建交易

交易有用戶發起,使得資產從一方轉移至另一方,即所謂的價值轉移,我們最直觀的交易構建就是通過錢包來進行轉賬,在這里我們直接以eth_sendTransaction這一個RPC為例進行分析交易的構建流程,eth_sendTransaction請求示例如下:

參數示例:from:DATA,20字節-發送交易的源地址to:DATA,20字節-交易的目標地址,當創建新合約時可選gas:QUANTITY-交易執行可用gas量,可選整數,默認值90000,未用gas將返還gasPrice:QUANTITY-gas價格,可選,默認值:待定(To-Be-Determined)value:QUANTITY-交易發送的金額,可選整數data:DATA-合約的編譯帶啊或被調用方法的簽名及編碼參數nonce:QUANTITY-nonce,可選,可以使用同一個nonce來實現掛起的交易的重寫

聲音 | 國家金融與發展實驗室理事長:數字貨幣尤其是Libra 需要深入研究:據新浪財經消息,近日,國家金融與發展實驗室理事長李揚在第八屆中國國際金融交易?博覽會中對臉書計劃推出的數字貨幣(Libra)發表看法:數字貨幣標志著金融進入新時代,這是最新科技對傳統中央銀行、傳統金融調控體系、傳統貨幣體系的挑戰,要理解數字貨幣尤其是Libra,需要深入研究,特別是從貨幣經濟學的基礎來研究。[2019/6/25]

響應示例:

下面我們來跟蹤一下eth_sendTransaction這一個RPC的執行過程,在這里首先檢索賬戶是否存在,之后檢查Nonce是否為空,緊接著調用SingTx進行簽名操作,之后調用SubmitTransaction來提交交易:

SignTx實現代碼如下所示,在這里會繼續調用SignTx進行簽名操作,這里不再深入,后續的"交易簽名"會進行纖細分析:

簽名之后返回SendTransaction中去調用SubmitTransaction來提交簽名,在這里會首先檢查交易費用是否足夠,之后調用SendTx來發送交易:

SendTx的具體實現如下,在這里會調用AddLocal來添加交易到交易池中去,這里不再深入后續會有"添加交易"這一個分析單元模塊:

之后檢查接受地址是否為空,如果為空則創建一個地址(一般在合約創建時出現),之后打印一份完整的TX詳細信息的日志便于后續手動調查分析,之后返回交易的hash值:

交易入池

我們知道交易的來源有兩個方面:一個方面是本地提交的,另一個方面是遠程提交的,這兩個的具體實現代碼分別為AddLocals和AddRemotes,這兩個函數在添加交易到交易池時都是通過調用addTxs來實現的:

動態 | 區塊鏈等技術在物流、營銷、質量追溯等領域應用日趨深入:前瞻產業研究院發布《中國零售行業市場前瞻與投資戰略規劃分析報告》,其顯示,近年來,隨著電商環境、技術平臺和網購習慣的普及與完善,中國的零售業發生了翻天覆地的變化。例如,各大電商平臺的線下門店落地,與傳統零售商聯盟化趨勢加強,將線上線下資源進一步整合;人工智能、大數據、區塊鏈等技術在物流、營銷、質量追溯等領域應用日趨深入;電商流量加速分化,拼購模式、小程序電商、內容電商等新模式交易規模呈指數增長。[2019/5/10]

addTxs代碼如下所示:

首先會對交易進行過濾,檢查是否是一個已知的交易(即添加過或廣播過的),之后調用send函數校驗通過secp256k1橢圓曲線從簽名(v,r,s)派生的地址,如果派生失敗或簽名不正確,則返回錯誤:

之后將交易添加到交易池中去(注意:這里有事務鎖)

addTxsLocked的具體實現如下所示,它會將有效的交易進行排隊處理,同時調用pool.add函數將交易添加到交易隊列中去:

add函數的具體實現如下所示:

在這里會首先檢查當前的交易是否已經知曉(即被廣播過或者添加到池子里過),如果已知曉則直接丟棄:

之后鑒別交易是本地提交還是遠程提交,并調用函數validateTx來驗證交易,如果驗證不通過則直接丟棄:

之后檢查交易池是否滿了,如果滿了則放棄交易隊列中定價過低的交易,GlobalSlots和GlobalQueue為pending和queue的最大容量:

聲音 | 英國財政部金融服務副主任:希望更深入地研究加密行業:據unhashed報道,英國財政部金融服務副主任Gillian Dorner表示,政府相關部門希望能更深入地研究加密行業,以采取相應的應對辦法。英國正面臨著創新經濟、保護消費者和打擊金融犯罪的多重挑戰。[2018/11/23]

之后判斷當前交易在pending隊列中是否存在nonce值相同的交易,如果存在則判斷當前交易所設置的gasprice是否超過設置的PriceBump百分比,超過則替換覆蓋已存在的交易,否則報錯返回替換交易Gasprice過低,并且把它扔到queue隊列中(enqueueTx):

之后調用enqueueTx將添加到交易隊列中去,同時檢查from賬戶是否為本地地址,如果是則添加到交易池本地地址中去:

enqueueTx代碼如下所示,該函數主要將新的交易插入到交易隊列中去:

最后會到addTx函數中在這里會調用requestPromoteExecutables函數進行一次交易提升請求操作,它主要將交易從queue投放到pending中去:

交易簽名

交易簽名主要通過函數SignTx來實現,首先檢查錢包是否關閉,之后檢查錢包賬戶中是否包含發情交易請求的賬戶,之后調用SignTx進行簽名處理:

SignTx的具體實現代碼如下所示:

校驗過賬戶的有效性后我們可以通過SignTx來使用keystore進行簽名處理,在這里緊接著調用LatestSignerForChainID進行簽名:

之后再SignTx函數中使用私鑰進行簽名:

在sign中使用ECDSA(橢圓曲線加密算法)進行簽名,之后返回簽名的結果:

交易驗證

交易驗證時整個交易環節最重要的一環,對于用戶來說,交易驗證時保證用戶財產安全的重要手段,而對于整個以太坊來說,交易驗證時保證以太坊穩定運行和持續發展的重要方式,交易驗證主要出現在以下幾個場景中:用戶完成一筆交易的簽名時,需要將交易提交到區塊鏈網絡中,是交易能夠盡快確認,節點在提交交易之前需要先驗證交易,確認交易的合法性;節點收到其他節點廣播的交易時,節點需要先驗證交易是否合法,合法的交易才會加入節點的交易池;當一個挖礦節點成功計算出符合要求的哈希值后,節點會將交易池中的交易打包到區塊中,接地那在打包交易的時候需要驗證交易的合法性;節點收到其他節點同步到的區塊是,也需要驗證區塊中包含的交易。交易驗證由validateTx函數來完成,其邏輯代碼如下所示,在這里會檢查eip2718是否開啟以及交易的類型,之后檢查交易的size、交易轉賬的額度、交易的gas、交易簽名的正確性、確保交易遵循Nonce順序、交易人資產是否足夠、確保交易的gasprice幣基本的交易費用要高:

交易升級

交易升級主要是指將交易放入pending列表中去,該方法與add方法的不同之處在于add函數是將獲得到的新交易插入pending,而PromoteExecutables是將把給定的賬號地址列表中可以執行的交易從queue列表中插入pending中,并檢查失效的交易,然后發送交易池更新事件,其實現代碼如下所示:

在這里通過一個for循環來迭代所有的賬戶并升級交易,在這里首先將所有queue中nonce低于賬戶當前nonce的交易刪除:

之后將所有queue中消費大于賬戶所持余額或者gas大于最大gas限制的交易移除:

之后將所有可執行的交易從queue里面添加到pending里面,在這里會調用promoteTx方法將隊列中的交易(Txs)放入pending:

promoteTx實現代碼如下所示,該函數首先將交易插入到pending隊列中去,如果舊交易更好(交易Gasprice大于或等于原交易價值的110%為標準,具體跟pricebump設定有關系)則刪除當前這個交易,如果當前交易相較于舊的交易更好則刪除舊的交易,之后更新列表:

之后回到promoteExecutables函數中,如果非本地賬戶queue小于限制(AccountQueue)則進行移除操作:

最后記錄移除的條目并更新queuedGauge,如果隊列中此賬戶的交易為空則刪除此賬戶:

交易降級

交易降級是指當出現新的區塊時,已被打包的交易將從padding中降級到queue中,或者當另外一筆交易的Gasprice更高時則會從padding中降級到queue中,降級操作的關鍵實現函數為demoteUnexecutables,交易降級主要出現在以下三種情況中:分叉導致Account的Nonce值降低:假如原規范鏈A上交易序號m花費了20,且已經上鏈,而分叉后新規范鏈上交易序號m未上鏈,從而導致在規范鏈上記錄的賬戶的Nonce降低,這樣交易m就必須要回滾到交易池,放到queue中去;分叉后出現間隙:這種問題出現通常是因為交易余額問題導致的,假如原規范鏈上交易m花費100,分叉后該賬戶又發出一個交易m花費200,這就導致該賬戶余額本來可以支付原來規范鏈上的某筆交易,但在新的規范鏈上可能就不夠了,這個余額不足的交易如果是m+3,那么在m+2,m+4號交易之間就出現了空隙,這就導致從m+3開始往后所有的交易都要降級;分叉導致pending最前一個交易的nonce值與狀態的nonce值不等。demoteUnexecutables代碼如下所示,在這里首先通過遍歷pending列表來獲取每個addr的最新Nonce值,之后刪除Nonce小于之前查詢所得Nonce值的交易,之后返回賬戶余額已經不足以支付交易費用和一些暫時無效的交易,并將暫時無效的交易放到queue中,此時如果有間隙,則將后面的交易移動到queue列表中,如果經過上面的降級,如果pending里某個addr一個交易都沒有,就把該賬戶給刪除:

池子重置

我們可以通過reset來重置交易池,該方法具體代碼如下所示:

如果老區塊不為空且老區塊不是新區塊的父區塊,則檢查老區塊和新區塊之間的差值是否大于64,如果超過64則不進行重組,否則獲取舊頭和新頭的最新區塊,如果舊頭為null則檢查新頭的高度是否小于舊頭的高度,則打印日志并直接return,如果不滿足則繼續向下執行;如果舊頭不為null則開始進行重組,此時如果舊鏈的頭區塊大于新鏈的頭區塊高度時則舊鏈先后回退并回收所有回退的交易,如果新鏈的頭區塊大于舊鏈的頭區塊則新鏈后退并回收交易,當新鏈和舊鏈的到達同一高度時則同時回退直到找到共同的父節點,之后找出所有存儲在discard里面但是不在included里面的值,之后將這些交易重新插入到pool里面:

之后設置最新的世界狀態、設置新鏈頭區塊的狀態,然后把舊鏈回退的交易放入交易池:

文末小結

區塊鏈由區塊以鏈式結構相互鏈接而成,每一個區塊有區塊頭和區塊主體兩部分組成,其中區塊主體存儲交易記錄,故而"交易"成為了鏈上數據的關鍵所在,也是鏈上價值轉移的主要途徑,在公鏈體系中交易的構建流程、交易的驗證、交易的簽名、Gas費用的設計等環節都存在值得考慮的安全風險,例如:當交易費用(GasPrice)可為0時的零手續費惡意DOS攻擊、交易簽名偽造、雙花攻擊、交易簽名數據長度未校驗導致簽名時節點OOM等。本篇文章通過從源代碼角度對以太坊交易池數據結構、交易手續費設置、交易構建、交易簽名、交易入池、交易驗證、交易升級、交易降級、交易池重置等功能模塊的分析,探索了以太坊交易處理的流程以及安全設計,而公鏈安全體系的建設依舊是長路漫漫,有待進一步深入探索。參考鏈接:

https://blog.csdn.net/lj900911/article/details/84825739https://blog.csdn.net/pulong074

Tags:區塊鏈ENDGASONC區塊鏈dapp開發例子lend幣未來前景0xGaslessYearn.concubine

FIL
市場變化與比特幣持有者的決策_LAS:比特幣實時價格美元

感性是更為主導的力量 在加密領域,公鏈的數據都是透明的,這給市場分析帶來前所未有的透明度和準確度.

1900/1/1 0:00:00
一覽Swarm最新發布的官方白皮書_WAR:SolarMineX

本文為Swarm官方最新發布的白皮書全文,由藍貝殼云儲整理翻譯,星球日報經授權發布。內容僅供參考,最終請以官方白皮書中內容為準.

1900/1/1 0:00:00
專訪:Moonbeam為什么要做波卡上的智能合約平臺?_MOON:MOONB

Substrate讓區塊鏈構建者可以輕松設計和部署區塊鏈,但是去中心化應用程序開發者如何才能在不構建整個區塊鏈的情況下開始在Polkadot上部署其應用程序?Moonbeam是一個基于Subst.

1900/1/1 0:00:00
暴跌給DeFi帶來大考驗,或預示以太坊、波卡等的多鏈格局的未來走向_EFI:2023togetherbnb全部攻略

519大慘案你一定還歷歷在目,是個圈內人就很難忘記這一天,畢竟這是可以與312“齊名”的史詩級瀑布.

1900/1/1 0:00:00
針對加密藝術家的黑客騙局,一個文件毀掉整個職業生涯_ANT:SUR

在加密世界中,錢包被盜是一件令人心痛但又無可奈何且經常發生的事情。不同于其他網站、App,被盜后可以通過修改密碼的方式來找回自己的賬戶,在加密世界中,錢包的助記詞、私鑰一旦泄露,就意味著這個錢包.

1900/1/1 0:00:00
比特幣4年來首次重要升級,帶來了什么重大變化?_Tap:程序員把7500個比特幣當垃圾扔掉

6月13日,比特幣全網支持Taproot升級的礦池算力超過90%,達到鎖定升級的最低要求,這也意味著Taproot升級將于今年11月正式激活.

1900/1/1 0:00:00
ads