有许多区块链,但只有少数几个单独的实现存在。Tezos就是其中之一,作为该链的早期架构师,我有机会从一开始就参与了它的创建和开发。早期的一个偶然决定是遵循函数式编程范式,使用OCaml编程语言来构建链。在这段经历中,我发现函数式编程和区块链非常适合。让我们试试看,看看为什么!安全性从一开始,很明显安全性应该是技术设计选择的核心。区块链和加密货币为错误提供了几乎最坏的环境。关键错误不能公开讨论,因为它们会影响实时系统,但它们需要在不使用受信任的第三方的情况下同时部署在许多参与者身上。除了神秘的错误修复之外,这为解决这些问题留下了非常少的选择。对于犯罪黑客来说,发现这些系统中的漏洞有很强的、直接的经济动机,因为它们确保了真正的经济价值。不幸的是,虽然安全是最重要的,但没有万无一失的方法来确保它。即使是最严格的方法,例如形式验证,仍然很昂贵,而且规范本身也存在漏洞。但是,一些技术选项可以帮助我们。选择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、JaneStreetCapital和Docker等公司用于安全敏感项目。它也是编写编译器的流行语言。您可以使用OCaml编写非常可读、可靠和高效的代码,虽然它不能防止直接编程错误,但强类型系统和函数式编程带来的副作用的存在有助于让您对代码的正确性充满信心.高度信任。Haskell是一种比较流行的函数式编程语言,它提供了一种非常纯粹的基于惰性求值的范式,但是很难编写出兼具性能和习语的Haskell代码。一个普遍的反对意见是,使用像OCaml这样不常见的编程语言会使招聘程序员变得更加困难。对于一家试图招募数万名开发人员的公司来说,这种说法可能有些分量,但很明显,早期核心协议开发团队的最有效规模远小于此。此外,我发现具有构建这些类型系统的诀窍的开发人员可以在几个月内轻松掌握这门语言。WhatsApp能够通过小型、敬业的Erlang开发人员团队扩展到数亿用户,这在早期给了我很多启发,我想说它经受住了时间的考验。虽然OCaml是Tezos的基础,但围绕它构建工具和应用程序的开发人员社区通常使用各种流行语言来实现。同样,对于编写智能合约,有一些高级语言可以给你类似Python或JavaScript的体验,这些只是几个例子。结论总之,区块链和函数式编程之间有着非常自然的契合,不为正确的工作使用正确的工具将是一种耻辱!有许多问题有待解决,各地的开发人员都有机会应用他们的技能为这个新生的(但蓬勃发展的)类别构建更好的工具、应用程序和基础设施。
