導航:首頁 > 以太坊區 > 以太坊合約數組參數傳遞

以太坊合約數組參數傳遞

發布時間:2025-03-31 20:37:04

A. Syrup 超級優化工作簡介

Syrup 是一項關於以太坊超級優化的工作,發表於 CAV 20',在超級優化領域內具有一定的創新性和前沿性,對 x86 程序的優化也有所啟發。

超級優化的目的是在保持程序功能不變的情況下,減少代碼的開銷或提高執行效率。例如,通過優化指令序列,將原始的 ADD SWAP1 ADD 優化為 ADD ADD,或者將復雜的四參數函數的執行過程簡化為更短的指令序列。

在以太坊的智能合約中,編譯器 solc 生成的代碼長度和執行開銷通常需要優化。通常,優化目標是盡可能減少執行指令的數量或降低 gas 開銷。對於較短的程序,可以通過窮舉法實現優化,但對於更長的程序,這種方法的空間復雜度極高。

Syrup 提出了一種基於棧模型的優化方法,通過符號執行收集初始和結束時的棧結構,從而定義等價性。在 EVM 的計算模型中,程序的優化需要考慮棧的狀態和指令的執行結果,而無需關注分支結構和寄存器。通過定義 SFS(Stack Functional Specification),Syrup 實現了對棧的簡潔刻畫。

在優化過程中,Syrup 使用 uninterpreted function 替代需要進行算術運算的指令,這允許演算法在不解析 bit vector 理論的情況下,通過符號執行和搜索等價程序來實現優化。通過這種方式,Syrup 的演算法能夠在保持程序功能不變的情況下,顯著減少執行指令的數量和 gas 開銷。

優化演算法首先定義了一系列約束條件,包括虛擬變數的值、指令的語義以及初始和結束棧的狀態。通過求解這些約束,Syrup 演算法能夠找到一個等價的、更短的指令序列,從而實現優化。

為了進一步提高優化效果,Syrup 引入了 MAX-SMT 方法,該方法通過對指令的權重進行計算,尋找執行開銷最小的優化解。這種方法能夠確保在保持程序功能不變的前提下,實現最佳的優化效果。

盡管本文主要討論了棧模型下的優化工作,對於更復雜的操作,如數組取值,Syrup 的後續工作 Gasol2 提出了相應的解決方案。然而,由於篇幅限制,這里不再深入討論。

B. 關於形式化驗證兩大工具(VaaS & Mythril)測試對比報告

智能合約安全在區塊鏈2.0時代成為核心議題,THE DAO和幣安的失竊事件警示了安全驗證的迫切需求。面對頻繁的漏洞暴露和經濟損失,安全問題的緊迫性日益凸顯。在現有的驗證方法中,形式化驗證工具如Mythril(0.21.12版)逐漸成為主流,尤其是針對以太坊智能合約。


本文聚焦於VaaS(由Beosin成都鏈安研發的驗證即服務)和Mythril的對比測試。VaaS憑借軍事級別的精確度和低誤報率,展現出強大的驗證能力,特別適合復雜業務合約;而Mythril在以太坊智能合約領域的專長顯著,但在處理非以太坊合約或業務合約時表現有限。測試案例涉及代幣與業務場景,結果顯示VaaS在檢測項和准確度上占優,檢測出635個問題(96.9%),誤報僅115個(15.3%);而Mythril則檢測了240個(36.6%),誤報高達226個(48.5%),其中重入和拒絕服務攻擊誤報率接近93.3%。


在特定檢測項上,VaaS的優勢更加明顯。例如,它准確識別出重入攻擊並僅誤報2處,而Mythril在tx.origin使用錯誤上對某些調用發出警報,但部分為誤報。對於區塊參數依賴和DoS攻擊,兩者均有所檢測,但VaaS在某些場景下表現出更強的防範能力。


以for循環處理數組的案例為例,VaaS能有效檢測整數溢出,而Mythril對非預設類型的溢出處理不充分。此外,VaaS在處理合約間調用時表現出優於Mythril的嚴謹性。


總結來說,對於智能合約的安全保障,VaaS在檢測精度和誤報控制上更勝一籌。然而,選擇哪個工具還需結合實際項目需求和對誤報率的容忍度。確保智能合約安全是區塊鏈行業不可或缺的一環,而形式化驗證作為提升安全性的有力工具,其效果評估和優化將直接影響區塊鏈生態的穩健發展。


結論:智能合約安全性的提升是區塊鏈演進的關鍵,VaaS與Mythril各有其優勢,用戶應根據項目特性進行權衡。同時,持續改進工具性能和降低誤報率是行業共同面臨的挑戰,以實現區塊鏈技術的持續穩定發展。

C. 區塊鏈怎麼防止重復交易,區塊鏈交易如何避免收到黑

區塊鏈技術

背景:比特幣誕生之後,發現該技術很先進,才發現了區塊鏈技術。比特幣和區塊鏈技術同時被發現。

1.1比特幣誕生的目的:

①貨幣交易就有記錄,即賬本;

②中心化機構記賬弊端——可篡改;易超發

比特幣解決第一個問題:防篡改——hash函數

1.2hash函數(加密方式)

①作用:將任意長度的字元串,轉換成固定長度(sha256)的輸出。輸出也被稱為hash值。

②特點:很難找到兩個不同的x和y,使得h(x)=h(y)。

③應用:md5文件加密

1.3區塊鏈

①定義

區塊:將總賬本拆分成區塊存儲

區塊鏈:在每個區塊上,增加區塊頭。其中記錄父區塊的hash值。通過每個區塊存儲父區塊的hash值,將所有的區塊按照順序連接起來,形成區塊鏈。

②區塊鏈如何防止交易記錄被篡改

形成區塊鏈後,篡改任一交易,會導致該交易區塊hash值和其子區塊中不同,發現篡改。

即使繼續篡改子區塊頭中hash值,會導致子區塊hash值和孫區塊中不同,發現篡改。

1.4區塊鏈本質

①比特幣和區塊鏈本質:一個人人可見的大賬本,只記錄交易。

②核心技術:通過密碼學hash函數+數據結構,保證賬本記錄不可篡改。

③核心功能:創造信任。法幣依靠政府公信力,比特幣依靠技術。

1.5如何交易

①進行交易,需要有賬號和密碼,對應公鑰和私鑰

私鑰:一串256位的二進制數字,獲取不需要申請,甚至不需要電腦,自己拋硬幣256次就生成了私鑰

地址由私鑰轉化而成。地址不能反推私鑰。

地址即身份,代表了在比特幣世界的ID。

一個地址產生之後,只有進入區塊鏈賬本,才能被大家知道。

②數字簽名技術

簽名函數sign(張三的私鑰,轉賬信息:張三轉10元給李四)=本次轉賬簽名

驗證韓式verify(張三的地址,轉賬信息:張三轉10元給李四,本次轉賬簽名)=True

張三通過簽名函數sign(),使用自己的私鑰對本次交易進行簽名。

任何人可以通過驗證韓式vertify(),來驗證此次簽名是否有由持有張三私鑰的張三本人發出。是返回true,反之為false。

sign()和verify()由密碼學保證不被破解。·

③完成交易

張三將轉賬信息和簽名在全網供內部。在賬戶有餘額的前提下,驗證簽名是true後,即會記錄到區塊鏈賬本中。一旦記錄,張三的賬戶減少10元,李四增加10元。

支持一對一,一對多,多對已,多對多的交易方式。

比特幣世界中,私鑰就是一切!!!

1.6中心化記賬

①中心化記賬優點:

a.不管哪個中心記賬,都不用太擔心

b.中心化記賬,效率高

②中心化記賬缺點:

a拒絕服務攻擊

b厭倦後停止服務

c中心機構易被攻擊。比如破壞伺服器、網路,監守自盜、法律終止、政府幹預等

歷史上所有有中心化機構的機密貨幣嘗試都失敗了。

比特幣解決第二個問題:如何去中心化

1.7去中心化記賬

①去中心化:人人都可以記賬。每個人都可以保留完整的賬本。

任何人都可以下載開源程序,參與P2P網路,監聽全世界發送的交易,成為記賬節點,參與記賬。

②去中心化記賬流程

某人發起一筆交易後,向全網廣播。

每個記賬節點,持續監聽、持續全網交易。收到一筆新交易,驗證准確性後,將其放入交易池並繼續向其它節點傳播。

因為網路傳播,同一時間不同記賬節點的交一次不一定相同。

每隔10分鍾,從所有記賬節點當中,按照某種方式抽取1名,將其交易池作為下一個區塊,並向全網廣播。

其它節點根據最新的區塊中的交易,刪除自己交易池中已經被記錄的交易,繼續記賬,等待下一次被選中。

③去中心化記賬特點

每隔10分鍾產生一個區塊,但不是所有在這10分鍾之內的交易都能記錄。

獲得記賬權的記賬節點,將得到50個比特幣的獎勵。每21萬個區塊(約4年)後,獎勵減半。總量約2100萬枚,預計2040年開采完。

記錄一個區塊的獎勵,也是比特幣唯一的發行方式。

④如何分配記賬權:POW(proofofwork)方式

記賬幾點通過計算一下數學題,來爭奪記賬權。

找到某隨即數,使得一下不等式成立:

除了從0開始遍歷隨機數碰運氣之外,沒有其它解法,解題的過程,又叫做挖礦

誰先解對,誰就得到記賬權。

某記賬節點率先找到解,即向全網公布。其他節點驗證無誤之後,在新區塊之後重新開始新一輪的計算。這個方式被稱為POW。

⑤難度調整

每個區塊產生的時間並不是正好10分鍾

隨著比特幣發展,全網算力不算提升。

為了應對算力的變化,每隔2016個區塊(大約2周),會加大或者減少難度,使得每個區塊產生的平均時間是10分鍾。

#歐易OKEx##比特幣[超話]##數字貨幣#

以太坊區塊鏈之Bug--2020/05/19

為了防止交易重播,ETH(ETC)節點要求每筆交易必須有一個nonce數值。每一個賬戶從同一個節點發起交易時,這個nonce值從0開始計數,發送一筆nonce對應加1。當前面的nonce處理完成之後才會處理後面的nonce。注意這里的前提條件是相同的地址在相同的節點發送交易。

以下是nonce使用的幾條規則:

●當nonce太小(小於之前已經有交易使用的nonce值),交易會被直接拒絕。

●當nonce太大,交易會一直處於隊列之中,這也就是導致我們上面描述的問題的原因;

●當發送一個比較大的nonce值,然後補齊開始nonce到那個值之間的nonce,那麼交易依舊可以被執行。

●當交易處於queue中時停止geth客戶端,那麼交易queue中的交易會被清除掉。

?????第一個欄位AccountNonce,直譯就是賬戶隨機數。它是以太坊中很小但也很重要的一個細節。以太坊為每個賬戶和交易都創建了一個Nonce,當從賬戶發起交易的時候,當前賬戶的Nonce值就被作為交易的Nonce。這里,如果是普通賬戶那麼Nonce就是它發出的交易數,如果是合約賬戶就是從它的創建合約數。

為什麼要使用這個Nonce呢?其主要目的就是為了防止重復攻擊(ReplayAttack)。因為交易都是需要簽名的,假定沒有Nonce,那麼只要交易數據和發起人是確定的,簽名就一定是相同的,這樣攻擊者就能在收到一個交易數據後,重新生成一個完全相同的交易並再次提交,比如A給B發了個交易,因為交易是有簽名的,B雖然不能改動這個交易數據,但只要反復提交一模一樣的交易數據,就能把A賬戶的所有資金都轉到B手裡。

當使用賬戶Nonce之後,每次發起一個交易,A賬戶的Nonce值就會增加,當B重新提交時,因為Nonce對不上了,交易就會被拒絕。這樣就可以防止重復攻擊。當然,事情還沒有完,因為還能跨鏈實施攻擊,直到EIP-155引入了chainID,才實現了不同鏈之間的交易數據不兼容。事實上,Nonce並不能真正防止重復攻擊,比如A向B買東西,發起交易T1給B,緊接著又提交另一個交易T2,T2的Gas價格更高、優先順序更高將被優先處理,如果恰好T2處理完成後剩餘資金已經不足以支付T1,那麼T1就會被拒絕。這時如果B已經把東西給了A,那A也就攻擊成功了。所以說,就算交易被處理了也還要再等待一定時間,確保生成足夠深度的區塊,才能保證交易的不可逆。

Price指的是單位Gas的價格,所謂Gas就是交易的消耗,Price就是單位Gas要消耗多少以太幣(Ether),Gas*Price就是處理交易需要消耗多少以太幣,它就相當於比特幣中的交易手續費。

GasLimit限定了本次交易允許消耗資源的最高上限,換句話說,以太坊中的交易不可能無限制地消耗資源,這也是以太坊的安全策略之一,防止攻擊者惡意佔用資源。

Recipient是交易接收者,它是common.Address指針類型,代表一個地址。這個值也可以是空的,這時在交易執行時,會通過智能合約創建一個地址來完成交易。

Amount是交易額。這個簡單,不用解釋。

Payload比較重要,它是一個位元組數組,可以用來作為創建合約的指令數組,這時每個位元組都是一個單獨的指令;也可以作為數據數組,由合約指令來進行操作。合約由以太坊虛擬機(EthereumVirtualMachine,EVM)創建並執行。

V、R、S是交易的簽名數據。以太坊當中,交易經過數字簽名之後,生成的signature是一個長度65的位元組數組,它被截成三段,前32位元組被放進R,再32位元組放進S,最後1個位元組放進V。那麼為什麼要被截成3段呢?以太坊用的是ECDSA演算法,R和S就是ECSDA簽名輸出,V則是RecoveryID。

R,S,V是交易簽名後的值,它們可以被用來生成簽名者的公鑰;R,S是ECDSA橢圓加密演算法的輸出值,V是用於恢復結果的ID

區塊鏈安全性主要通過什麼來保證

區塊鏈技術是一種分布式記錄技術,它通過對數據進行加密和分布式存儲,來保證數據的安全性和可靠性。

主要通過以下幾種方式來保證區塊鏈的安全性:

1.加密技術:區塊鏈採用的是對稱加密和非對稱加密演算法,可以有效保護數據的安全。

2.分布式存儲:區塊鏈的數據不是集中存儲在單一節點上,而是分散存儲在網路中的各個節點上,這有效防止了數據的篡改和丟失。

3.共識機制:區塊鏈通常採用共識機制來確認交易的合法性,這有助於防止惡意交易的發生。

4.合約機制:區塊鏈可以通過智能合約來自動執行交易,這有助於防止操縱交易的發生。

區塊鏈技術在實現安全性的同時,也帶來了一些挑戰。例如,區塊鏈的安全性可能受到漏洞的攻擊,或者因為私鑰泄露而導致資產被盜。因此,在使用區塊鏈技術時,還需要注意身份認證、密碼安全等方面的問題,以確保區塊鏈的安全性。

此外,區塊鏈技術的安全性也可能受到政策、法規等方面的影響。例如,在某些國家和地區,區塊鏈技術可能會受到審查和限制,這也可能會對區塊鏈的安全性產生影響。

總的來說,區塊鏈技術的安全性主要通過加密技術、分布式存儲、共識機制和合約機制等方式來保證,但是還需要注意其他方面的挑戰和影響因素。

D. Solidity語法詳解 - 類型介紹1

Solidity是一種用於以太坊智能合約編程的語言,本文將詳細介紹其基本類型,分為值類型和引用類型兩大類。值類型包括布爾型、整型、定長浮點型、定長位元組數組、有理數和整型常量、字元串常量以及十六進制常量。其中,布爾型包含常量值true和false,支持邏輯運算符;整型支持有符號和無符號整數,提供比較、位操作和算術運算符;定長浮點型雖然當前版本不完全支持,但可以聲明變數;定長位元組數組支持比較、位操作和索引訪問;有理數和整型常量支持任意精度,但轉換為非常量類型或與非常量進行運算時可能影響精度;字元串常量可以由單引號或雙引號引起來,長度類型可變,支持轉義字元;十六進制常量以關鍵字hex開頭,後跟十六進制字元串。

引用類型則包括函數類型、地址和地址常量等。函數類型允許聲明函數的返回值和參數類型,地址用於表示以太坊地址,地址常量則是地址的字面表示形式。

在Solidity中,類型被嚴格區分,值類型在賦值或傳參時總是進行值拷貝,而引用類型則允許對原始對象進行引用操作。值類型如布爾型、整型、定長浮點型和定長位元組數組等提供了豐富的運算符,包括比較、位操作和算術運算符。有理數和整型常量允許表達任意精度,但轉換為非常量類型或與非常量進行運算時可能影響精度。字元串常量和十六進制常量則分別用於表示文本數據和十六進制數值。

枚舉類型允許自定義特定的類型,並可以顯示轉換為整數類型,但不能進行隱式轉換。枚舉成員必須至少有一個,以示例的形式展示枚舉的使用。

代碼實例和詳細說明請參考區塊鏈技術小專欄的全文鏈接。

E. 【C語言與以太坊】1.0 如何根據私鑰生成以太坊地址

要將C語言與以太坊結合,生成以太坊地址,主要需要實現以下關鍵步驟。

首先,確保所有必需的庫在Linux環境中正確安裝。對於libsecp256k1,需要在構建時使用參數"./configure --enable-mole-recovery"來支持後續文章中簽名功能的實現。

其次,理解生成以太坊地址的原理如下:

1. 使用256位私鑰在secp256k1橢圓曲線上計算出對應的公鑰。公鑰的表示形式為前綴04加上X和Y的值。

2. 去除公鑰的前綴04,接著計算其32位元組的keccak256哈希值。

3. 從哈希值的後20位元組提取,即為最終生成的以太坊地址。

具體實現步驟如下:

1. 包含所有必需的頭文件。

2. 定義輔助函數用於列印十六進制位元組流。

3. 以長度為32的字元數組形式聲明並定義私鑰。私鑰的長度為256位,即32個16進制數的數組。

4. 利用私鑰生成公鑰,注意在序列化公鑰時使用宏SECP256K1_EC_UNCOMPRESSED,確保公鑰以非壓縮的65位元組形式輸出。

5. 去除公鑰的前綴04後,對剩餘部分進行哈希處理,哈希值的後20位元組即為以太坊地址。

實現完整代碼後,將源文件保存為PriKeyToAddr.c,進行編譯和運行。

運行結果與錢包中顯示的地址一致,驗證了整個流程的正確性。

F. ETH查詢某個錢包的所有代幣以及地址

1. 獲取錢包W的所有交易記錄。
2. 將交易記錄中的發送方(from)和接收方(to)信息提取出來,並存入數組A。
3. 根據智能合約的ABI規則,去除每個交易輸入數據的的前8個字元(方法名),並將剩餘的字元按照每64個字元分割,得到參數列表。由於以太坊地址通常位於參數的右側,提取出右側的地址參數,並與ETH地址長度進行對比,一致則認為該地址為代幣合約地址,將其存入數組A中。
4. 遍歷數組A,對每個地址調用ERC20標准合約的方法'symbol'和'decimals'。如果這兩個方法都存在,則表明該地址是一個代幣合約,將該代幣信息存入數組B。
5. 遍歷數組B,調用ERC20合約的'balanceOf'方法,獲取每個代幣合約中錢包W的余額,將余額信息存入數組C。
6. 至此,我們成功獲取了錢包W的所有代幣信息B及其對應的余額C。

閱讀全文

與以太坊合約數組參數傳遞相關的資料

熱點內容
區塊鏈技術用到java 瀏覽:704
世紀佳緣相親比特幣騙局 瀏覽:762
挖礦比特幣用電量 瀏覽:120
如何賺數字貨幣 瀏覽:168
比特幣交易所運營模式 瀏覽:298
以太坊一次交易最多傳遞多大 瀏覽:121
算力蜂下載鏈接蘋果版本 瀏覽:486
比特幣套了多少錢一個 瀏覽:499
虛擬貨幣相關基金 瀏覽:915
比特幣電腦勒索圖片 瀏覽:393
亞泰坊數字貨幣現況 瀏覽:130
抽成破解以太坊 瀏覽:330
以太坊經典有的時間 瀏覽:304
比特幣價格在向下調整 瀏覽:738
btc全節點數量在哪看 瀏覽:978
比特幣12月幾號硬分叉 瀏覽:553
虛擬貨幣可以發行原始股嗎 瀏覽:934
比特幣橫盤暴跌 瀏覽:229
李啟威談數字貨幣未來 瀏覽:556
以太坊暴漲的幾個時間 瀏覽:812