8

为什么函数式编程非常适合开发区块链?

 1 year ago
source link: https://www.51cto.com/article/717849.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

为什么函数式编程非常适合开发区块链?

作者:老雅痞 2022-09-02 14:46:45

现在有很多区块链,但只有少数几个独立的实施方案存在。Tezos是其中之一,作为该链的早期架构师,我有机会从一开始就参与了它的创建和开发。早期一个偶然的决定是遵循函数式编程范式,使用OCaml编程语言来构建该链。在这段经历中,我发现函数式编程和区块链是非常合适的。让我们来试试,看看为什么!

现在有很多区块链,但只有少数几个独立的实施方案存在。Tezos是其中之一,作为该链的早期架构师,我有机会从一开始就参与了它的创建和开发。早期一个偶然的决定是遵循函数式编程范式,使用OCaml编程语言来构建该链。在这段经历中,我发现函数式编程和区块链是非常合适的。让我们来试试,看看为什么!

933656c01b43a6dd5d0923ca5c08658d494a2a.jpg

从一开始,很明显,安全应该是技术设计选择的中心。区块链和加密货币为bug提供了一个几乎最坏的环境。

关键bug不能被公开讨论,因为它们会影响到实时系统,但它们需要在许多参与者中同时部署,而不使用可信的第三方。除了隐蔽的错误修复外,这使得解决这些问题的选择非常少。

对于犯罪黑客来说,发现这些系统中的漏洞有很大的、直接的经济激励,因为它们能确保真正的经济价值。

虽然安全是至关重要的,但不幸的是,没有万无一失的方法来确保安全。即使是最严格的方法,如形式化验证,仍然是昂贵的,并且受制于规范本身的漏洞。然而,一些技术上的选择可以帮助我们。

选择OCaml作为编程语言的一个主要原因是,它可以帮助消除大类错误。作为一种内存管理语言,不需要担心缓冲区溢出等问题,但这只是表面现象。Tezos利用OCaml非常强大的静态类型系统来执行隔离和权限。管理交易的代码不能访问账本的底层存储;它甚至不能构建它需要写到存储的类型。相反,类型系统限制它写到一个更高的抽象中,这个抽象可以检查和净化每一个动作。当然,封装并不是函数式编程所独有的,但OCaml的模块签名机制使得审查和完善权限变得非常简单。

Tezos协议为Michelson嵌入了一个解释器,Michelson是Tezos智能合约背后的虚拟机,它本身是静态类型和功能的。该解释器利用OCaml的GADT系统来确保错误输入的Michelson合约甚至不能被构建。这是我们从语言本身继承的另一个不错的安全属性。

一句老话声称,如果一个程序是用函数式编程语言编写的,那么它就能工作。这句话当然是轻描淡写的,尽管我确实记得,经过几个月的开发,Tezos的第一个编译版本确实在第一次尝试中运行,并且能够处理交易。

这些属性都不能保证安全,但它们能解决更明显的缺陷,使程序员和安全研究人员能够专注于更高层次的问题。

如果黄金标准是形式验证,那么OCaml的地位就非常好。Coq是一个领先的交互式定理检验器和证明检验器,它是用OCaml写的,可以自然地输出OCaml。此外,Coq-of-OCaml可以做相反的事情,从现有的OCaml代码中准备Coq代码。

区块链看起来像一个函数式编程问题

随着Tezos开始成形,我意识到,在实现区块链时需要解决的许多问题与函数式程序员非常熟悉的问题类型类似。就其核心而言,区块链是一种使用仅附加的数据结构来表示可改变状态的方式。当你用一个累加器持有区块时,你得到的就是这个状态。这就是我们在函数式世界中处理数据及其不可变性的典型方式。

函数式编程非常适用的一个问题是处理链式重组,当已经应用于状态的块需要回滚时,因为不同的分支最终被共识所选择。当数据被存储为功能树时,网络参与者可以有效地撤销这些块对状态的影响。然后,随着链的进展,你需要用垃圾收集器来清理它并释放内存,这又是函数式编程世界中非常熟悉的事情。

此外,如果你正在构建智能合约,那么你需要一个智能合约语言,这意味着你需要一个编译器,编译器往往在函数式编程中处理得非常好,特别是OCaml。从源语言编译到目标语言时有很多步骤:对文本进行词法解析以创建单个标记,将这些标记组装成一个抽象的语法树,并对该树的各个部分进行转换,直到我们到达目标语言,有时要经过一些中间表示,其中类型系统对转换进行约束。所有这些步骤的代码在用OCaml编写时可以非常优雅和高效。

编译后的智能合约,也得益于用函数式写法。每个合约都有自己的不可变的数据与之相关,所以你不能让它成为一个纯函数。然而,我们可以做的是将该存储和合约加载到一个孤立的虚拟机中执行。这是最接近纯函数的东西,是确定性的,不受外部值的影响。

为什么是OCaml?

OCaml不是一个明显的选择。作为一种编程语言,它仍然有些小众。然而,它是一种成熟的语言,提供了强类型函数式编程语言的安全性,同时又不影响性能。它扎根于法国学术界,并被Facebook、Jane Street Capital和Docker等公司用于安全敏感项目。它也是一种用于编写编译器的流行语言。你可以用OCaml写出非常可读、可靠和高效的代码,虽然它不能防止直接的编程错误,但强大的类型系统和函数式编程带来的无副作用有助于让你对代码的正确性有很高的信心。

Haskell是一种比较流行的函数式编程语言,它提供了一种基于懒惰评估的非常纯粹的范式,但要写出性能和成语兼备的Haskell代码是比较困难的。

一个常见的反对意见是,使用像OCaml这样的不常见的编程语言会使招聘程序员更加困难。这种说法对于试图招募成千上万的开发人员的公司来说可能有一定的分量,但很显然,早期的核心协议开发团队的最有效规模要比这小得多。此外,我发现对构建这些类型的系统有诀窍的开发人员在几个月内学会这门语言并不困难。

WhatsApp能够通过一个小型的、专注的Erlang开发者团队扩展到数以亿计的用户,这在早期给了我很大的启发,我想说,这种启发经得起时间的考验。

虽然OCaml被用于Tezos的基础,但围绕它构建工具和应用程序的开发者社区通常用各种流行语言来做。同样,对于编写智能合约,有一些高级语言可以给你带来类似Python或JavaScript的体验,这只是一些例子。

总之,区块链和函数式编程之间存在着非常自然的契合,如果不使用正确的工具来完成正确的工作,那将是一种耻辱! 有许多问题有待解决,各地的开发者有机会应用他们的技能,为这个新生(但蓬勃发展)的类别建立更好的工具、应用程序和基础设施。

责任编辑:华轩 来源: 今日头条

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK