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

教程大全 2025-07-12 17:47:55 浏览

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

安全性

从一开始,很明显,安全应该是技术设计选择的中心。区块链和加密货币为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的体验,这只是一些例子。

结论

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


开发一个区块链app时间要多长

做一个区块链app的周期,就启动科技而言主要还是要看app的功能有多少、复不复杂,一般的开发周期都是在2~3个月左右,涉及到需求确认、UI设计、程序开发的项目进度。 如果功能多而且复杂,那么就要花一些时间去编程去设计,相应的开发时间就会长一些。 另外如果有现成可用的源码能够符合功能需求,那么只需要在此基础上进行修改,开发周期就会短很多。

初中毕业学人工智能有发展吗?

初中毕业,去学人工智能专业,理论上来讲应该是可以的。 但还是要看你到哪里上这个学?如果是不拿大学文凭的专业培训班,那完全可以,反正是交钱学本事,不存在获得国家认可的学历问题。 但如果要到一般大学或大专班去学人工智能专业,那就有问题。 问题一是这些班要学好多门课程,要考试,比如高等数学,你没有高中数学基础是困难的。 甚至有可能在上课过程中你听不懂、跟不上课程进度的问题。 会很痛苦。 问题二是这些颁发学历的班级有“门槛”,要有高中文凭、考试成绩等入学的门槛,你难以进去。 不知道对未来你的想法,仅供斟酌。

高中数学:对号函数 来个详解

一、函数的概念与表示1、映射 (1)映射:设A、B是两个集合,如果按照某种映射法则f,对于集合A中的任一个元素,在集合B中都有唯一的元素和它对应,则这样的对应(包括集合A、B以及A到B的对应法则f)叫做集合A到集合B的映射,记作f:A→B。 注意点:(1)对映射定义的理解。 (2)判断一个对应是映射的方法。 一对多不是映射,多对一是映射 2、函数 构成函数概念的三要素 ①定义域②对应法则③值域 两个函数是同一个函数的条件:三要素有两个相同 二、函数的解析式与定义域 1、求函数定义域的主要依据: (1)分式的分母不为零; (2)偶次方根的被开方数不小于零,零取零次方没有意义; (3)对数函数的真数必须大于零; (4)指数函数和对数函数的底数必须大于零且不等于1; 三、函数的值域 1求函数值域的方法 ①直接法:从自变量x的范围出发,推出y=f(x)的取值范围,适合于简单的复合函数; ②换元法:利用换元法将函数转化为二次函数求值域,适合根式内外皆为一次式; ③判别式法:运用方程思想,依据二次方程有根,求出y的取值范围;适合分母为二次且 ∈R的分式; ④分离常数:适合分子分母皆为一次式(x有范围限制时要画图); ⑤单调性法:利用函数的单调性求值域; ⑥图象法:二次函数必画草图求其值域; ⑦利用对号函数 ⑧几何意义法:由数形结合,转化距离等求值域。 主要是含绝对值函数 四.函数的奇偶性 1.定义: 设y=f(x),x∈A,如果对于任意 ∈A,都有 ,则称y=f(x)为偶函数。 如果对于任意 ∈A,都有 ,则称y=f(x)为奇 函数。 2.性质: ①y=f(x)是偶函数 y=f(x)的图象关于 轴对称, y=f(x)是奇函数 y=f(x)的图象关于原点对称, ②若函数f(x)的定义域关于原点对称,则f(0)=0 ③奇±奇=奇 偶±偶=偶 奇×奇=偶 偶×偶=偶 奇×偶=奇[两函数的定义域D1 ,D2,D1∩D2要关于原点对称] 3.奇偶性的判断 ①看定义域是否关于原点对称 ②看f(x)与f(-x)的关系 五、函数的单调性 1、函数单调性的定义: 2 设 是定义在M上的函数,若f(x)与g(x)的单调性相反,则 在M上是减函数;若f(x)与g(x)的单调性相同,则 在M上是增函数。

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐