Exonum的第一个绑定:为什么选择Java

我们开发私有Exonum区块链的框架的核心是用Rust编写的,因为此PL专注于使用内存的安全性。 但是,Rust具有许多优点,但它具有许多使“交互”复杂化的功能:它的语法对于许多开发人员而言是不寻常的,并且入门门槛很高。

为了简化Exonum平台的工作并使观众更容易使用,我们决定编写一个绑定库。 绑定语言已成为Java。

为什么我们选择Java,我们告诉大家。


/ Exonum

关于Exonum的几句话


Exonum是我们用于开发私有区块链的开源框架。 Exonum上的区块链比公共区块链快得多,并且每秒能够处理多达5000笔交易。 为了进行比较,在以太坊中这个数字是几十个 ,而比特币则更少

Exonum使用拜占庭共识算法来保护数据。 即使三分之一的网络节点遭到破坏,它也不需要挖掘,并且可以保证事务正确执行。

Exonum平台可用于任何领域:财务,技术,法律。 该框架特别适合创建数字版权管理系统(可以在官方网站上找到演示)和组织投票( 演示 )。 在这两种情况下,所有发生的过程都尽可能透明,并受到密码机制的保护。

去年,使用Exonum平台实施了乌克兰国家土地地籍。 在此之前,Exonum启动了乔治亚州的土地管理项目。 我们与数十家财富500强公司和欧盟进行谈判 ,以在其业务流程中实施我们的系统。

Exonum的核心是用Rust编写的。 该PL着重于安全性和速度这一事实证明了选择是正确的-它在某些任务上的工作速度比Java,Go,C和C ++更快。 同时,Rust保证内存安全性并防止两个线程尝试访问相同数据时发生争用

Rust编译器旨在最大程度地减少人为因素造成的错误。 例如,它消除了几类错误,但以生命周期和拥有的概念为代价。

Rust中的所有值都有一个“所有权域”。 当名称超出此范围时,将释放关联的资源。 这是Rust官方文档中提供的一个示例代码:

fn use_vec() { let vec = make_vec(); //   print_vec(vec); //   print_vec for i in vec.iter() { //   vec println!("{}", i * 2) } } 

如果将其“馈送”到编译器,则它将生成错误:

 error: use of moved value: `vec` for i in vec.iter() { ^~~ 

这表明vec不可用,因为其所有权范围已更改。 因此,在开发过程中“打腿”变得更加困难。

为什么我们决定创建绑定


嘈杂的语法

Rust提供了可以相互组合的便利且广泛的数据类型。 这样就可以简化代码中的值集并限制对数据的访问,从而防止未经授权的访问。

在Exonum中使用智能合约时,这些功能非常重要 。 多亏了他们,我们框架的“智能”合约比例如以太坊解决方案具有更高的性能和内存访问安全性。

通常,Rust与其他命令式语言类似(特别是,Rust语法类似于C / C ++),但是它代表了大量的创新概念。 它具有周期,条件,功能,但同时会出现所有权和类型区域。 因此,对于从未使用过此PL的人来说,可能很难阅读其中的程序。

起初, 它们似乎是 “外国的”。 “痛苦”增加了一种异常的内存管理(与其他语言相比),从而使Rust变得非常安全。 去年秋天,Rust的创建者在社区的5000名成员中发布了一项民意调查。 几乎四分之一的受访者表示 Rust很难与之合作。

编译器要求太高

正如我们已经指出的,Rust编译器的任务是减少代码中的错误数量。 编译器严格遵守程序的内容,但是会显示用于故障排除的选项。 在这种情况下,编译器甚至会显示有关编程风格的警告。

这种方法使您可以编写可靠的代码(通常在使用区块链时很重要),但它也有不利的一面。 有时,您必须使用Rust编写程序,以便编译器“了解”您没有在执行禁止的内存操作。 而且由于该语言还很年轻并且还在不断发展,因此可能没有任何公认的惯例。 因此,正如Exonum Ilya Bogdanov的开发人员所说, 必须通过科学戳法找到许多模式。

小社区

创建活页夹的第三个原因是小的Rust社区。 尽管这种语言的社区非常友好,并且其成员随时准备回答问题,但是这种语言在少量的文学和图书馆中“受苦”。 但是,这里应该公平地指出这个问题正在逐步解决。

近年来,Rust一直积极推广MozillaSamsung ,这对正在开发的库的数量和C / C ++世界中现有解决方案的新“包装器”产生了积极影响。 语言“教科书”也开始逐渐出现。 在已经存在的那些中,值得重点介绍的是Ivo Balbaert的“ Rust基础知识 ”,这是官方网站上的在线指南 ,也是Rust项目的开发者之一史蒂夫·克拉伯尼克(Steve Klabnik)的最新著作“ The Rust Programming Language ”。

为什么选择Java


确定该选择的主要原因之一是该PL的庞大社区。 根据去年在Stack Overflow网站上进行的一项研究 ,Java的受欢迎程度排名第三(仅JavaScript和SQL通过了)。 在接受调查的6.4万名开发人员中,近40%用Java编写。

由于社区的规模,该PL已获得了广泛的工具集。 其中包括IDE,分析解决方案,基准框架等。它们太多了,以至于有些公司要求开发人员仅使用特定的IDE和框架来避免分裂工作环境。

同时,Java具有简单的语法,并且具有可以与C应用程序二进制接口(ABI)一起使用的Java本机接口(JNI)。 另外,Java使在JVM堆栈上使用其他语言成为可能:Scala,Kotlin和Clojure。

最后,Java机器是跨平台的:Java代码以字节码执行,该字节码被解释并在Windows,MacOS和Linux平台上运行。 同时,Java语言与开放源代码的联系更紧密(例如,与C#相比)。 Java开发人员工具大部分是免费的:它们既是JDK也是基于JDK的集成开发环境-JDeveloper,NetBeans,Eclipse等。与此同时,您可以在专用资源(例如GitHub )上找到大量开源项目。 也有许多使用开源技术的手册

开发Java绑定的主要挑战


Java绑定的开发已经漫长而复杂(并且仍在进行中)。 我们必须考虑使Rust和Java如此不同的所有功能。

例如,挑战之一就是组织资源管理。 关键是在Java中有一个垃圾收集器,但在Rust中没有。 由于开发人员得出的结论是,他们可以使用类型系统提供相同级别的可靠性,因此在较早的版本之一中已将删除

Java GC尽管增加了资源消耗(它强制所有函数将未使用的对象返回给它,以避免潜在的内存泄漏),但它非常方便。 因此,我们需要实现Java开发人员想要的资源清除机制。

事实证明,另一个困难与Exonum-Merkle树中呈现的特定数据结构有关。 Exonum 使用它们将区块链状态组合为单个哈希。 这样就可以证明交易的真实性,而不必与几个完整的网络节点进行通信。 该功能对于我们的轻量客户端很重要,因此也必须使用Java对其进行解释。

Java API几乎完全重复了Rust API。 这样做是为了使我们更容易修改文档并简化用户的工作。 我们已经准备了单独的指南来配置和运行Java绑定应用程序的Exonum节点。

要使用Java 创建服务 ,可以使用项目的模板生成器。 您需要安装Maven 3并运行以下命令:

 $ mvn archetype:generate \ -DinteractiveMode=false \ -DarchetypeGroupId=com.exonum.binding \ -DarchetypeArtifactId=exonum-java-binding-service-archetype \ -DgroupId=com.example.myservice \ -DartifactId=my-service \ -Dversion=1.0 

您可以使用交互模式:

 $ mvn archetype:generate \ -DarchetypeGroupId=com.exonum.binding \ -DarchetypeArtifactId=exonum-java-binding-service-archetype 

您可以 Exonum官方项目官方网站上的文档中找到有关设置Java服务的示例的完整指南。 在GitHub的存储库中有启动Exonum节点的建议。


/ Exonum

未来计划


Java绑定处于alpha状态。 我们计划在不久的将来将其作为完整的现成功能发布。 现在,我们正在收集用户的反馈,以便跟踪库中的潜在问题并进行更正。

文件,样例项目,SDK的工作也在进行中,以简化与区块链上的应用程序的集成并总体上改善UX。 您可以在GitHub的存储库中找到该项目完整路线图。

在那里,您可以使用所有资源来尝试Java绑定并为Exonum编写Java服务。 如有任何疑问,请联系我们在Gitter的开发团队 。 他们会尽力告诉和帮助。

Source: https://habr.com/ru/post/zh-CN423441/


All Articles