04.智能合约与以太坊虚拟机

时间:2024-03-18 16:01:07

本章介绍智能合约和以太坊虚拟机,掌握智能合约的作用和工作原理

4.1 智能合约

  • 现实生活中经常遇到这样的场景 买家与卖家要进行一笔交易,为了保证交易的顺利进行,双方签订了一份合约,合约中声明双方各自的身份、权利和义务(买家付钱、卖家交货的时间节点和方式等),一式两份,各自保存 这样,当交易出现纠纷时,合约将成为寻求法律援助的依据,而法律将成为确保合约执行的强制力保障

  • 虽然合约为交易的顺利进行提供了一些保障,但是也存在很多不足之处 一旦交易中发生了纠纷,比如卖家拖延发货或者买家拒绝付款,即使在法律的援助下解决了纠纷,交易的效率也会大大降低 甚至在一些情况下,合约将会失去约束效力,比如合约中存在歧义或者合约丢失等

  • 那么有没有一种更有效的方式来保证交易的进行呢?

  • 智能合约就可以充当这样一个代理人

  • 智能合约就是区块链上一个包含合约代码和存储 间的虚拟账户
    04.智能合约与以太坊虚拟机

  • 智能合约的行为由合约代码控制,而智能合约的账户存储则保存了合约的状态

  • 在以太坊平台上,智能合约的代码运行在以太坊虚拟机( VM )中, EVM 个图灵完备的虚拟机,是以太坊协议的核心

  • 在以太坊的点对点( 2P )网络中,每个全节点上都包含 个以太坊虚拟机,当节点需要打包或验证区块时,便将交易相关的可执行代码送入 EVM 中执行,执行的结果更新了以太坊账户的状态并被记录在区块链上

  • 以太坊网络中的每个节点都需要在各自的EVM中执行代码,这就导致两个问题。

    • 是这样会产生大量的平行化计算,每个节点都必须执行代码以验证区块中的结果状态,虽然牺牲了 定的计算效率,但保证了分布式网络中更高的安全性
    • 二是EVM 的执行结果必须有严格的确定性,所有节点必须得到同样的运行结果 这就对智能合约以及 EVM 造成定的局限性,智能合约目前仍无法实现 些可能会带来不确定结果的简单操作,如成随机数、调用操作系统 PI 等,因为这些操作会因时间、系统等执行环境的差异而产不同的结果,进而使以太坊节点无法对区块中的账户状态达成共识

02. 智能合约的操作

要创建一个智能合约,需要经过编写智能合约、编译成字节码 部署到区块链等过程,调用智能合约则是发起 笔指向智能合约地址的交易,智能合约代码分布式地运行在网络中每个节点的以太坊虚拟机中

04.智能合约与以太坊虚拟机

  1. 智能合约的编译过程,左边是使用Solidity语言编写的智能合约,右边是使用操作码表示的字节码
    04.智能合约与以太坊虚拟机
  2. 字节码由 连串的字节组成,每 字节表示一个操作 基于开发效率等多方面考虑,通常都不会直接书写以太坊虚拟机字节码,而是选择一门高级语言编写智能合约代码,再编译成以太坊字节码部署到区块链上
  3. 当编译完成得到 以太坊字节码之后,需要创建一个交易将合约部署到区块链上
  4. 交易的“ data ”字段保存的是以太坊字节码,“ 。”的地址为一个空的账户 当该交易被“矿工”打包加入区块链时,这个合约就创建完成了
  5. 区块链上将出现 个与该智能合约相对应的合约账户,井拥有一个特定的地址,而合约代码将保存在该合约账户中
  6. Solidity 还提供了 个集成开发环境( IDE )一-Remix
  7. 测试是非常重要的,将一个包含缺陷的智能合约部署到以太坊公有链上可能会造成灾难性后果
  8. 调用一个智能合约时,只需要发起一个指向合约地址的交易,并将合约需要的参数作为“ data ”字段保存在交易中即可
  9. 为了方便合约的调用和参数的传递,以太坊拥有一套交互的标准
  10. 使用 Solidity 语言编写的智能合约在编译时都会自动生成 ABI8 (程序进制接口) ABI 一个固定格式的字符串,包含了合约中各函数的函数名 、参数数目和类型、返回值数目 和类型等信息
  11. 作为服务提供者,合约创建者需要向用户提供合约的 ABI、和合约地址,这样用户才能使用合约定义的功能
  12. 有些合约的逻辑中还包含销毁功能,我们只需要像调用其他函数一样调用这个功能就可以销毁合约
  13. 当一个合约被销毁后,合约账户的存储和代码都将被清空,这里的清空是指从当前状态清空合约账户井产生新的状态,并没有对过往的区块数据造成任何改变,所以在过往的区块数据中仍然存在这部分数据的记录
  14. 在软件开发中有一个不得不提的过程,那就是软件升级,无论是进行 bug 修复,还是增加新的功能,都需要对软件进行升级
  15. 无法重新部署一个新的合约到相同的地址上,可以部署 个拥有调用转发功能的智能合约,将收到的调用转发到另外 个包含逻辑功能的合约地址 当进行合约升级时,只需要部署一个新的合约并修改转发的目标地址,以指向新的合约

03. 储存方式

以太坊虚拟机的存储方式分为三类:

  • 栈( Stack )
  • 账户存储(Storage )
  • 内存(Memory)
  1. 栈是一种常见的线性数据结构,支持两种操作:将一个元素放到钱的顶部和从拢的顶部取出 个元素,元素具有先进后出的性质 以太坊虚拟机是基于钱的虚拟机,这意味着虚拟机上的所有运算都运行在枝上 战中每一个元素的长度是 256 位( bit 棋是以太坊虚拟机的底层运行机制,当我们使用高级语言(比如 Solidity )编写智能合约代码时,并不需要直接对栈进行操作
  2. 账户存储是作为账户的一个属性保存在区块链上的,所以与硬盘一样都是持久化存储,并不会随着合约执行结束而被释放
  3. 内存是以太坊虚拟机在运行代码时临时分配的一块线性空间,会随着合约调用的结束自动释放

04. 指令集和消息调用

  • 以太坊虚拟机有 套专门设计的指令集,包括了大多数常用的算术运算 位运算辑运算和比较运算,同时还支持条件跳转和无条件跳转
  • 为了便于开发者编写功能更加丰富的智能合约,以太坊允许合约在执行过程中通过创条“消息”的方式来调用其他合约
    -代理调用该:它与消息调用的区别是它只从目标合约获取代码并执行,却不会改变当前的上下文环境,包括msg.sender msg.value 、当前账户、存储、内存等,这使得智能合约可以在运行时动态地从其他地址加载代码

05. 日志

  • 日志是以太坊虚拟机提供的一项功能。
  • 开发者可以在合约代码运行过程中记录各种事件产生的日志,这些日志可以帮助开发者调试代码,或者作为在区块链上发生交易的证据

在以太坊平台上,智能合约是保存在区块链上的逻辑代码,运行在以太坊虚拟机中。使用智能合约,用户可以在以太坊平台上面创建去中心化应用,Soidity是一门用于编写智能合约的高级语言,可以极大的提供智能合约的开发效率,通过一个简单的场景讲述了智能合约的原理以及优势,部分智能合约的底层工作机制,包括以太坊虚拟机,存储方式,指令集,和消息调用等内容, 编写一个合格的智能合约。