• <pre id="x08qo"></pre><object id="x08qo"></object><track id="x08qo"></track>

    1. <track id="x08qo"></track>
        <acronym id="x08qo"><strong id="x08qo"><address id="x08qo"></address></strong></acronym>
        收藏本站 網站導航 開放平臺 Tuesday, November 7, 2023 星期二
        • 微信

        以太坊的 101 關鍵知識點

        來源 中金網 06-17 09:41
        摘要: 以太坊是一個內置圖靈完備編程語言的區塊鏈, 允許任何人編寫智能合約和去中心化應用程序,他們可以在其中為所有權、交易格式和狀態轉換功能創建自己的任意規則.

          以太坊是 “下一代智能合約和去中心化應用平臺” (參考這里[4])

          以太坊是一個內置圖靈完備編程語言的區塊鏈, 允許任何人編寫智能合約和去中心化應用程序,他們可以在其中為所有權、交易格式和狀態轉換功能創建自己的任意規則. (參考這里[5])

          以太坊是一個開源的、全球去中心化的計算基礎設施,它執行稱為智能合約的程序. 它使用區塊鏈來同步和存儲系統的狀態變化,以及一種稱為以太幣的加密貨幣來計量和限制執行資源成本. 它通常被描述為“世界計算機”。(參考這里[6])

          以太坊平臺使開發人員能夠構建具有內置經濟功能的強大去中心化應用程序。在提供高可用性、可審計性、透明性和中立性的同時,它還減少或消除了審查制度并降低了某些交易對手風險。(參考這里[7])

          以太坊的主要目的不是成為數字貨幣支付網絡。雖然數字貨幣以太幣對于以太坊的運作來說既是不可或缺的,也是必不可少的, 以太幣旨在作為一種實用貨幣來支付使用以太坊平臺作為世界計算機的費用。(參考這里[8])

          與腳本語言非常有限的比特幣不同,以太坊被設計成一個通用的可編程區塊鏈,它運行一個能夠執行任意和無限復雜代碼的虛擬機。比特幣的腳本語言有意限制為對花費條件進行簡單的真假評估, 而以太坊的語言是圖靈完備的,這意味著以太坊可以直接充當通用計算機。(參考這里[9])

          原始區塊鏈,即比特幣的區塊鏈,跟蹤比特幣單位的狀態及其所有權。你可以將比特幣視為分布式共識狀態機,其中交易會導致全局狀態轉換,從而改變貨幣的所有權。狀態轉換受到共識規則的約束,允許所有參與者(最終)在挖掘多個區塊后收斂于系統的共同(共識)狀態。以太坊也是一個分布式狀態機。但不是只跟蹤貨幣所有權的狀態,以太坊跟蹤通用數據存儲的狀態轉換,即可以保存任何可表示為鍵值元組的數據的存儲 (參考這里[10])

          以太坊的核心組件 (參考這里[11]):

          P2P 網絡:以太坊運行在以太坊主網上,可在 TCP 端口 30303 上尋址, 并且運行著一個稱作“DΞVp2p”(譯者注:其實就是DEVp2p)的連接協議.

          交易:以太坊交易是網絡消息,包括(除其他外)發送者、接收者、價值和數據負載。

          狀態機:以太坊狀態轉換由以太坊虛擬機 (EVM) 處理,EVM 是一種基于堆棧的虛擬機,可執行字節碼(機器語言指令)。EVM 程序,稱為“智能合約”,是用高級語言(例如 Solidity 或 Vyper)編寫的,并編譯為字節碼以在 EVM 上執行。

          數據結構:以太坊的狀態作為數據庫(通常是谷歌的 LevelDB)本地存儲在每個節點上,其中包含稱為 Merkle Patricia Tree 的序列化哈希數據結構中的交易和系統狀態。

          以太坊的核心組件(持續更新中):

          共識算法:以太坊之前使用比特幣的共識模型 Nakamoto Consensus,通過工作量證明 (PoW) 對重要性進行加權以確定最長的鏈,現在以太坊已經切換到權益證明 (PoS) 算法。

          經濟安全性:以太坊目前使用稱為 Ethash 的 PoW 算法,但在以太坊 2.0 中正在過渡到 PoS 算法。

          客戶端:以太坊有多個可互操作的客戶端軟件實現,其中最突出的是 Go-Ethereum (Geth) 和 OpenEthereum。其他的是 Erigon、Nethermind 和 Turbo-geth。OpenEthereum 正在被棄用以過渡到 Erigon,即以前的 Turbo-geth。(參考這里[12])

          以太坊能夠在稱為以太坊虛擬機的狀態機中執行存儲的程序,同時在內存中讀取和寫入數據,使其成為圖靈完備的系統。圖靈完備系統面臨停機問題的挑戰,即給定一個任意程序及其輸入,無法確定程序是否最終會停止運行。所以以太坊無法預測智能合約是否會終止,或者它會運行多長時間。因此,為了限制智能合約使用的資源,以太坊引入了一種稱為燃料(gas)的計量機制。(參考這里[13])

          當 EVM 執行智能合約時,它會仔細考慮每條指令(計算、數據訪問等)。每條指令都有一個預先確定的成本,以 gas 為單位。當交易觸發智能合約的執行時,它必須包含一定數量的燃料,以設置運行智能合約可以消耗的上限。如果計算消耗的gas量超過交易中可用的gas量,則 EVM 將終止執行。Gas 是以太坊用來允許圖靈完備計算同時限制任何程序可以消耗的資源的機制。(參考這里[14])

          以太需要與交易一起發送,并且需要明確指定用于購買燃料,以及可接受的燃料價格。就像加油站一樣,汽油的價格不是固定的。購買燃料是為了交易,執行計算,并將任何未使用的燃料退還給交易的發送者。(參考這里[15])

          去中心化應用程序,縮寫為 DApp,是一種構建在開放、去中心化、點對點基礎設施服務之上的網絡應用程序,通常將智能合約與web界面相結合。

          DApps 代表了從應用程序集中擁有和管理的“Web 2.0”到“Web 3.0”的過渡,在“Web 3.0”中,應用程序構建在用于計算(即區塊鏈)、存儲和消息傳遞的去中心化對等協議上。

          以太坊區塊鏈代表 Web 3.0 的去中心化計算部分。Swarm 代表去中心化存儲,而 Whisper(現在的 Waku)代表去中心化消息傳遞協議。

          去中心化可以被認為是三種類型 (參考這里[16]):

          架構去中心化

          政治去中心化

          邏輯去中心化

          以太坊的貨幣單位稱為以太幣或“ETH”。以太被細分為更小的單位,最小的單位被命名為wei。10的3次方 wei 是 1 Babbage, 10的6次方 wei 是 1 Lovelace, 10的9次方 wei 是 1 Shannon 和 10的18次方 wei 是 1 Ether.

          以太坊使用公鑰加密來創建公私密鑰對(被認為是“一對”,因為公鑰是從私鑰派生的) 不用于加密但用于數字簽名.

          以太坊使用橢圓曲線數字簽名算法 (ECDSA) 進行基于橢圓曲線密碼學 (ECC) 的數字簽名(SECP-256k1 曲線), 一種基于有限域上橢圓曲線代數結構的公鑰密碼學方法。(參考這里[17])

          以太坊私鑰是一個 256 位的隨機數,它唯一地確定一個單一的以太坊地址,也稱為賬戶。

          以太坊公鑰是使用橢圓曲線乘法從私鑰計算出的橢圓曲線上的一個點。不能從公鑰計算出私鑰。

          以太坊狀態由稱為“賬戶”的對象組成,每個賬戶都有一個 20 字節的地址,狀態轉換是賬戶之間價值和信息的直接轉移。(參考這里[18])

          以太坊賬戶包含四個字段:

          nonce,用于確保每筆交易只能處理一次的計數器

          賬戶當前的以太幣余額

          賬戶的合約代碼(如果存在)

          賬戶的存儲空間(默認為空)

          以太坊有兩種不同類型的賬戶:

          由私鑰控制的外部擁有賬戶 (EOA)

          合約代碼控制的合約賬戶

          EOA 對以太幣的所有權是通過私鑰、以太坊地址和數字簽名建立的。任何擁有私鑰的人都可以控制相應的 EOA 賬戶及其持有的任何以太幣。

          EOA 沒有代碼,可以通過創建和簽署交易從 EOA 發送消息。

          一個合約賬戶有代碼和相關的存儲,每次它收到一條消息,它的代碼就會激活,允許它讀取和寫入內部存儲并依次發送其他消息或創建合約。

          智能合約可以被認為是存在于以太坊執行環境中的“自治代理”, 當被消息或者交易觸發時總是會執行特定代碼片段,并直接控制他們自己的以太幣余額和他們自己的鍵值存儲以跟蹤持久變量.

          以太坊使用 Keccak-256 作為其加密哈希函數。Keccak-256 是 NIST 舉辦的 SHA-3 競賽的獲勝候選者,但與最終采用的 SHA-3 標準不同。(參考這里[19])

          EOA 賬戶的以太坊地址是 EOA 密鑰對公鑰的 Keccak-256 散列的最后 20 個字節(最低有效字節)。

          交易是由外部擁有的帳戶 (EOA) 發起的簽名消息, 由以太坊網絡傳輸,并記錄在以太坊區塊鏈上。只有交易才能觸發狀態的改變。以太坊是一個基于交易的狀態機。(參考這里[20])

          一個交易有如下屬性:

          原子的(Atomic): 它是全有或全無,即不能被其他交易分割或中斷

          順序的(Serial): 交易按順序依次處理,不與其他交易重疊

          包含與否(Inclusion): 不能保證交易被包含(打包),并且取決于網絡擁塞和 gasPrice 等因素。礦工決定打包與否。

          排序: 交易順序無法保證,取決于網絡擁塞和 gasPrice 等因素。礦工決定順序。

          交易是包含以下組件的序列化二進制消息 (參考這里[21]):

          nonce: 由原始 EOA 發布的序列號,用于防止消息重播

          gasPrice: 發起人愿意為每單位燃料支付的以太幣數量(以 wei 為單位)

          gasLimit: 發起人愿意為此交易支付的最大gas量

          recipient: 目標以太坊地址

          value: 發送到目的地的以太幣數量(以 wei 為單位)

          data: 可變長度二進制數據有效載荷

          v,r,s: 原始 EOA 的 ECDSA 數字簽名的三個組成部分

          Nonce: 標量值等于從 EOA 賬戶發送的交易數量,或者在合約賬戶的情況下,它是帳戶創建合約的數量。(參考這里[22])

          Gas price: 交易發起者愿意為換取 gas 支付的價格。價格以單位燃料 wei 為單位。gas 價格越高,交易在區塊鏈上得到確認的速度就越快。建議的 gas 價格取決于交易時對區塊空間的需求。

          Gas limit: 交易發起者為完成交易愿意支付的最大gas單位數

          Recipient: 交易接收者的 20 字節以太坊地址,可以是 EOA 或合約賬戶。

          以太坊協議不驗證交易中的接收人地址??梢詫⒔灰装l送到沒有對應私鑰或合約的地址。驗證應該在用戶界面級別完成。

          請注意,交易中沒有發送者地址,因為 EOA 的公鑰可以從 ECDSA 簽名的 v,r,s 組件派生,交易發起人的地址可以從這個公鑰中導出。

          Value: 發送給交易接收者的以太幣價值。如果收件人是 EOA,則該帳戶的余額將增加此值。如果收件人是合約地址,則結果取決于作為此交易的一部分發送的任何數據。如果沒有數據,則調用接收者合約的接收(receive)或回退(fallback)函數(如果它們存在)。根據這些功能的實現,以太值會添加到合約賬戶的余額中,或者發生異常則該以太幣保留在發起人的帳戶中。

          Data: 發送到合約賬戶的信息,(通常)表示要調用的合約函數和該函數的參數。

          v,r,s: r 和 s 是交易發起方使用私鑰生成的 ECDSA 簽名的兩部分。v 是恢復標識符,計算為 27 或 28 之一, 或者作為鏈 ID(以太坊主網 chainID 為 1)加倍加 35 或 36。(參考這里[23])

          數字簽名在以太坊中有三個用途: 1) 證明私鑰的所有者,即以太坊帳戶的所有者,已授權以太幣的支出或合約的執行 2) 保證不可否認性: 授權證明是不可否認的 3) 證明交易數據在交易簽署后沒有被也不能被任何人修改。

          合約創建交易被發送到一個特殊的目標地址,稱為零地址,即 0x0。合約創建交易包含一個數據有效負載,其中包含用于創建合約的已編譯字節碼。value字段中的可選以太幣金額將創建具有初始余額的新合約。

          交易 與 消息:

          交易由EOA生成,其中外部參與者發送簽名的數據包,該數據包可以是: 1) 給另一個EOA 發送價值, 或者是 2) 調用一個合約賬戶,在此賬戶執行合約代碼。

          消息要么是 : 1) 由交易觸發指向另一個EOA或合約賬戶 要么 2) 在EVM內部合約觸發,當執行CALL系列字節碼并觸發或價值轉移時觸發。

          交易被分組到塊中。區塊鏈包含一系列這樣的塊,這些塊被鏈接在一起。

          區塊: 包含一批交易,并包含鏈的前一個區塊哈希值。這將塊鏈接在一起(在一條鏈中),因為哈希是從塊數據中加密導出的。這可以防止欺詐,因為歷史上任何區塊的一次更改都會使所有后續區塊無效,因為所有后續哈希值都會發生變化,并且運行區塊鏈的每個人都會注意到。為了保留交易歷史,塊是嚴格排序的(每個創建的新塊都包含對其父塊的引用), 區塊內的交易也是嚴格有序的。(參考這里[24])

          以太坊節點/客戶端: 節點是實現以太坊規范并通過點對點網絡與其他以太坊節點通信的軟件應用程序??蛻舳耸且蕴还濣c的具體實現。以太坊升級到 POS 后, 節點需要兩個客戶端:執行層客戶端和共識稱客戶端。最常見的執行層客戶端實現是 Geth 和 Nethermind。最常見的共識層客戶端實現是 Prysm 和 Lighthouse。以太坊交易被發送到以太坊節點以在點對點網絡中廣播。(參考這里[25])

          礦工、驗證者: 是運行以太坊節點的實體,它們驗證和執行這些交易并將它們組合成塊。驗證者提案區塊或見證區塊,若提案區塊被接受將獲得區塊獎勵。礦工還獲得費用,這是區塊中包含的所有交易在gas上花費的以太幣。

          區塊gas limit 是指區塊內所有交易消耗的gas總量上限。因此,就交易數量而言,區塊的大小并不是固定的,因為不同的交易會消耗不同數量的gas。參考這里[26] 。

          區塊需要時間通過網絡傳播。

          共識: 以太坊上下文中的去中心化共識是指確定哪個驗證者可以提案區塊。

          狀態是地址和帳戶狀態之間的映射,以修改后的 Merkle Patricia 樹或特里樹的形式實現。Merkle 樹或 trie 是一種二叉樹,由一組具有以下特征的節點組成:

          樹底部的葉節點包含基礎數據

          中間節點,其中每個節點都是其兩個子節點的哈希值

          單個根節點由其代表樹頂部的兩個子節點的哈希值形成

          以太坊的工作量證明算法稱為“Ethash” , 現在已經不再使用。

          區塊包含區塊頭、交易和 ommers 的區塊頭。區塊頭包含 (參考這里[27]), 部分字段在 POS 升級后,修改了使用用途。

          parentHash: 整個父區塊頭的 Keccak 256 位哈希

          ommersHash: 此塊的 ommers 列表部分的 Keccak 256 位哈希

          beneficiary: 160 位地址,該區塊成功挖礦所收取的所有費用將轉移到該地址

          stateRoot: 狀態樹根節點的 Keccak 256 位散列,在執行所有交易并應用終結后

          transactionsRoot: 塊的交易列表部分中的每個交易填充的 trie 結構的根節點的 Keccak 256 位哈希

          receiptsRoot: trie 結構根節點的 Keccak 256 位散列,其中填充了區塊交易列表部分中每筆交易的收據

          logsBloom: Bloom filter 由交易列表中每筆交易的每個日志條目中包含的可索引信息(記錄器地址和日志主題)組成

          difficulty: 與該塊的難度級別相對應的標量值。這可以根據前一個塊的難度級別和時間戳計算得出

          number: 一個標量值等于祖先塊的數量。創世塊的編號為零

          gasLimit: 一個標量值等于當前每個區塊的gas消耗限制

          gasUsed: 一個標量值,等于該區塊中交易中使用的總gas量

          timestamp: 標量值等于 Unix 的 time() 在此塊開始時的合理輸出

          extraData: 包含與此塊相關的數據的任意字節數組。這必須是 32 字節或更少

          mixHash: 一個 256 位哈希值,與隨機數結合,證明已對該塊進行了足夠量的計算

          nonce: 一個 64 位值,與mixHash結合,證明已對該塊執行了足夠的計算量

          stateRoot, transactionsRoot and receiptsRoot 是修改后的 Merkle-Patricia 樹的根節點的 256 位哈希值。stateRoot 的葉子是所有以太坊地址-賬戶對的鍵值對, 其中每個相應的帳戶包括:

          nonce: 標量值等于從該地址發送的交易數量,或者對于具有關聯代碼的賬戶,該賬戶創建的合約數量

          balance: 一個標量值,等于該地址擁有的 Wei 數量

          storageRoot: 修改后的 Merkle-Patricia 樹根節點的 256 位hash,對帳戶的存儲內容進行編碼(256 位整數值之間的映射),作為從 256 位整數鍵的 Keccak 256 位散列到 RLP 編碼的 256 位整數值的映射,編碼到 trie 中。

          codeHash: 該賬戶EVM代碼的hash—如果此地址收到消息調用,將會執行的代碼;它是不可變的,因此與所有其他字段不同,它在構建后無法更改。

          交易收據是四項的元組,包括:

          交易發生后立即在包含交易收據的區塊中使用的累計gas

          通過執行交易創建的一組日志

          由這些日志中的信息組成的布隆過濾器

          交易的狀態碼

          gas退回和受益人: 交易中任何未使用的 gas(gas Limit 減去交易使用的 gas)將以相同的 gas Price 退還給發送者的賬戶。交易消耗的gas的以太幣記入受益人(在區塊標頭中指定),該地址通常由驗證者指定,這是支付給礦工的交易“小費”。

          EVM 是一個準圖靈完備機,其中“準”是因為計算本質上受參數、gas 限制的事實,限制了完成的計算總量。EVM 是智能合約的運行時環境。

          以太坊合約中的代碼是用一種低級的、基于堆棧的字節碼語言編寫的,稱為“以太坊虛擬機代碼”或“EVM 代碼”。該代碼由一系列字節(因此稱為字節碼)組成,其中每個字節代表一個操作。

          EVM 是一個簡單的基于堆棧的架構,由堆棧、易失性內存、字長為 256 位的非易失性存儲(被選擇以促進 Keccak256 哈希方案和橢圓曲線計算)和 Calldata 組成。

          堆棧由 1024 個 256 位元素組成。EVM 指令可以操作棧頂的 16 個元素。大多數 EVM 指令使用堆棧(基于堆棧的體系結構)進行操作,并且還有特定于堆棧的操作,例如PUSH、POP、SWAP、DUP 等。

          內存是一個線性字節數組,可在字節級別尋址,并且是易失性的。所有位置最初都明確定義為零。這是通過 MLOAD、MSTORE 和 MSTORE8 指令訪問的。

          存儲是一個 256 位到 256 位的鍵值存儲。與易失性內存不同,存儲是非易失性的,并且作為系統狀態的一部分進行維護。所有位置最初都明確定義為零。這是通過 SLOAD/SSTORE 指令訪問的。

          Calldata 是一個只讀的字節可尋址空間,其中保存了交易或調用的數據參數。這是通過 CALLDATASIZE/CALLDATALOAD/CALLDATACOPY 指令訪問的。

          EVM 不遵循標準的馮諾依曼架構。它不是將程序代碼存儲在通??稍L問的內存或存儲器中,而是單獨存儲在只能通過專用指令訪問的虛擬 ROM 中。

          EVM 使用大端排序,其中一個字的最高有效字節存儲在最小的內存地址中,最低有效字節存儲在最大的內存地址中

          EVM指令集可分為11類:

          停止和算術運算

          比較和按位邏輯運算

          SHA3

          環境信息

          區塊信息

          堆棧、內存、存儲和流操作

          push操作

          復制操作

          交互操作

          日志操作

          系統操作

          停止和算術運算(依次為:操作碼、助記符、棧元素被移除個數、棧元素被放置個數、描述):

          0x00 STOP 0 0 停止執行

          0x01 ADD 2 1 加法運算

          0x02 MUL 2 1 乘法運算

          0x03 SUB 2 1 減法運算

          0x04 DIV 2 1 整數除法運算

          0x05 SDIV 2 1 有符號整數除法運算(截斷)

          0x06 MOD 2 1 取余運算

          0x07 SMOD 2 1 有符號模余運算

          0x08 ADDMOD 3 1 模加法運算

          0x09 MULMOD 3 1 模乘運算

          0x0a EXP 2 1 指數運算

          0x0b SIGNEXTEND 2 1 擴展二進制補碼有符號整數的長度

          比較和按位邏輯運算(依次為:操作碼、助記符、棧元素被移除個數、棧元素被放置個數、描述):

          0x10 LT 2 1 小于比較

          0x11 GT 2 1 大于比較

          0x12 SLT 2 1 有符號小于比較

          0x13 SGT 2 1 有符號大于比較

          0x14 EQ 2 1 相等比較

          0x15 ISZERO 1 1 簡單非操作符

          0x16 AND 2 1 按位與操作符

          0x17 OR 2 1 按位或操作符

          0x18 XOR 2 1 按位異或操作符

          0x19 NOT 1 1 按位非操作符

          0x1a BYTE 2 1 從一個字中獲取一個字節

          0x1b SHL 2 1 左移操作符

          0x1c SHR 2 1 邏輯右移操作符

          0x1d SAR 2 1 算數(有符號的)右移操作符

          SHA3 (依次為:操作碼、助記符、棧元素被移除個數、棧元素被放置個數、描述):

          0x20 SHA3 2 1 計算 Keccak-256 hash

          環境信息 (依次為:操作碼、助記符、棧元素被移除、棧元素被放置、描述):

          0x30 ADDRESS 0 1 獲取當前執行賬戶地址

          0x31 BALANCE 1 1 獲取給定賬戶余額

          0x32 ORIGIN 0 1 獲取執行源地址

          0x33 CALLER 0 1 獲取調用者地址

          0x34 CALLVALUE 0 1 通過負責本次執行的指令/交易獲得存入的價值

          0x35 CALLDATALOAD 1 1 獲取當前環境的輸入數據

          0x36 CALLDATASIZE 0 1 獲取當前環境下輸入數據的大小

          0x37 CALLDATACOPY 3 0 將當前環境中的輸入數據復制到內存中

          0x38 CODESIZE 0 1 獲取在當前環境中運行的代碼大小

          0x39 CODECOPY 3 0 拷貝當前環境運行的代碼到內存

          0x3a GASPRICE 0 1 獲取當前環境中的gas價格

          0x3b EXTCODESIZE 1 1 獲取帳戶代碼的大小

          0x3c EXTCODECOPY 4 0 將帳戶代碼復制到內存

          0x3d RETURNDATASIZE 0 1 從當前環境中獲取上一次調用的輸出數據大小

          0x3e RETURNDATACOPY 3 0 將上一次調用的輸出數據復制到內存

          0x3f EXTCODEHASH 1 1 獲取帳戶代碼的哈希值

          區塊信息 (依次為:操作碼、助記符、棧元素被移除個數、棧元素被放置個數、描述):

          0x40 BLOCKHASH 1 1 獲取 256 個最近完整塊之一的哈希值

          0x41 COINBASE 0 1 獲取區塊的受益人地址

          0x42 TIMESTAMP 0 1 獲取區塊的時間戳

          0x43 NUMBER 0 1 獲取塊的編號

          0x44 DIFFICULTY 0 1 獲取區塊的難度

          0x45 GASLIMIT 0 1 獲取區塊的 gas limit

          堆棧、內存、存儲和流操作 (依次為:操作碼、助記符、棧元素被移除個數、棧元素被放置個數、描述):

          0x50 POP 1 0 從堆棧中移除元素

          0x51 MLOAD 1 1 從內存中加載一個字

          0x52 MSTORE 2 0 保存字到內存中

          0x53 MSTORE8 2 0 將字節保存到內存

          0x54 SLOAD 1 1 從存儲中加載字

          0x55 SSTORE 2 0 保存字到存儲器

          0x56 JUMP 1 0 改變程序計數器

          0x57 JUMPI 2 0有條件地改變程序計數器

          0x58 PC 0 1 獲取與該指令對應的遞增之前的程序計數器的值

          0x59 MSIZE 0 1 獲取活動內存的大?。ㄒ宰止潪閱挝唬?/p>

          0x5a GAS 0 1 獲取可用gas的數量,包括本條指令花費對應的減少

          0x5b JUMPDEST 0 0 標記有效的跳轉目的地。此操作在執行期間對機器狀態沒有影響。

          Push 操作 (操作碼、助記符、棧元素被移除個數、棧元素被放置個數、描述):

          0x60 PUSH1 0 1 將 1 字節元素目放入堆棧

          0x61 PUSH2 0 1 將 2 字節的元素放入堆棧

          PUSH3, PUSH4, PUSH5…PUSH31 相應地將 3, 4, 5..31 字節元素目放入堆棧

          0x7f PUSH32 0 1 Place 32-byte (full word) item on stack

          Duplication Operations (操作碼、助記符、棧元素被移除個數、棧元素被放置個數、描述):

          0x80 DUP1 1 2 復制第一個堆棧元素

          DUP2, DUP3..DUP15 復制 2nd, 3rd..15th 相應堆棧元素

          0x8f DUP16 16 17 Duplicate 16th stack item

          交互操作 (操作碼、助記符、棧元素被移除個數、棧元素被放置個數、描述):

          0x90 SWAP1 2 2 交換第一和第二個棧元素

          0x91 SWAP2 3 3 交換第一和第三個棧元素

          SWAP3, SWAP4..SWAP15 交互 1st and 4th..15th 個相應棧元素

          0x9f SWAP16 17 17 Exchange 1st and 17th stack items

          日志操作 (操作碼、助記符、棧元素被移除個數、棧元素被放置個數、描述):

          0xa0 LOG0 2 0 附加沒有主題的日志記錄

          0xa1 LOG1 3 0 附加一個主題的日志記錄

          0xa2 LOG2 4 0 附加兩個主題的日志記錄

          0xa3 LOG3 5 0 附加三個主題的日志記錄

          0xa4 LOG4 6 0 附加四個主題的日志記錄

          系統操作 (操作碼、助記符、棧元素被移除個數、棧元素被放置個數、描述):

          0xf0 CREATE 3 1 使用關聯代碼創建一個新帳戶

          0xf1 CALL 7 1 對賬戶進行消息調用

          0xf2 CALLCODE 7 1 使用另一個可選賬戶的代碼對賬戶進行消息調用

          0xf3 RETURN 2 0 停止執行返回輸出數據

          0xf4 DELEGATECALL 6 1 使用另一個可選賬戶的代碼對賬戶進行消息調用, 但是會為發送者和值保持當前值

          0xf5 CREATE2 4 1 使用關聯代碼創建一個新帳戶

          0xfa STATICCALL 6 1 靜態地對賬戶進行消息調用

          0xfd REVERT 2 0 停止執行,回退狀態變化,但返回數據和保持gas不變

          0xfe INVALID ? ? 指定無效指令

          0xff SELFDESTRUCT 1 0 停止執行并注冊帳戶以供以后刪除

          不同指令的 Gas 成本根據它們在客戶端上的計算存儲負載而不同。例子是:

          STOP, INVALID and REVERT 是 0 gas

          大多數算術、邏輯和堆棧操作都是 3-5 gas

          CALL*, BALANCE and EXT* 是 2600 gas

          MLOAD/MSTORE/MSTORE8 是 3 gas

          SLOAD 是 2100 gas ,從0到非0設置存儲槽,SSTORE 指令花費20,000 gas,反過來則需要5,000 gas;

          CREATE 是 32000 gas ,SELFDESTRUCT 是 5000 gas

          交易會在不同的異常情況下回退,例如 gas 耗盡、指令無效等。在這種情況下,到目前為止所做的所有狀態更改都將被丟棄,帳戶的原始狀態將回退為該交易執行之前的狀態。

          To 地址是合約地址的交易在交易的data字段中包含合約的函數和所需的參數。他們是根據應用程序二進制接口 (ABI) 編碼的。

          合約應用程序二進制接口 (ABI): 是與以太坊生態系統中的合約進行交互的標準方式,無論是從區塊鏈外部還是用于合約到合約的交互。

          合約的接口函數是強類型的,在編譯時已知并且是靜態的。

          合約將在編譯時擁有它們調用的任何合約的接口定義。

          函數選擇器:函數調用的 Calldata 的前四個字節指定要調用的函數。

          它是函數簽名的 Keccak-256 哈希的前(左側,大端高階)四個字節。

          簽名被定義為沒有數據位置說明符的基本原型的規范表達式,即帶有參數類型括號列表的函數名稱。參數類型由單個逗號分隔,沒有空格。

          函數參數:編碼的參數從第五個字節開始,緊跟函數選擇器。

          區塊瀏覽器:是允許任何人查看區塊、交易、賬戶、合約交互等實時數據的門戶。一個流行的以太坊區塊瀏覽器是 etherscan.io[28].

          Mainnet:“Main Network”的縮寫,這是主要的公共以太坊區塊鏈。還有其他以太坊“測試網”,協議或智能合約開發人員可以在其中測試他們的協議升級或合約。主網使用真實的ETH,而測試網使用可以從水龍頭獲得的測試ETH。這里有流行的測試網[29]。

          以太坊改進提案 (EIP) 描述了以太坊平臺的標準,包括核心協議規范、客戶端 API 和合約標準。Standards Track EIP 分為多種類型:(參考這里[30])

          核心:需要共識分叉的改進以及不一定是共識關鍵但可能與“核心開發”討論相關的更改

          網絡:包括圍繞 devp2p 和 Light Ethereum Subprotocol 的改進,以及對 whisper 和 swarm 網絡協議規范的改進建議

          接口:包括圍繞客戶端 API/RPC 規范和標準的改進,以及某些語言級別的標準,如方法名稱和合同 ABI?!癷nterface”標簽與 interfaces repo 一致,在將 EIP 提交到 EIPs 存儲庫之前,討論應該主要發生在該存儲庫中

          ERC: 應用層標準和約定,包括代幣標準 (ERC-20)、名稱注冊、URI 方案、庫包格式和錢包格式等合約標準

          Meta: 描述圍繞以太坊的流程或提議對流程(或事件)進行更改

          信息性:描述以太坊設計問題,或向以太坊社區提供一般指南或信息,但不提出新功能

          TheMerge:是指以太坊合并升級,將使以太坊更具可擴展性、更安全和更可持續 (參考這里[31])

          不可變代碼:一旦部署了合約的代碼,它就變得不可變(下面提到的例外情況)。依賴于能夠修復錯誤并向已部署代碼添加新功能的標準軟件開發實踐不適用于此處。這對智能合約開發來說是一個重大的安全挑戰。有以下三種例外情況:

          修改后的合約可以部署在新地址(并復制舊狀態),但應通知所有交互實體能夠在新地址與更新后的合約進行交互。這通常被認為是不切實際的。

          修改后的合約可以部署為代理模式中的新實現,其中代理在更新后指向修改后的合約。這是更新添加功能最常用的方法。

          CREATE2 操作碼允許使用 init_code 在原地址更新

          Web3: 是一個無需許可、最小化信任和抗審查的網絡,用于傳輸價值和信息。

          實現 Web3 的流行方法是在計算、通信、存儲都是去中心化的網絡基礎上構建它。

          在以太坊生態系統中,這分別是以太坊區塊鏈、Waku(之前的 Whisper)和 Swarm 的組合。

          隱私和匿名是 Web3 的重要激勵因素。

          Web2 的大部分基礎安全設計原則和開發實踐仍然適用于 Web3。但 Web3 安全性確實是許多領域的范式轉變。

          語言:Web2 編程語言,如 JavaScript、Go、Rust 和 Nim,在 Web3 中被廣泛使用。但是智能合約的整個領域是全新的,并且特定于 Web3。Solidity 等語言是專門為 Web3 創建的。

          鏈上 vs 鏈下:智能合約是“鏈上”Web3 組件,它們與 Web2 軟件非常相似的“鏈下”組件交互。因此,Web3 和 Web2 在安全方面的主要差異主要歸結為智能合約安全性與 Web2 軟件的安全考慮。

          開源和透明:鑒于對信任最小化的強調,Web3 軟件,尤其是智能合約,期待默認情況下是開源的。

          部署的字節碼也應該經過源代碼驗證(在 Etherscan 等服務上)。隱匿專有代碼不是 Web3 精神的一部分。

          與智能合約的所有交互都作為交易記錄在區塊鏈上。這包括交易的發送者、數據和結果。對交易和狀態轉換的整個歷史具有完整的可見性,類似于從一開始就擁有一個可公開訪問的系統審計日志。

          此外,仍在“進行中”且尚未在區塊鏈上得到確認的交易在待處理交易隊列(即內存池)中也是公開可見的,并可能引發搶跑交易攻擊。

          不可停和不可變:Web3 應用程序,通常被稱為去中心化應用程序(DApps),預計將是不可暫停和不可變的,因為它們運行在去中心化的區塊鏈網絡上。

          不應該有任何一個實體可以單方面決定停止正在運行的 DApp 或對其進行更改。除非網絡大多數另有決定,否則區塊鏈上的交易和數據保證是不可變的。

          通常,(用戶)期望智能合約沒有部署者可控制的終止開關。它們也不能被任意升級。這兩者都源于 Web3 的信任最小化目標,即不需要信任潛在的惡意 DApp 開發人員。然而,這使得修復已部署代碼中的安全漏洞和響應漏洞利用變得非常具有挑戰性。

          假名團隊和 DAO:也許受比特幣中本聰的啟發,Web3 中的一些項目團隊有一種趨勢是使用假名,并且只知道他們的在線昵稱。

          考慮到該領域的監管不確定性,這樣做的一個原因可能是為了避免將來產生任何潛在的法律影響。這也使得與任何社會聲譽相關聯變得更加困難,因為它與產品或其開發背后的流程的感知安全可信度有關。這也使得追究任何人的法律社會責任或責任變得棘手。

          “相信軟件而不是濕件”(即人)是這里的口頭禪。雖然這可能是一個極端的觀點,但圍繞影響安全態勢的項目的推出和治理仍然存在社會過程。

          為了盡量減少少數特權人士在項目生命周期中的作用和影響, 由持有代幣的社區成員進行治理的趨勢越來越明顯 — 假名代幣持有區塊鏈地址的去中心化自治組織 (DAO) 對項目資金支出和協議變更做出基于投票的決策。雖然這減少了濕件(人為)故障的集中點,但它可能會減慢對安全關鍵方面的決策,甚至可能導致項目分叉。

          新架構、語言和工具鏈: 以太坊有一個新的虛擬機 (EVM) 架構,它是一個基于堆棧的機器,具有 256 位字和相關的gas語義。

          Solidity 語言在沒有太多真正競爭的情況下繼續主導智能合約。

          相關的工具鏈,包括開發環境(例如 Truffle、Brownie、Hardhat[32]、Foundry[33])、庫(例如 OpenZeppelin)、安全工具(例如 Slither、MythX、Securify)和 錢包(例如 Metamask)正在成熟,但仍在很大的成長空間。

          拜占庭威脅模型: Web3 威脅模型基于處理任意惡意行為的拜占庭故障,并受制于機制設計。

          鑒于缺乏值得信賴的中介機構, 默認情況下,每個人和所有事物都是不受信任的。該模型的參與者包括開發人員、礦工驗證者、基礎設施提供商和用戶,他們都可能成為潛在的對手。

          這是一個與 Web2 的威脅模型根本不同的威脅模型,在 Web2 中存在受信任的內部人員的一般概念,這些內部人員具有對資源資產的授權訪問權限,這些資源資產必須受到保護以免受不受信任的外部人員(和惡意內部人員)的侵害。Web3 是最終的零信任場景。

          密鑰和Token: 雖然“crypto”對于一些非技術觀察者來說對應著加密貨幣,但它實際上指的是密碼學,這是 Web3 的基本基石。盡管我們在 Web2 世界中不知不覺地使用了密碼學,但 Web3 正在將其推向大眾。加密密鑰是 Web3 世界的一級成員。

          不像 Web2 有可信中介的存在,他們可以通過其他方式重置密碼或從其中心化數據庫中恢復帳戶資產,Web3 在意識形態上將管理密鑰(及其控制的資產)的責任推給了終端錢包用戶。私鑰(或種子短語)的丟失是不可逆轉的,許多資產已因此類事件而丟失。

          針對金融資產的 Web2 安全漏洞(即不包括用于 DDoS 的勒索軟件和僵尸網絡)通常涉及竊取金融或個人數據,然后在暗網上出售這些數據并用于獲取金錢利益。由于(在中心化中介機構)實施了各種檢查和措施(包括技術和監管)以減少此類網絡安全事件并防止異常資產轉移,因此這變得越來越困難。當這種未經授權的資產轉移確實發生時,所涉及的中介機構甚至可能會合作扭轉此類交易并進行補償。

          Web3 中資產的概念非常不同。加密資產是無邊界的數字代幣,其會計分類賬由區塊鏈上的共識管理,所有權由對相應加密密鑰的訪問決定。如果有人可以訪問您控制加密資產的私鑰,他們可以將這些資產轉移到由他們的密鑰控制的區塊鏈地址。在一個完全去中心化的世界中,不應該存在可以扭轉這種損失的中介(例如中心化交易所) — 交易是不可變的,因此預防性安全措施在 Web3 空間中變得更加重要。

          設計的可組合性: 無需許可的創新和抗審查是 Web3 的核心目標。

          有許多關于 Web2 公司的故事,這些公司最初吸引開發人員在他們的平臺上進行構建,但后來當他們被視為競爭威脅時將他們拒之門外。

          Web3 應用程序,尤其是智能合約,在設計上是開放的,最終用戶和其他智能合約都可以在未經許可的情況下訪問。

          這種可組合性適用于可以疊加在其他應用程序之上的應用程序,例如樂高積木,如果一切順利并且新的樂高玩具可靠地構建在其他應用程序之上,那就太棒了。然而,這種不受約束的可組合性引入了意想不到的跨系統依賴性,可能會觸發跨組件的無效假設(考慮到不同約束由不同團隊構建)并暴露之前未考慮的攻擊面或模式。

          如果不深入了解所有交互組件、約束和配置,這使得描述 Web3 漏洞和運用場景變得非常具有挑戰性。

          壓縮時間尺度: Web3 領域的創新以驚人的速度發展。透明開發和設計可組合性方面是加速無許可和無邊界參與的強大催化劑,互聯網原生加密經濟代幣進一步激勵了這種參與——一場完美風暴。

          這將創新時間尺度縮短了幾個數量級,新的實驗浪潮在數周或數月內發生,而不是在 Web2 的圍墻花園內通常需要數年時間。似乎這里唯一的護城河是執行速度。

          這種壓縮的時間尺度對設計、開發和部署期間的安全考慮產生了切實的影響。若偷工減料,走捷徑,讓一個未經充分測試的系統上線,那它持有價值數百萬美元的代幣,可能非常容易受到攻擊。

          生產中測試:壓縮時間尺度、不受限制的可組合性的組合,拜占庭威脅模型和復制完整狀態的挑戰,以預測使用快速發展的實驗軟件工具構建的交互組件的故障模式,以多種方式迫使現實測試僅在生產環境中進行,即在“主網上”。這意味著復雜的技術和加密經濟漏洞可能只有在生產部署時才能被發現。

          審計作為銀彈(silver bullet): Web2 產品的安全軟件開發生命周期 (SSDLC) 流程已經發展了幾十年,預計它們將滿足內部驗證組合的一些最低要求,外部評估(例如產品流程審計、滲透測試)和認證取決于所管理資產的價值, 預期風險、威脅模型和產品的市場領域(例如,金融部門有更嚴格的合規要求)。

          Web3 項目似乎越來越依賴外部審計作為安全授權的標志。這通常是因為缺乏足夠的內部安全專業知識。雖然這種方法的似乎錯誤地說服了投機者,由于以下幾個原因,依賴外部審計是站不住腳的:

          目前的審計非常昂貴,因為對具有分析復雜項目的經驗和聲譽的頂級審計團隊的需求遠遠大于供應

          審計通常在項目開發結束時,即生產發布之前委托進行一次

          出于商業或協調上的原因,項目升級未經審計

         ?。▉碜皂椖繄F隊和用戶的)期望是審計是解決所有漏洞的靈丹妙藥,并且項目在短期審計(通常為幾周)后“沒有錯誤”

        免責聲明:中金網發布此信息目的在于傳播更多信息,與本網站立場無關。中金網不保證該信息的準確性、真實性、完整性、有效性等。相關信息并未經過本網站證實,不構成任何投資建議,據此操作,風險自擔。
        亚洲Av日韩AV欧美Av中文Av_免费看日本黄色大片_正常体位视频裸体视频_中国Av特黄精品
      1. <pre id="x08qo"></pre><object id="x08qo"></object><track id="x08qo"></track>

        1. <track id="x08qo"></track>
            <acronym id="x08qo"><strong id="x08qo"><address id="x08qo"></address></strong></acronym>