Development of blockchain programmability | Cardano Explorer (cexplorer.io)
第一代区块链基本上只是一个交易网络,类似于PayPal。 价值只能无条件地从 Alice 转移到 Bob。 比特币最常用于简单的价值转移。 但是,有可能编写脚本。 卡尔达诺和以太坊是智能合约平台,因此可以在它们上创建替代银行服务。 平台允许开发人员实现更复杂的程序并处理应用程序的状态。 在本文中,我们将描述比特币、以太坊和卡尔达诺的可编程性可能性。 我们还将很快研究以太坊智能合约和 Plutus 脚本之间的一些差异。
第一代区块链的能力
我们可以将比特币纳入第一代区块链。 比特币提出了数字稀缺的概念。 一般来说,区块链可以创建不可变的固定货币政策,或者只能在大多数人同意的情况下才能改变。 可能存在系统内无法复制的数字货币(也称为原生货币)。
原生代币被用作网络激励模型的一部分(对那些去中心化和保护网络安全的人的奖励),但这与本文无关。
硬币的存在依赖于分布式网络和去中心化。
区块链网络可以确保两个参与者之间代币的安全转移,例如从爱丽丝到鲍勃,因为它确保相同的代币不会连续使用两次(防止代币的双花)。 这保留了数字稀缺性。 此外,它确保只有真正的所有者而没有其他人可以花费硬币。 在区块链网络中,不可能进行欺骗、冻结账户、阻止某人使用网络或花费硬币等。
货币政策、数字稀缺性、公平、平等和货币转移由网络共识的所有参与者监督。
简单来说,第一代区块链仅具备这些基本功能。 制定固定货币政策并在两个参与者之间无条件转移数字价值。
价值的转移是无条件的。 区块链网络只能验证Alice是币的真正所有者,并且她是指示通过交易将价值转移到Bob地址的人。 如果交易验证成功,一旦交易包含在新区块中并且该区块最终确定,Bob 就成为价值(硬币)的新所有者。
在下图中,您可以看到比特币节点如何验证公共交易。 Alice 将 BTC 发送给 Bob。 交易验证的源代码在比特币客户端中定义。 除此之外,节点还验证交易是否具有有效的数字签名来证明输入中 BTC 的所有权,以及交易是否花费了另一笔交易和其他共识规则已经花费的任何 BTC。
常规交易的验证不依赖于第三方程序。 所有逻辑都在比特币客户端中实现。 如果需要做一些超出正常验证的更复杂的事情,例如数字签名,则需要由第三方对逻辑进行编程,并通过协议来实现程序的执行。
出现一个问题。 有条件地发送交易有意义吗? 铸造与原生货币具有相同或相似属性的新代币(即不可改变的货币政策)是否有意义? 或者货币政策的改变(销毁和重新铸造代币)是否有益? 这需要定义规则并以分散的方式对其进行验证。
比特币脚本允许执行更复杂的逻辑。 可以创建多重签名交易、时间锁定交易(只能在特定日期或区块高度之后花费价值)或哈希锁定交易(只能通过揭示与给定哈希匹配的秘密来花费价值) 。
脚本允许用户将价值转移到状态通道(闪电网络)或定义花费该价值的条件,以便交易必须由定义数量的参与者(例如,三分之二)签署。
比特币可以定义花费比特币的条件。
比特币脚本是一种简单的、基于堆栈的、非图灵完备的语言,旨在安全、确定性且易于验证。 这对于开发人员来说有几个主要限制。
比特币脚本具有一组有限的操作码和数据类型,这限制了脚本的功能和效率。 它不支持循环、递归或有状态计算,这使得无法实现某些算法或协议。 此外,它无法访问任何外部数据或事件,这限制了脚本的交互性和适应性。 比特币脚本没有正式的语义或类型系统,这使得很难推断脚本的正确性和安全性。
比特币网络中的大多数交易都是标准的。 2021 年,非标准(脚本)交易数量上升至 10-18%(分析各不相同)。
需要重申的是,比特币的源代码负责在正常交易中转移价值。 任何第三方都不能干预正常交易的处理,因为一切都在分布式网络中的节点的控制之下(更准确地说,在矿池的控制之下)。
脚本始终由第三方定义,不是比特币源代码的一部分。 比特币能够通过解释器处理脚本(稍后会详细介绍)。 脚本会带来一定的风险,因为脚本的逻辑可能存在错误。
在文章的图像中,脚本将显示为红色。 解释器和虚拟机将显示为蓝色。
任何创建交易的人都可以使用比特币脚本来指定交易中的 BTC 将来如何使用。 比特币脚本的部署方式是将它们包含在交易的输入和输出中。 输入包含从先前交易中解锁 BTC 的脚本,输出包含为未来交易锁定 BTC 的脚本。
比特币脚本由比特币节点处理,比特币节点验证交易。 当节点收到交易时,它会检查输入和输出中的脚本是否有效并遵循共识规则。 该节点使用基于堆栈的解释器执行脚本。
基于堆栈的解释器是一个可以执行另一个用特殊语言编写的程序的程序(在比特币的情况下,它被称为脚本)。 解释器嵌入在比特币节点中。 解释器的工作原理是一一(从左到右)读取比特币脚本的指令并执行相应的操作。 节点评估脚本,如果最终结果为真,则交易被接受。 如果最终结果为假,或者出现错误或异常,则交易将被拒绝。
解释器位于每个比特币节点上。 如果需要执行脚本作为验证的一部分,它就会发生。 请注意,交易验证以分散的方式进行。
在下图中,您可以看到比特币节点如何验证脚本交易。 该交易包含一个脚本(红色),其中包含花费该值的逻辑。 这是第三方提供的逻辑。 脚本解释器(蓝色)用于脚本验证。 脚本评估的输出确定该值是否将被花费(即该值的所有权是否将传递给 Bob)。
以太坊是第一个图灵完备的区块链平台
以太坊是第一个支持图灵完备的通用编程语言(称为 Solidity)的去中心化平台。 Solidity 可用于为任何类型的逻辑或功能编写智能合约。 智能合约是在以太坊区块链上运行的自动执行程序,可以与其他智能合约、用户或外部数据源交互。
以太坊的特点之一是它允许用户通过智能合约创建自定义代币。 代币是可以代表任何有价值的东西的数字资产,例如货币、收藏品或权利。 第一代区块链只有原生币。 协议和脚本都不允许创建和传输自定义令牌。
以太坊使得编写可以与本地货币和一系列其他代币一起使用的复杂应用程序成为可能。 感谢以太坊,DeFi 行业诞生了。
以太坊EVM即以太坊虚拟机,是以太坊网络上智能合约的运行环境。 EVM 是一种基于堆栈、图灵完备、隔离的虚拟机,可以执行由高级编程语言(例如 Solidity)生成的字节码指令。 EVM 可以访问和操作存储在区块链上的数据,例如账户余额、合约状态或交易输入和输出。 EVM 还强制执行共识规则和网络的 Gas 系统,这限制了智能合约使用的计算和存储资源。
比特币和以太坊在复杂操作方面的区别之一是,以太坊交易不包含具有支出逻辑的智能合约,而只是对智能合约的引用。
智能合约存储在以太坊区块链上。 通过发送包含智能合约的字节码和构造函数参数的特殊类型的交易,将智能合约部署到区块链。 该交易将在网络上创建一个代表智能合约的新地址。 智能合约的字节码和状态存储在该地址下的区块链中。
要调用智能合约,用户可以发送另一个类型引用智能合约地址并提供一些参数的交易,例如价值、gas 限制、gas 价格、数据或函数调用。 该交易将触发网络上的节点使用以太坊虚拟机(EVM)执行智能合约代码。
比特币脚本是无状态的,而以太坊智能合约可以在账本中保留状态。 这意味着比特币脚本没有任何记忆或存储之前的交易或事件,只能对当前交易提供的数据进行操作。 另一方面,以太坊智能合约可以具有存储在区块链上的持久状态,并且可以通过智能合约代码进行更新或访问。
比特币脚本的无状态性是一种设计选择,旨在确保比特币网络的安全性、确定性和简单性。 由于没有状态,比特币脚本避免了恶意行为者或网络故障可能引起的状态损坏、不一致或操纵问题。
以太坊智能合约的状态性是一种设计选择,旨在增强以太坊网络的表现力、功能性和交互性。 通过拥有状态,以太坊智能合约可以实现复杂且动态的交易逻辑和功能,例如创建代币、执行计算或与其他智能合约交互。 以太坊智能合约还允许更多的交互性和适应性,因为它们可以使用预言机和触发器来访问链下信息并对其做出反应,例如价格源、时间戳或用户输入。
在下图中,您可以看到一个以太坊交易,其中爱丽丝向鲍勃发送价值(代币)。 由于这些是自定义代币,因此必须使用智能合约。 Alice 将对智能合约的引用插入到交易中。 以太坊虚拟机在区块链中找到智能合约(包括其当前状态)并执行所需的操作。
让我们看看 Solidy 和 EVM 与比特币脚本和基于堆栈的解释器之间的一些差异。
Solidity 提供了更高的表现力。 Solidity 是一种高级、面向对象、图灵完备的编程语言,可以为智能合约实现复杂而灵活的逻辑和功能。
Solidity 代码被编译为由 EVM 执行的字节码指令。 比特币脚本代码直接嵌入交易的输入和输出中,并由网络上的节点解释。
Solidity 代码可以使用各种机制(例如函数调用、事件或修饰符)访问外部数据或事件(例如预言机、触发器或用户输入)并对其做出反应。 与周围世界的高度互动使得复制传统银行服务成为可能。 Bitcoin Script代码无法访问或响应任何外部数据或事件,只能对交易本身提供的数据进行操作。
Solidity 和 EVM 可以提供比比特币脚本更多的表现力和优雅性,因为它们可以使用各种功能,例如循环、递归、状态计算、高阶函数或惰性求值。 以太坊可以提供比比特币脚本更高的安全性和可靠性,因为智能合约可以使用形式化验证和测试来确保智能合约的正确性和安全性(有各种工具和框架可用)。
与比特币脚本相比,更强的表达性和状态性可能需要更多的技能和细心来编写和执行智能合约,因为它们可能涉及更多的复杂性和潜在的陷阱。
智能合约的执行可能会比运行智能合约的比特币脚本产生更多的成本,因为它们可能会消耗更多的天然气费用于网络上的计算和存储资源。 与比特币脚本的处理相比,以太坊可能面临更多的可扩展性问题,因为智能合约的执行可能会由于对资源的更高需求而产生更多的网络拥塞和延迟。
大多数以太坊交易都与智能合约的执行有关。 DeFi、NFT 和稳定币是相关的区块链行业,它们开辟了新的可能性。 以太坊在活跃用户和交易数量上已经超越了比特币。
卡尔达诺有原生脚本和普利拓斯脚本
卡尔达诺是一个类似于以太坊的智能合约平台,但有很多不同之处。 卡尔达诺上的脚本可以通过两种方式完成:本机脚本和 Plutus 脚本。
原生脚本是简单的脚本,可用于锁定资金、铸造代币或委托 ADA 币。 它们以类似 JSON 的格式编写,可以直接由卡尔达诺账本规则解释。 因此,本机脚本不需要任何特殊工具或虚拟机来验证它们。
本机脚本是实现多重签名交易的一种方法。 它们用于委托证书。 委托证书是一种交易类型,允许利益相关者将其 ADA 币委托给权益池。
在下图中您可以使用本机脚本查看交易。 请注意,卡尔达诺节点不需要任何虚拟机或解释器来执行脚本(与比特币和以太坊不同)。 它们是本地执行的。 Alice 可以发送带有委托证书的交易,其中她将 ADA 委托给 Bob 的池。 或者,它可能是包含铸币脚本的交易。 代币将被铸造到鲍勃的地址(代币发行者)。
有两种方法可以在事务中包含本机脚本:
首先,将脚本作为 Datum 嵌入交易中。 这意味着该脚本是交易数据的一部分,任何检查交易的人都可以看到。 此方法适用于短小简单或需要经常更改的脚本。
其次,通过交易将脚本存储在区块链上,并通过其哈希值引用它。 该脚本作为输出存储在区块链上,并且可以通过其唯一的哈希值来识别。 输出必须具有从脚本哈希派生的地址,并且值必须至少为 1 ADA,以确保它不会被网络修剪。 此方法适用于较长且复杂的脚本,或者需要固定且不可变的脚本。
可以连续多次引用存储在区块链上的本机脚本。 只要脚本输出没有被另一个交易花费,它就可以用作使用同一脚本的多个交易的输入。
在下图中,您可以看到与上面类似的情况,不同之处在于交易通过哈希引用存储在区块链中的本机脚本。
原生脚本主要是链上逻辑,因为它们嵌入在交易中或存储在区块链上。 然而,它们也可以有一些链下逻辑,例如生成使用本机脚本作为输入或输出的交易。 例如,您可以使用 JavaScript、Python 或 Java 创建使用本机脚本生成事务的应用程序。
现在让我们仔细看看 Plutus 脚本。
Plutus 脚本是更复杂、更具表现力的脚本,可以实现任意逻辑并与其他智能合约交互。 它们是用 Plutus(类似 Haskell 的语言)(一种函数式编程语言)编写的,并编译成 Plutus Core(一种在 Cardano 虚拟机(CVM)上运行的低级语言)。
卡尔达诺脚本的关键特征之一是链上代码和链外代码(程序逻辑)的分离。
链上逻辑是在区块链上运行并验证涉及智能合约的交易的逻辑。 链上逻辑在 Plutus Core 中编写并由 Cardano 虚拟机执行。 链上逻辑是不可变且透明的,这意味着一旦部署在区块链上就无法更改或隐藏。
链下逻辑是在区块链外部运行并处理智能合约应用程序的需求和交互的逻辑。 链下逻辑是用 Haskell 编写的,Haskell 是一种高级语言,可以使用 Plutus 应用程序框架(PAF)来访问节点、钱包、预言机等服务。但是,也可以使用其他高级编程语言( JavaScript、Python 或 Java)。
链下逻辑是可变的和私有的,这意味着它可以更新或修改,而不会影响链上逻辑或需要硬分叉。
Plutus 脚本是使用链上和链下逻辑的智能合约。 Plutus 脚本的链上部分称为验证器脚本,它决定花费输出的交易是否被授权这样做。 顾名思义,链上代码由卡尔达诺网络中的所有节点进行验证。 Plutus 脚本的链下部分称为 Plutus 应用程序后端(PAB),它生成符合验证器脚本规则的交易。
出于多种原因,链上代码和链下代码的分离很有用。 首先,它允许开发人员使用 Haskell、Java、Python JavaScript 等高级语言编写智能合约,这些语言比 Plutus Core 或 Solidity 等低级语言更易于阅读、编写和测试。 其次,它减少了运行智能合约的交易的规模和成本,因为交易中仅包含必要的链上代码。 第三,它提高了智能合约的安全性和可扩展性,因为可以更新和修改链下代码,而不会影响链上代码或需要硬分叉。
链上代码和链下代码的分离有利于创建灵活且健壮的智能合约应用程序。 通过使用 Plutus 应用程序框架 (PAF) 和 Plutus 应用程序后端 (PAB) 等工具,开发人员可以在本地或实时生产环境中轻松创建和部署智能合约应用程序。
Plutus 脚本可以作为输入或输出作为交易的一部分,具体取决于它们的使用方式。 Plutus 脚本主要有两种类型: 验证器脚本和铸币政策(铸币脚本)。
验证器脚本用于将资金锁定在脚本地址中并验证这些资金的支出。 验证器的输出是一个布尔值(True 表示该值可以解锁/使用)。 验证器无法执行诸如调用另一个脚本或向某处发送一些令牌之类的操作。 验证者仅批准或拒绝脚本地址处的资金解锁。
验证器脚本可以作为数据嵌入到交易中,也可以存储在区块链上并由其哈希引用。 它与本机脚本类似。 将脚本存储在区块链上的优点是可以减少交易规模和费用,但也使脚本公开且不可变。
铸造策略用于控制自定义代币的创建和销毁。 铸币政策只能存储在区块链上并通过其哈希值引用。 这确保了相同类型的所有代币的铸造政策是唯一且一致的。
脚本的哈希值是脚本铸造的本机令牌的策略 ID。 当您拥有具有特定策略 ID 的令牌时,您可以确保令牌已由与策略 ID 对应的脚本(铸造策略)铸造。
验证器脚本具有更大的灵活性,而铸造策略则具有更高的一致性。
当要执行验证器脚本时,将传递这三项信息作为参数:
数据:它是附加到脚本锁定的 UTxO 的一段数据。 这通常用于携带状态(应用程序状态)。
救赎者:它是附加在支出输入上的一段数据。 这通常用于从支出者向脚本提供输入(可以通过脚本解锁资金的输入数据)。
上下文:它是代表支出交易信息的一段数据。 这用于对输出的发送方式做出断言。
数据是可选数据。 数据始终与 UTXO 一起存储。 一个地址可以有多个UTXO,因此也可以有多个Datum。 该地址处的所有数据都是相等的。 没有特定的数据作为脚本的全局状态。 该地址上的所有 UTXO 都是独立的,它们的解锁由脚本单独验证。
在下图中,您可以看到卡尔达诺智能合约由链下逻辑(后端)和链上逻辑组成。 一个应用程序可以使用链下逻辑通过脚本创建交易,并使用相同的后端来创建支出交易。 Bob 使用脚本创建了交易。 它包含 Plutus 脚本(验证器)以及通过验证器(脚本)锁定的 UTxO。 UTxO 可以包含 Datum,这是可用于存储合约状态的数据。 Alice 想要解锁 UTxO。 为了花费 UTxO,必须在智能合约的链下部分创建可以包含救赎者的支出交易。 Redeemer是Plutus脚本的输入,决定支出交易是否有效。
后端定义的应用程序逻辑允许 Bob 锁定该值,Alice 解锁该值。 第一个交易将资金锁定在脚本地址,第二个交易触发脚本的执行以解锁资金。
请注意,在脚本事务(Bob 的事务)的情况下,后端左侧的箭头直接指向图像右侧部分的事务。 这意味着交易结算时不会执行 Plutus 脚本。 验证器脚本将资金锁定在脚本地址,并由支出交易(Alice 的交易)触发执行。 这就是为什么箭头从支出交易引向卡尔达诺虚拟机。
链下逻辑可以生成脚本交易,将资金锁定在脚本地址中,并需要特定的 Redeemer 值来解锁它们。 例如,Bob 可以使用链外逻辑创建一个脚本交易,在脚本地址中锁定 10 个 ADA,并需要 Redeemer 值“Hello”来解锁它们。 然后,Bob 可以将脚本地址和 Redeemer 值发送给 Alice,Alice 可以使用链外逻辑创建支出交易,提供正确的 Redeemer 值并从脚本地址花费 10 ADA。
链下逻辑可以使用 Plutus 应用程序后端 (PAB) 来管理和处理应用程序实例整个生命周期的需求。 PAB 充当 Plutus 应用程序、节点、钱包后端和最终用户之间的中介。 PAB 还帮助构建在区块链上运行 Plutus 脚本的交易。
Plutus 脚本是无状态的,因为它们无法访问任何持久存储或全局变量。 但是,他们可以使用一种称为状态线程的技术,通过在不同脚本实例之间传递数据来模拟有状态行为。 状态存储为附加到票据上的数据t 输出,并且可以通过使用该输出的下一个脚本输入来访问它。 数据可以是脚本可以编码和解码的任何任意数据类型。
状态线程允许 Plutus 脚本实现复杂的逻辑和交互,例如状态机、预言机和多重签名方案。 然而,它还需要仔细的设计和协调,以确保状态更新正确且一致。 例如,脚本可能需要检查自上次访问以来状态是否未被另一个事务修改,或者状态是否在有效的值范围内。
Plutus 脚本比比特币脚本和以太坊智能合约更具表现力。 Haskell 是一种函数式编程语言,可以实现任意逻辑并与其他智能合约交互。 后端可以用任何高级语言实现。 Solidity 还可以实现复杂的逻辑并与其他智能合约交互,但与 Haskell 相比它有一些限制和缺点。 例如,Solidity 由于其可变状态和低级细节而具有更高的错误和漏洞风险。 由于其 Gas 模型,Solidity 的执行成本也较高,这限制了以太坊上智能合约应用程序的复杂性和可扩展性。
Haskell 是一种支持形式验证的语言,因为它具有清晰而精确的语法、强大且静态的类型系统以及纯粹且确定性的语义。 Haskell 还拥有可以帮助进行形式验证的库和工具,例如 QuickCheck、LiquidHaskell 和 Coq。
如果您长期观察交易类型,您会发现使用脚本的交易大约是普通交易的 2 倍。 卡尔达诺拥有原生资产。 如果用户想要互相发送令牌,则无需使用脚本。 因此,普通交易量相比以太坊来说相对较高(总是需要使用智能合约来转移资产)。
结论
比特币现在和将来都不会具有与卡尔达诺或以太坊相同的功能。 比特币脚本非常简单,不允许创建创建替代金融服务所需的复杂逻辑。 Ordinals、Inscriptions 和 BRC-20 是没有潜力克服 SC 平台功能的技术。 比特币协议基本上只是将数据写入区块链,而不对内容进行任何验证。 没有第三方程序执行。
在本文中,我们主要关注可编程性选项的描述,而没有过多进行比较。 我们下次会看看。