以太坊为例:什么是智能合约?智能合约怎么部署、调用、执行?智能合约的原理?智能合约存在哪儿?如何区分调用的是智能合约?世界状态数据库、EVM、智能合约它们之间的关系?
什么是智能合约
指的是“一套以数字形式指定的承诺,包括合约参与方可以在上面执行这些承诺的协议”。早在1994年,美国计算机科学家尼克·萨博(Nick Szabo)就提出了智能合约的概念。
智能合约是一种基于区块链技术的自动执行合约的计算机程序。它们是一组以代码形式编写的、在区块链上运行的规则和逻辑。智能合约定义了在满足特定条件时应该执行的操作,而无需中介方的干预。
以太坊是最为著名的支持智能合约的区块链平台之一。在以太坊中,智能合约是用一种称为Solidity的编程语言编写的。这些合约代码被部署到以太坊区块链上,并由全网节点验证执行。智能合约的执行结果和状态存储在区块链上,确保了透明性和不可篡改性。
智能合约可以执行各种任务,包括但不限于转移数字货币,管理数字身份,执行投票和投资等。由于其自动执行和透明的特性,智能合约在去除信任第三方的同时提供了更多的安全性。
智能合约怎么部署、执行
拿以太坊来说,可以在以太坊虚拟机EVM中部署和调用智能合约。
在以太坊上,合约的执行是通过向合约地址发送交易来触发的。合约地址是由合约创建者的地址和创建者账户的 nonce 生成的,所以在区块链上唯一标识一个合约。
执行合约的过程如下:
-
创建合约: 首先,有人(创建者)通过发送一个特殊的交易(称为合约创建交易)来部署合约。这个交易包含了合约的字节码(即合约的编译后的代码)以及其他必要的参数。在这个交易中,创建者将以太币(ETH)发送到合约地址,作为合约的初始资金。
-
合约创建交易: 这个合约创建交易被广播到整个以太坊网络,并被矿工包含在一个区块中。
-
区块链确认: 矿工通过执行交易中的合约字节码来创建新的区块。这就是合约在以太坊网络中的创建过程。
-
触发合约: 一旦合约被创建,任何人都可以通过向合约地址发送交易来调用合约。这个交易中包含了调用合约的数据,也就是要执行的合约函数及其参数。
-
合约执行: 当这个交易被矿工打包并写入区块链后,以太坊网络中的每个节点都会执行合约的字节码,模拟合约的执行过程。这确保了所有节点都达成相同的结果。
通过这种方式,合约的执行是通过向合约地址发送交易并将要执行的数据包含在交易中来触发的。以太坊网络的节点根据交易中的数据,按照合约的逻辑执行相应的操作。
智能合约的原理
在上面的图中展示了智能合约的结构,它一般具有“值”和“状态”两个属性,代码中用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 计算得到的,但账户的私钥并不直接存在。私钥用于签署交易和控制账户,而合约账户没有私钥,其执行是由交易触发的,依赖于合约代码的逻辑。
世界状态数据库
在以太坊中,世界状态数据库是一个持久性的、全局的状态存储系统,用于跟踪和管理整个以太坊区块链网络上的账户和合约的状态信息。它的作用主要包括:
-
存储账户信息: 世界状态数据库存储了每个账户的当前余额、合约代码、合约存储数据等信息。
-
提供全局状态: 通过记录每个账户的状态,世界状态数据库提供了全局的区块链状态,反映了每个账户的当前情况。
-
支持智能合约: 智能合约是以太坊上的自动执行代码,合约的状态和数据存储在世界状态数据库中。这使得合约可以随着交易和区块的执行而改变状态。
-
存储区块链历史: 世界状态数据库还存储了区块链的历史状态,每个区块都对应一个状态。这使得可以回溯查看历史状态,验证交易的有效性。
原理:
世界状态数据库的原理涉及默克尔树和数据结构的设计。每个区块包含一个状态根,这个状态根是默克尔树的根节点,包含了所有账户状态的哈希值。当一个新的区块生成时,世界状态数据库会更新,新的状态被计算并存储,形成新的状态树。这确保了数据的不可篡改性和完整性。
通过采用默克尔树结构,以太坊实现了高效的状态变化和验证机制。当需要验证一个账户的状态时,只需检查相应的默克尔证明即可,而不需要遍历整个数据库。这样的设计在保持全局一致性的同时,提高了性能和可扩展性。
在以太坊中,每个节点都有自己的本地世界状态数据库。这是因为以太坊是一个分布式的区块链网络,每个节点都需要独立地维护和更新自己的状态数据库。每个节点都通过区块链网络接收和验证交易,执行智能合约,然后更新本地的世界状态。
尽管每个节点都有自己的本地状态数据库,但由于区块链的共识机制,最终每个节点都应该达到相同的共识状态。这就是分布式共识的核心概念:尽管每个节点可能从不同的出发点开始,但通过共识算法,最终它们将达到相同的状态,即相同的世界状态。这确保了整个网络的一致性。
如何区分我调用的是智能合约?
以太坊中,交易中包含一个称为 to 的字段,该字段指定了交易的接收者地址。如果 to 字段为 null 或未设置,那么这笔交易将被认为是一个合约创建交易。
当你发送一个交易给一个合约地址时,以太坊网络通过这个地址找到相应的合约,并执行合约中与交易数据相对应的函数。这是通过交易中的输入数据(称为 input data)来实现的。
合约的地址是由合约的创建者和创建者账户的 nonce 生成的,所以在区块链上是唯一的。当你向一个合约地址发送交易时,以太坊网络知道这个地址是一个合约地址,因此会执行与交易数据相对应的合约代码。
简而言之,以太坊知道你调用的是一个合约而不是一个简单的交易,主要是通过交易中的 to 字段和交易的输入数据。如果 to 字段指定了一个合约地址,以太坊网络就会执行该合约中与输入数据相对应的函数。
世界状态数据库、EVM、智能合约的关系
在以太坊中,世界状态数据库(World State)、EVM(Ethereum Virtual Machine)和智能合约之间有密切的关系。以下是它们之间的关系:
-
EVM与智能合约:
- 执行环境: EVM是以太坊的运行时环境,负责执行智能合约的字节码。
- 智能合约代码: 智能合约是由开发者用 Solidity、Vyper 等语言编写的程序代码。这些代码被编译成EVM可执行的字节码。
-
EVM与世界状态数据库:
- 状态维护: EVM通过读取和更新世界状态数据库来维护智能合约的状态。
- 状态读写: 在执行智能合约时,EVM可以读取状态世界数据库中的当前状态,并根据智能合约的执行结果更新这些状态。
-
世界状态数据库与智能合约:
- 状态存储: 世界状态数据库是以太坊的全局数据库,存储了所有账户(包括用户账户和智能合约账户)的当前状态。
- 智能合约状态: 智能合约的状态,包括变量值等信息,被存储在世界状态数据库中。每个智能合约都有一个唯一的地址,对应世界状态数据库中的一个条目。
综合而言,智能合约通过EVM执行,并在执行过程中读写世界状态数据库。EVM作为虚拟机执行智能合约的字节码,而世界状态数据库则负责存储智能合约和账户的当前状态。这三者的协同工作构成了以太坊上智能合约的执行和状态管理机制。