javascript使用比特币类库bitcoinj入门指南

原创 malakashi 教程 比特币 36阅读 15 天前 举报

Java8附带了一个名为Nashorn的Javascript引擎,其性能接近V8(它不是那么好,但足够好)。使用此引擎很容易使用Java代码,并且可以从命令行或使用交互式解释器运行Javascript程序。还有一些项目提供了与node.js兼容的API,但本教程不会探讨这些API。

要开始使用,请获取JDK的第8版,并确保你可以运行jjs工具。接下来,从Maven Central下载打包好的bitcoinj JAR文件并将其放入你的工作目录。这样我们就可以通过Javascript开始使用bitcoinj。

现在让我们看一下源代码树中示例中的demo.js文件。演示程序执行一些基本操作,例如创建密钥并打印其地址,然后打开网络并打印有关其连接的节点的一些信息。

运行demo

要运行在Javascript中使用bitcoinj的demo程序,可以简单地执行:

这在Nashorn运行程序。请注意,Nashorn支持Web风格的Javascript中并没有的一些额外内容,例如从Java库导入代码的功能。cp命令行参数可设置类路径:它是JAR列表(java库)。在这种情况下,我们只要告诉它加载捆绑的bitcoinj版本,就可以包括库及其所有依赖项。

你从SLF4J收不到任何有关日志记录的后端警告。没关系,我们稍后可以看看如何设置日志记录。现在让我们先来看看代码。

demo.js

该文件的第一部分非常简单。Nashorn自动将Java库映射到Javascript命名空间中,但我们将org.bitcoinj定义为bcj,以使代码更简洁。我们也可以定义单独的类等。然后我们获取“网络参数”,它控制我们是使用主比特币网络还是测试网络(或本地节点上的regtest模式)。参数对象传递给bitcoinj中的许多API。

接下来,我们创建一个密钥,并显示如何打印其地址。

要了解可用的API,可以浏览在线javadoc。显然,这些是供Java开发人员使用的。但是,将API转换为Javascript很容易。最后,我们看到了Nashorn提供的便利:Java要求你调用getFoo()setFoo(“foo”)方法,在Javascript中我们可以将它们视为对象的常规属性。这样会好很多。

这段代码显示了如何连接到P2P网络。PeerGroup管理多个对等连接。我们必须使用DNS发现实例对其进行配置,然后启动它。它将在后台查找并设置连接。最后一行等待它找到至少三个连接的对等体,然后打印出它们的IP地址和端口。connectedPeers属性提供Peer对象列表。

标记异步

Javascript是为Web浏览器开发的,它是单线程环境,因此Javascript无法创建线程,V8(最流行的JS运行时)线程也不安全。相反,大多数JS环境只为你提供一种可以追溯到Visual Basic时代的线程样式——你可以运行并行javascript引擎,这些引擎只能通过消息传递进行通信。这反过来意味着你不能阻塞它而被迫大量形成回调导向的编程风格。

相比之下,Nashorn将Javascript编译为在JVM上运行的字节码。因此,它是完全线程安全的。虽然如果你愿意,你当然也可以实现带有大量回调的纯消息传递,但你并没有被迫并且可以以多范式的方式进行并发编程。

在这里,我们采用简单的路径:当我们需要等待某些事情发生时,我们只是阻塞主线程。下面,我们将看到如何异步执行操作。waitForPeers(3)方法返回一个future,一旦我们至少有三个peers,它将完成。futures有时被称为Javascript世界中的promises。调用get方法块直到future的结果准备就绪。

集合和数组的迭代

pg.connectedPeers属性是Java集合。这被Nashorn视为Javascript数组。但是因为Javascript历史上没有一种方便的方法来迭代集合,所以Nashorn使用类似Java的foreach语句扩展了该语言。我们可以在这里使用它:

Peer的subVer字段是HTTP用户代理字符串的比特币等价物。bestHeight字段是对等方声称自己报告的(未经身份验证的)链高度。

当然,你也可以使用更现代的JS风格的foreach,它使用一个闭包,这自然效率低下:

在这里,我们可以看到我们再次阻塞并测量到远程对等体的ping时间。请注意,这不是ICMP(互联网级别)的ping,而是比特币协议特定的ping消息。

让我们再次这样做,但这次是以异步的方式:

在这里,我们为每个对等体启动ping,并将返回的future添加到数组中。然后我们添加一个将在未来完成时运行的闭包。注意最后的(必需的)参数:它说明了运行闭包的线程。这里我们指定user thread用户线程,这是一个由bitcoinj创建的专用线程,它等待运行事件处理程序。通过在用户线程中运行内容,你可以确定自己的事件处理程序不会最终彼此并行运行(尽管它们仍然可以与主线程并行运行!)。一旦future的侦听器运行,我们可以将结果视为正常安全,因为它不会阻塞它。

最后一个forEach循环只是让程序保持运行,直到所有ping都有响应。

总结

bitcoinj还有许多其他功能,本教程不涉及这些功能。你可以阅读其他文章以了解有关完整验证,钱包加密等的更多信息,当然JavaDocs还详细介绍了完整的API。

还有另一个Javascript示例实现了与Java教程forwarding.js相同的转发程序。你可以阅读该程序以了解如何使用钱包以及如何接收和汇款。

  • php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。
  • java比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Java代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习课程。

这里是原文

评论 ( 0 )
最新评论
暂无评论

赶紧努力消灭 0 回复