关于作者:Arthur Breitman是Tezos协议的早期架构师。在全职参与Tezos之前,他在X和Waymo做过自动驾驶汽车。在他的早期职业生涯中,他曾在高盛和摩根士丹利担任量化分析师。Arthur毕业于法国理工学院,并拥有纽约大学Courant学院的金融数学硕士学位。
现在有许多区块链,但只有少数独立的实施方案。泰佐斯就是其中之一。作为链的早期架构师,我有机会从一开始就参与它的创建和开发。早期一个偶然的决定是遵循函数式编程范式,使用OCaml编程语言来构建链。在这次经历中,我发现函数式编程和区块链非常适合。让我们试一试,看看为什么!
安全性
从一开始就很明显,安全应该是技术设计选择的中心。区块链和加密货币为bug提供了一个几乎最坏的环境。
关键的bug不能公开讨论,因为它们会影响实时系统,但需要同时部署在许多参与者中,而不需要使用可信的第三方。除了隐藏的错误修复,这使得解决这些问题的选择非常少。
对于犯罪黑客来说,找到这些系统中的漏洞具有巨大而直接的经济激励,因为它们可以确保真正的经济价值。
虽然安全至关重要,但不幸的是,没有万无一失的方法来确保安全。即使是最严格的方法,如形式验证,仍然是昂贵的,并受制于规范本身的漏洞。然而,一些技术选择可以帮助我们。
选择OCaml作为编程语言的一个主要原因是,它可以帮助消除大规模错误。作为内存管理语言,不需要担心缓冲区溢出,但这只是表面现象。Tezos使用OCaml非常强大的静态类型系统来执行隔离和权限。托管交易代码无法访问账簿的底层存储;它甚至无法构建写入存储所需的类型。相反,类型系统限制了它被写入一个更高的抽象,可以检查和净化每一个动作。当然,封装并不是函数式编程所独有的,但是OCaml的模块签名机制使得审查和改进权限变得非常简单。
Tezos协议为Michelson嵌入了一个解释器,这是Tezos智能合约背后的虚拟机。它是静态类型和函数。解释器利用OCaml的GADT系统来确保输入错误的迈克尔逊契约甚至无法构建。这是我们从语言本身继承的另一个好的安全属性。
有句老话说,如果一个程序是用函数式编程语言编写的,那么它就能工作。这句话当然是轻描淡写,虽然我确实记得经过几个月的开发,Tezos的第一个编译版本确实在第一次尝试中运行,并且能够处理事务。
这些属性都不能保证安全性,但它们可以解决更明显的缺陷,使程序员和安全研究人员能够专注于更高层次的问题。
如果黄金标准是正式验证,那么OCaml处于非常好的位置。Coq是一个领先的交互式定理检查器和证明检查器。它是用OCaml写的,可以自然输出OCaml。此外,Coq-of-OCaml可以做相反的事情,从现有的OCaml代码中准备Coq代码。
区块链看起来像一个函数式编程问题
随着Tezos初具规模,我意识到实现区块链时需要解决的许多问题与函数式程序员非常熟悉的问题类型相似。就其核心而言,区块链是一种仅使用附加数据结构来表示可变状态的方法。当你拿着一个累加器的时候,那就是你得到的。这是我们在函数世界中处理数据及其不变性的典型方式。
函数式编程非常适合的一个问题是处理链重组,此时已经应用到状态的块需要回滚,因为不同的分支最终是一致选择的。当数据存储为功能树时,网络参与者可以有效地撤销这些块对状态的影响。然后,随着链的推进,你需要使用垃圾收集器来清理它并释放内存,这在函数式编程的世界里是非常熟悉的事情。
此外,如果你正在构建智能合约,那么你需要一个智能合约语言,这意味着你需要一个编译器,它往往可以很好地处理函数式编程,尤其是OCaml。当从源语言编译到目标语言时,有许多步骤:对文本进行词法分析以创建单个标签,将这些标签组装成抽象语法树,并转换树的所有部分,直到我们到达目标语言,有时通过一些中间表示,其中类型系统约束转换。当用OCaml编写时,所有这些步骤的代码可以非常优雅和高效。
编译后的智能合同也受益于函数式编写。每个契约都有自己的不可变数据与之相关,所以你不能让它成为一个纯粹的函数。但是,我们可以做的是将存储和合同加载到一个隔离的虚拟机中执行。这是最接近纯函数的东西,确定性的,不受外部值的影响。
为什么是OCaml?
OCaml不是一个明显的选择。作为一种编程语言,它仍然有一些优势。但是,它是一种成熟的语言,在不影响性能的情况下,提供了强类型函数式编程语言的安全性。它源于法国学术界,已被脸书、简街资本和Docker等公司用于安全敏感项目。它也是编写编译器的流行语言。使用OCaml,您可以编写非常可读、可靠和高效的代码。虽然不能防止直接的编程错误,但是函数式编程带来的强大的类型系统和无副作用帮助你对代码的正确性有很高的信心。
Haskell是一种流行的函数式编程语言,它提供了一种非常纯粹的基于懒求值的范式,但是要写出性能和习惯用法都很好的Haskell代码是很困难的。
一个常见的反对意见是,使用OCaml这样不常见的编程语言会增加招聘程序员的难度。这种说法对于试图招募数千名开发人员的公司来说可能有些分量,但显然,早期核心协议开发团队最有效的规模要比这小得多。此外,我发现对于那些擅长构建这类系统的开发人员来说,在几个月内学会这门语言并不困难。
WhatsApp能够通过一个小而专注的Erlang开发者团队扩展到数亿用户,这在早期给了我很多启发。我想说,这个灵感是经得起时间考验的。
虽然OCaml被用作Tezos的基础,但围绕它构建工具和应用程序的开发人员社区通常是用各种流行语言来完成的。同样,对于编写智能合同,有一些高级语言可以给你类似Python或JavaScript的体验。这些只是一些例子。
结论
简而言之,区块链和函数式编程之间有一种非常自然的契合。如果正确的工具没有被用来做正确的工作,那将是一种耻辱!有许多问题需要解决,各地的开发人员都有机会应用他们的技能,为这个新生(但正在蓬勃发展)的类别构建更好的工具、应用程序和基础架构。