以太坊虛擬機EVM介紹,智能合約詳解

以太坊為例:什么是智能合約?智能合約怎么部署、調用、執行?智能合約的原理?智能合約存在哪兒?如何區分調用的是智能合約?世界狀態數據庫、EVM、智能合約它們之間的關系?

什么是智能合約

指的是“一套以數字形式指定的承諾,包括合約參與方可以在上面執行這些承諾的協議”。早在1994年,美國計算機科學家尼克·薩博(Nick Szabo)就提出了智能合約的概念。

智能合約是一種基于區塊鏈技術的自動執行合約的計算機程序。它們是一組以代碼形式編寫的、在區塊鏈上運行的規則和邏輯。智能合約定義了在滿足特定條件時應該執行的操作,而無需中介方的干預。

以太坊是最為著名的支持智能合約的區塊鏈平臺之一。在以太坊中,智能合約是用一種稱為Solidity的編程語言編寫的。這些合約代碼被部署到以太坊區塊鏈上,并由全網節點驗證執行。智能合約的執行結果和狀態存儲在區塊鏈上,確保了透明性和不可篡改性。

智能合約可以執行各種任務,包括但不限于轉移數字貨幣,管理數字身份,執行投票和投資等。由于其自動執行和透明的特性,智能合約在去除信任第三方的同時提供了更多的安全性。

智能合約怎么部署、執行

拿以太坊來說,可以在以太坊虛擬機EVM中部署和調用智能合約。
在以太坊上,合約的執行是通過向合約地址發送交易來觸發的。合約地址是由合約創建者的地址和創建者賬戶的 nonce 生成的,所以在區塊鏈上唯一標識一個合約。

執行合約的過程如下:

  1. 創建合約: 首先,有人(創建者)通過發送一個特殊的交易(稱為合約創建交易)來部署合約。這個交易包含了合約的字節碼(即合約的編譯后的代碼)以及其他必要的參數。在這個交易中,創建者將以太幣(ETH)發送到合約地址,作為合約的初始資金。

  2. 合約創建交易: 這個合約創建交易被廣播到整個以太坊網絡,并被礦工包含在一個區塊中。

  3. 區塊鏈確認: 礦工通過執行交易中的合約字節碼來創建新的區塊。這就是合約在以太坊網絡中的創建過程。

  4. 觸發合約: 一旦合約被創建,任何人都可以通過向合約地址發送交易來調用合約。這個交易中包含了調用合約的數據,也就是要執行的合約函數及其參數。

  5. 合約執行: 當這個交易被礦工打包并寫入區塊鏈后,以太坊網絡中的每個節點都會執行合約的字節碼,模擬合約的執行過程。這確保了所有節點都達成相同的結果。

通過這種方式,合約的執行是通過向合約地址發送交易并將要執行的數據包含在交易中來觸發的。以太坊網絡的節點根據交易中的數據,按照合約的邏輯執行相應的操作。

智能合約的原理

智能合約與區塊鏈框架圖
在上面的圖中展示了智能合約的結構,它一般具有“值”和“狀態”兩個屬性,代碼中用If-Then和What-If語句預置了合約條款的相應觸發場景和響應規則。智能合約經多方共同協定、各自簽署后隨用戶發起的交易(transaction,Txn)提交,經P2P網絡傳播、礦工驗證后存儲在區塊鏈特定區塊中。用戶得到返回的合約地址及合約接口等信息后即可通過發起交易來調用合約。“礦工”受系統預設的激勵機制激勵,將貢獻自身算力來驗證交易。

“礦工”收到合約創建或調用交易后在本地沙箱執行環境(如以太坊虛擬機)中創建合約或執行合約代碼,合約代碼根據可信外部數據源[也稱為預言機(Oracle Machines)]和世界狀態的檢查信息自動判斷當前所處場景是否滿足合約觸發條件以嚴格執行響應規則并更新世界狀態。交易驗證有效后被打包進新的數據區塊。新區塊經共識算法認證后鏈接到區塊鏈主鏈,所有更新生效。

以太坊虛擬機EVM

EVM是一個計算引擎,有助于智能合約的部署和操作。沒有EVM,就不可能在以太坊協議上執行軟件程序。因此,EVM是以太坊核心架構的關鍵部分。

虛擬機

虛擬機是模擬物理計算機行為的程序。虛擬機有它的存儲和處理單元,在你的電腦上作為進程運行。這有點像一臺電腦在另一臺電腦上運行。

虛擬機類似于普通的Windows或MacOS軟件。這里的區別在于虛擬機被設計為執行更高級的功能。此外,與常規操作系統不同,虛擬機無法訪問計算機的其他部分,如存儲或帶寬。

如果你使用模擬器在PC上玩過Android游戲,那么虛擬機可能很熟悉。雖然模擬器和虛擬機有很大不同,但它們都接近硬件的能力,可以在“Sandbox(沙盒)”環境中執行代碼。

圖靈完備性

英國數學家艾倫·圖靈(Alan Turing)發明了第一臺圖靈機器,它是當今計算機的先驅。只要有足夠的時間和資源,圖靈整機可以處理任何計算,無論多么復雜。

現在,讓我們將這些想法結合起來,定義以太坊虛擬機:

以太坊虛擬機(EVM)是一個巨大的虛擬機,允許部署和執行代碼。您只需安裝必要的客戶端軟件即可訪問EVM,并使用它在以太坊上執行程序。本質上,EVM充當“世界計算機”,在分散的環境中執行軟件操作。

由于沒有集中控制,EVM由幾個個人/公司維持,這些個人/公司向系統提供計算能力,以換取獎勵。因此,它有助于創建任何一方都無法單方面關閉的抗審查應用程序。

EVM是圖靈完備的,因為它可以用于執行各種復雜度的計算。這就是以太坊與比特幣的區別,因為比特幣是圖靈不完整的,限制了其功能。

比特幣的主要功能是“分布式賬本”,它規定了價值轉移的規則。除了處理價值轉移,以太坊(通過EVM)還支持智能合約的部署。因此,以太坊被描述為“分布式狀態機”。

“State”(狀態)是指在任何時間點有關系統的信息。在以太坊中,狀態指的是特定時刻存在的地址、賬戶余額和智能合約代碼。每個事務都會導致以太坊的狀態發生變化(狀態轉換),這種變化會反映在整個網絡中。

智能合約存在哪兒

在以太坊中,合約的代碼并不一直存儲在以太坊虛擬機(EVM)中。相反,合約的代碼在合約被創建時被寫入區塊鏈,并存儲在區塊鏈的合約賬戶中。

當你部署一個合約時,一筆特殊的交易會被創建,其中包含合約的字節碼(即合約的二進制表示)。這筆交易會觸發區塊鏈上的一個區塊,其中包含了合約的創建,并在合約賬戶中存儲了合約的字節碼。

合約地址是通過合約創建者的地址和創建者賬戶的 nonce 計算得到的。這確保了合約地址在以太坊網絡中的唯一性。

當你向一個合約地址發送交易時,以太坊節點會檢查這個地址是否與合約地址匹配。如果匹配,以太坊節點將執行合約賬戶中存儲的合約代碼,并提供交易數據供合約執行。

合約賬戶

在以太坊中,合約賬戶的存儲方式與普通賬戶有所不同。合約賬戶并不像普通賬戶那樣關聯著私鑰和地址,而是關聯著合約代碼和存儲空間。

合約賬戶的存儲位置是以太坊的世界狀態數據庫中。以太坊使用類似數據庫的結構來存儲全網狀態,其中包括賬戶余額、合約代碼、合約存儲數據等。這個數據庫的每個狀態都對應一個區塊,因此以太坊的全網狀態會隨著每個區塊的產生而更新。

具體而言,合約賬戶的數據存儲在該賬戶的地址下。合約地址是由創建合約的交易的發送者地址和發送者賬戶的 nonce 值計算得到的。這個地址唯一地標識了一個合約賬戶,并在以太坊的世界狀態數據庫中存儲了該合約的代碼和數據。

需要注意的是,雖然合約賬戶的地址是由創建者和 nonce 計算得到的,但賬戶的私鑰并不直接存在。私鑰用于簽署交易和控制賬戶,而合約賬戶沒有私鑰,其執行是由交易觸發的,依賴于合約代碼的邏輯。

世界狀態數據庫

在以太坊中,世界狀態數據庫是一個持久性的、全局的狀態存儲系統,用于跟蹤和管理整個以太坊區塊鏈網絡上的賬戶和合約的狀態信息。它的作用主要包括:

  1. 存儲賬戶信息: 世界狀態數據庫存儲了每個賬戶的當前余額、合約代碼、合約存儲數據等信息。

  2. 提供全局狀態: 通過記錄每個賬戶的狀態,世界狀態數據庫提供了全局的區塊鏈狀態,反映了每個賬戶的當前情況。

  3. 支持智能合約: 智能合約是以太坊上的自動執行代碼,合約的狀態和數據存儲在世界狀態數據庫中。這使得合約可以隨著交易和區塊的執行而改變狀態。

  4. 存儲區塊鏈歷史: 世界狀態數據庫還存儲了區塊鏈的歷史狀態,每個區塊都對應一個狀態。這使得可以回溯查看歷史狀態,驗證交易的有效性。

原理:
世界狀態數據庫的原理涉及默克爾樹和數據結構的設計。每個區塊包含一個狀態根,這個狀態根是默克爾樹的根節點,包含了所有賬戶狀態的哈希值。當一個新的區塊生成時,世界狀態數據庫會更新,新的狀態被計算并存儲,形成新的狀態樹。這確保了數據的不可篡改性和完整性。

通過采用默克爾樹結構,以太坊實現了高效的狀態變化和驗證機制。當需要驗證一個賬戶的狀態時,只需檢查相應的默克爾證明即可,而不需要遍歷整個數據庫。這樣的設計在保持全局一致性的同時,提高了性能和可擴展性。

在以太坊中,每個節點都有自己的本地世界狀態數據庫。這是因為以太坊是一個分布式的區塊鏈網絡,每個節點都需要獨立地維護和更新自己的狀態數據庫。每個節點都通過區塊鏈網絡接收和驗證交易,執行智能合約,然后更新本地的世界狀態。

盡管每個節點都有自己的本地狀態數據庫,但由于區塊鏈的共識機制,最終每個節點都應該達到相同的共識狀態。這就是分布式共識的核心概念:盡管每個節點可能從不同的出發點開始,但通過共識算法,最終它們將達到相同的狀態,即相同的世界狀態。這確保了整個網絡的一致性。

如何區分我調用的是智能合約?

以太坊中,交易中包含一個稱為 to 的字段,該字段指定了交易的接收者地址。如果 to 字段為 null 或未設置,那么這筆交易將被認為是一個合約創建交易。

當你發送一個交易給一個合約地址時,以太坊網絡通過這個地址找到相應的合約,并執行合約中與交易數據相對應的函數。這是通過交易中的輸入數據(稱為 input data)來實現的。

合約的地址是由合約的創建者和創建者賬戶的 nonce 生成的,所以在區塊鏈上是唯一的。當你向一個合約地址發送交易時,以太坊網絡知道這個地址是一個合約地址,因此會執行與交易數據相對應的合約代碼。

簡而言之,以太坊知道你調用的是一個合約而不是一個簡單的交易,主要是通過交易中的 to 字段和交易的輸入數據。如果 to 字段指定了一個合約地址,以太坊網絡就會執行該合約中與輸入數據相對應的函數。

世界狀態數據庫、EVM、智能合約的關系

在以太坊中,世界狀態數據庫(World State)、EVM(Ethereum Virtual Machine)和智能合約之間有密切的關系。以下是它們之間的關系:

  1. EVM與智能合約:

    • 執行環境: EVM是以太坊的運行時環境,負責執行智能合約的字節碼。
    • 智能合約代碼: 智能合約是由開發者用 Solidity、Vyper 等語言編寫的程序代碼。這些代碼被編譯成EVM可執行的字節碼。
  2. EVM與世界狀態數據庫:

    • 狀態維護: EVM通過讀取和更新世界狀態數據庫來維護智能合約的狀態。
    • 狀態讀寫: 在執行智能合約時,EVM可以讀取狀態世界數據庫中的當前狀態,并根據智能合約的執行結果更新這些狀態。
  3. 世界狀態數據庫與智能合約:

    • 狀態存儲: 世界狀態數據庫是以太坊的全局數據庫,存儲了所有賬戶(包括用戶賬戶和智能合約賬戶)的當前狀態。
    • 智能合約狀態: 智能合約的狀態,包括變量值等信息,被存儲在世界狀態數據庫中。每個智能合約都有一個唯一的地址,對應世界狀態數據庫中的一個條目。

綜合而言,智能合約通過EVM執行,并在執行過程中讀寫世界狀態數據庫。EVM作為虛擬機執行智能合約的字節碼,而世界狀態數據庫則負責存儲智能合約和賬戶的當前狀態。這三者的協同工作構成了以太坊上智能合約的執行和狀態管理機制。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/212657.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/212657.shtml
英文地址,請注明出處:http://en.pswp.cn/news/212657.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Hive】啟動beeline連接hive報錯解決

1、解決報錯2、在datagrip上連接hive 1、解決報錯 剛開始一直報錯&#xff1a;啟動不起來 hive-site.xml需要配置hiveserver2相關的 在hive-site.xml文件中添加如下配置信息 <!-- 指定hiveserver2連接的host --> <property><name>hive.server2.thrift.bin…

機器人與3D視覺 Robotics Toolbox Python 二 空間位姿描述

空間位姿描述 二維空間位姿描述 二維空間位姿表示方法 from spatialmath.base import * from spatialmath import * T1 SE2(x3,y3,theta30,unit"deg") trplot2(T1.A,frame"T1",dims[0, 5, 0, 5]) T2transl2(3, 4) trplot2(T2,frame"T2",dims…

如何理解 RPC 遠程服務調用?

本文主要講解 RPC 遠程服務調用相關的知識。 RPC 遠程服務調用是分布式服務架構的基礎&#xff0c;無論微服務設計上層如何發展&#xff0c;討論服務治理都繞不開遠程服務調用&#xff0c;那么如何理解 RPC、有哪些常見的 RPC 框架、實現一款 RPC 框架需要哪些技術呢&#xff…

解決electron修改主進程后需要重啟才生效

nodemon 是一種工具&#xff0c;可在檢測到目錄中的文件更改時通過自動重新啟動節點應用程序來幫助開發基于 node.js 的應用程序 nodemon 特性 自動重新啟動應用程序。檢測要監視的默認文件擴展名。默認支持 node&#xff0c;但易于運行任何可執行文件&#xff0c;如 python、…

自動駕駛學習筆記(十七)——視覺感知

#Apollo開發者# 學習課程的傳送門如下&#xff0c;當您也準備學習自動駕駛時&#xff0c;可以和我一同前往&#xff1a; 《自動駕駛新人之旅》免費課程—> 傳送門 《Apollo 社區開發者圓桌會》免費報名—>傳送門 文章目錄 前言 分類 目標檢測 語義分割 實例分割 …

SQL語句的執行順序怎么理解?

SQL語句的執行順序怎么理解&#xff1f; 我們常常會被SQL其書寫順序和執行順序之間的差異所迷惑。理解這兩者的區別&#xff0c;對于編寫高效、可靠的SQL代碼至關重要。今天&#xff0c;讓我們用一些生動的例子和場景來深入探討SQL的執行順序。 一、書寫順序 VS 執行順序 SQ…

【unity實戰】一個通用的FPS槍支不同武器射擊控制腳本

文章目錄 前言模型素材文章用到的粒子火光特效射擊效果換彈瞄準開槍抖動效果設置顯示文本最終代碼不同武器射擊效果1. 手槍2. 機槍3. 狙擊槍4. 霰彈槍5. 加特林 其他感謝完結 前言 實現FPS槍支不同武器效果&#xff0c;比如手槍&#xff0c;噴子&#xff0c;狙擊槍&#xff0c…

《使用ThinkPHP6開發項目》 - 創建應用

《使用ThinkPHP6開發項目》 - 安裝ThinkPHP框架-CSDN博客 《使用ThinkPHP6開發項目》 - 設置項目環境變量-CSDN博客 《使用ThinkPHP6開發項目》 - 項目使用多應用開發-CSDN博客 根據前面的步驟&#xff0c;我們現在就可以開發我們的項目開發了&#xff0c;根據項目開發的需要…

【數據挖掘】國科大蘇桂平老師數據庫新技術課程作業 —— 第四次作業

云數據庫研究 云計算與云數據庫背景 云計算&#xff08;cloud computing&#xff09;是 IT 技術發展的最新趨勢&#xff0c;正受到業界和學術界的廣泛關注。云計算是在分布式處理、并行處理和網格計算等技術的基礎上發展起來的&#xff0c;是一種新興的共享基礎架構的方法。它…

Django多對多ManyToManyField字段

Django是一個支持多對多關系的Web框架&#xff0c;可以在模型中定義多對多關系。多對多關系通常涉及兩個實體之間的復雜交互&#xff0c;例如用戶和組之間的關系&#xff0c;或者課程和學生之間的關系。在Django中&#xff0c;可以使用ManyToManyField字段來定義多對多關系。 …

[足式機器人]Part4 南科大高等機器人控制課 Ch05 Instantaneous Velocity of Moving Frames

本文僅供學習使用 本文參考&#xff1a; B站&#xff1a;CLEAR_LAB 筆者帶更新-運動學 課程主講教師&#xff1a; Prof. Wei Zhang 南科大高等機器人控制課 Ch05 Instantaneous Velocity of Moving Frames 1.Instantanenous Velocity of Rotating Frames2.Instantanenous Veloc…

機器學習基礎入門

機器學習 引言 介紹機器學習的重要性和應用領域。簡要說明機器學習與人工智能的關系。 在當今迅速發展的技術世界中&#xff0c;機器學習已經成為一項不可或缺的技術&#xff0c;它正在改變我們解決問題和理解世界的方式。機器學習&#xff0c;作為人工智能&#xff08;AI&a…

最新Redis7持久化(權威出版)

首先我們要知道什么是持久化&#xff1a;持久化是指將數據保存到磁盤上&#xff0c;以確保在Redis服務器重啟時數據不會丟失。 Redis支持兩種主要的持久化方式&#xff1a;RDB持久化和AOF持久化 下面讓我依次給你介紹一下&#xff1a; RDB持久化 作用 這是將Redis數據保存…

Java8新特性 - Stream

一、特性 Java 8引入的Stream API為集合&#xff08;Collections&#xff09;提供了一種聲明式的處理方式&#xff0c;支持豐富的操作&#xff0c;包括篩選、映射、歸約等。以下是一些Stream的主要功能和使用方式的案例&#xff1a; 創建Stream&#xff1a; List<String&…

Java語言概述及保姆級入門教程(JDK 17版本)

筆記來自尚硅谷老師-康老師 學習教程&#xff1a;https://www.bilibili.com/video/BV1PY411e7J6/?spm_id_from333.337.search-card.all.click 1、Java基礎全程脈絡圖 1.1 本章專題與脈絡 2. 抽絲剝繭話Java 2.1 當前大學生就業形勢 麥可思研究院發布了《2022年中國大學生就業…

TCP 和UDP 到底有啥區別

TCP&#xff08;傳輸控制協議&#xff09;和UDP&#xff08;用戶數據報協議&#xff09;是互聯網上常用的兩種傳輸層協議&#xff0c;它們在數據傳輸方式和特性上有顯著的區別。下面是TCP和UDP的主要區別&#xff1a; 連接性: TCP 是一種面向連接的協議。在數據傳輸前&#xf…

C#圖像處理OpenCV開發指南(CVStar,09)——邊緣識別之Scharr算法的實例代碼

1 邊緣識別之Scharr算法 算法文章很多&#xff0c;不再論述。 1.1 函數原型 void Cv2.Scharr(src,dst,ddepth,dx,dy,scale,delta,borderType&#xff09; 1.2 參數說明 src 代表原始圖像。dst 代表目標圖像。ddepth 代表輸出圖像的深度。CV_16Sdx 代表x方向上的求導階數…

uniApp應用軟件在運行時,不符合華為應用市場審核標準。解決方案合集!

&#xff08;暫時用不到的也建議收藏一下&#xff0c;因為文章持續更新中&#xff09; 最新更改時間&#xff1a;20023-12-10 第一次做App應用開發相信大家一定都遇到過華為應用市場審核的“駁回”&#xff01; 有些問題一看就明白可以立馬修改&#xff0c;而有一些問題修改意…

Dubbo入門直接上手,結合微服務詳解

Dubbo 高性能、輕量級的 Java RPC 框架 RPC&#xff1a; Remote Procedure Call 遠程過程調用&#xff0c;簡單來說就是它允許一個計算機程序通過網絡請求調用另一個計算機上的程序&#xff0c;就像本地調用一樣。有非常多的協議和技術來都實現了RPC的過程&#xff0c;比如&a…

Elasticsearch 8.9 refresh刷Es緩沖區的數據到Lucene,更新segemnt,使數據可見

一、相關API的handler1、接受HTTP請求的hander(RestRefreshAction)2、往數據節點發送刷新請求的action(TransportRefreshAction)3、數據節點接收主節點refresh傳輸的action(TransportShardRefreshAction) 二、在IndexShard執行refresh操作1、根據入參決定是使用lucene提供的阻塞…