是什么让区块链开发与众不同

What makes development on blockchain different? | Cardano Explorer (cexplorer.io)

基于区块链的构建涉及传统编程的范式转变,并且需要对区块链的去中心化模型有透彻的了解。 智能合约开发人员可以使用一组特定的功能来开发去中心化应用程序(DApp)。 他们必须在第一次尝试时就构建一个安全的 DApp。 在本文中,我们将解释开发常规应用程序和区块链应用程序之间的区别。 我们将看看用 Aiken 编写的脚本和用 Solidity 编写的 SC。

区块链上的构建有何不同?
常见编程语言和区块链语言之间的主要区别在于它们的用例和设计原则。 通用编程语言是通用的,可用于开发广泛的应用程序。 另一方面,区块链语言通常设计有特定的功能,以支持去中心化应用程序(DApp)和智能合约(SC)的开发。

使用传统编程语言的开发人员拥有大量可供使用的库,使他们几乎可以编写任何内容。 这些库由全球开发人员社区多年开发,为从处理文件 I/O 到复杂的机器学习算法等各种功能提供预先编写的代码。 这个庞大的库生态系统使开发人员能够快速高效地构建应用程序,而无需重新发明轮子。

然而,当谈到区块链开发时,情况却截然不同。 区块链编程语言,例如以太坊的 Solidity 或卡尔达诺的 Plutus,虽然功能强大,但没有相同广度和深度的可用库。 这部分是由于区块链技术相对较新以及编写智能合约的具体要求。

区块链编程语言的设计特别关注密码学和资金操纵。 此外,它可以是创建新型代币、定义对代币的控制、转移条件等。

编写 SC 的开发人员确实可以控制这些合约中编码的逻辑和规则。 然而,他们无法控制区块链网络本身的某些方面。

例如,开发人员无法控制网络吞吐量,即处理事务并将其添加到区块链的速率。 这是由网络协议、节点数量和所使用的共识算法等多种因素决定的。

同样,开发人员无法控制或阻止区块生产者对区块的潜在操纵。 区块生产的完整性由区块链的底层共识算法和网络规则来维护。

虽然开发人员可以决定其 SC 的行为,但其执行取决于(并可能受到)区块链网络。

这种关注点分离是区块链技术去中心化本质的一个基本方面。 它确保没有任何一方能够完全控制区块链网络的各个方面,从而增强其安全性和可信度。 尽管这是区块链的一个理想功能,但一些开发人员可能会感到有些限制或依赖于外部因素。

在区块链开发中,代码在去中心化网络上执行,并且必须遵守区块链协议的约束。 例如,SC 中的每项操作都需要消耗一定量的“gas”,开发人员必须在合同中尽可能提高 Gas 效率。 这通常意味着智能合约的编码风格更加低级和明确。

此外,智能合约一旦部署在区块链上,就无法更改。 这种不变性是区块链技术的基本特征,但这也意味着开发人员必须在第一时间就获得正确的代码。

不存在错误或安全漏洞,因为以后无法修补它们。 因此,智能合约的开发过程往往涉及严格的测试和审核。 这使得 DApp 的开发时间更长、成本更高。

尽管了解区块链编程的所有陷阱对于新开发人员来说是一个挑战,但去中心化模型可能会带来另一个陷阱。

开发常规应用程序通常涉及创建一个集中式系统,其中单个实体可以控制数据和功能。 这与以去中心化模式运行的区块链应用程序形成鲜明对比。 在这个模型中,没有任何一个实体能够控制整个网络。 相反,控制权分布在节点网络之间。

SC 是区块链应用的基本组成部分。 它们是自动执行的合同,协议条款直接写入代码中。 它们按照预定规则自动执行交易,无需中间人。 这种自动化降低了人为错误和欺诈的风险。

由于没有空间错误的是,SC 必须在给定条件下完全按照预期行事。 任何第三方都不得影响或阻止 SC 的执行。 代码就是法律。 如果 SC 执行失败并发生意外错误,通常没有办法挽救损失的资金。

DApp 开发的另一个具体特征是,如果开发人员非常了解一种环境,例如以太坊,他可能根本没有准备好在卡尔达诺上进行开发。 SC 平台彼此之间可能存在根本不同。

开发者迁移到新平台困难重重
开发人员必须意识到 SC 平台之间的显着差异,因为这些差异会极大地影响其应用程序的设计、功能和安全性。 例如,让我们看看状态和并发之间的差异。

以太坊和卡尔达诺这两个著名的 SC 平台提供了很好的例子来说明这些差异如何体现,特别是在状态操纵和并发性方面。

以太坊以基于账户的模式运行。 在这个模型中,整个网络共享一个全局状态,该状态随着生成的每个块而更新。 这个全局状态包括账户余额和智能合约状态。

以太坊的模型允许多个用户与单个区块内的单个智能合约进行交互。 然而,这种共享的可变状态可能会导致复杂性和潜在的漏洞,特别是在并发方面。 在这种情况下,并发是指同时执行多个事务的能力。 如果处理不当,可能会导致竞争条件和其他安全漏洞。

另一方面,卡尔达诺使用扩展未花费交易输出(EUTxO)模型。 在此模型中,资金的发送和接收不存储为余额,而是存储为与钱包地址关联的未花费交易金额 (UTxO)。 这些 UTxO 只能使用一次。

该模型本质上处理并发性,因为每个交易输出只能使用一次,并且一旦使用,就不能被其他交易使用。 然而,这也意味着开发人员需要以不同的方式思考如何设计智能合约和处理状态。

了解这些差异对于开发人员避免智能合约中的错误和漏洞至关重要。 例如,重入是以太坊 SC 中的一个常见漏洞,攻击者可以在第一个函数调用完成之前重复调用某个函数。 由于 Cardano 的 EUTxO 模型,这在 Cardano 中不太令人担忧。

虽然以太坊和卡尔达诺都提供了用于开发去中心化应用程序的强大平台,但它们都有自己独特的处理状态和并发的方法。 开发人员必须了解这些差异以及它们对智能合约开发的影响,以便在这些平台上有效地构建安全高效的应用程序。

熟悉 Solidity 的开发者无法轻易切换到 Cardano。 除了必须学习新的编程语言(Plutus、Aiken 等)之外,他们还必须处理给定区块链的具体特征。 例如,迁移到 Solana 时也是如此。

从一个区块链平台过渡到另一个区块链平台不仅仅需要学习一门新的编程语言。 每个平台都有自己独特的架构、共识机制、交易模型、账户模型和智能合约功能。

例如,如果开发人员已经具备使用互联网、数据库、云服务、文件系统等概念的经验,那么从 Java 过渡到 C# 对他们来说会更容易。

艾肯
艾肯是一种函数式编程语言,用于为卡尔达诺编写脚本(智能合约)。

在图中,您可以看到一个非常简单的验证器脚本。 该脚本检查是否满足支出条件。

消费者必须提供签名和字符串“Hello, World!”。 如果是,则脚本的返回值为 True。 这将允许资金被花费。

查看开发人员可以使用的功能。 除此之外,开发人员可以使用字节数组并将它们相互比较,使用多个哈希函数(blake2b_256、sha2_256 和 sha3_256)、使用时间间隔、执行基本算术函数、使用字符串等。

至于与区块链更相关的功能,开发者可以使用地址、证书和交易。 此外,他们还可以使用 ADA 币和代币等的价值。

卡尔达诺的 DApp 需要构建链上和链下部分。 艾肯仅适用于链上部分。 开发人员可以使用任何合适的编程语言来构建链下部分。

在卡尔达诺中,用 Aiken 或 Plutus 编写的智能合约通常较小,因为它们本质上是确定交易是否有效的验证脚本。 它们在 UTXO 模型上运行,其中每笔交易输出都带有将使用一段逻辑(合约)来验证任何尝试使用它的交易。

另一方面,以太坊的智能合约是用 Solidity 编写的,是存在于区块链上的有状态应用程序,通常具有更高的复杂性。 它们在基于账户的模型上运行,其中合约具有存储在区块链中的持久状态以及可以改变该状态的函数。

在下图中,您可以看到管理数字代币所有权的合约示例,并可以在代币持有者之间转移这些代币。

合约的前 4 行代表存储在区块链中的状态。

用传统的面向对象编程语言编写的小型企业应用程序可能有数千行代码,而企业应用程序很容易就有数万到数十万行源代码。 例如,波音 787 的航空电子设备和在线支持系统背后有 650 万条线路。

就代码行数而言,DApp 与常规应用程序相比较小。 一个简单的 DApp 可能包含一些智能合约,每个智能合约由几十到几百行代码组成。 更复杂的 DApp,例如去中心化交易所或借贷平台,可能由多个具有数千行代码的智能合约组成。

结论
构建 DApp 是一个利润丰厚的新领域,每年都吸引着越来越多的开发者。 尽管必须克服去中心化的所有陷阱和区块链开发的细节,但他们仍然可以提供越来越高效和用户友好的 DApp。 例如,手机游戏和应用程序的开发竞争非常激烈并且已经饱和。 在区块链行业,一个团队更容易站稳脚跟,成为该领域的主导者。 这很诱人。