Nimiq:一个Web原生的无摩擦的支付协议

Team Nimiq
Nimiq Translations
Published in
9 min readJun 16, 2017

English | 原来由 jonfish

Nimiq 网络

介绍

6月6日,我们发布了 Nimiq 测试网络 以获取早期的社区反馈并收集真实世界的数据。说得通俗易懂一点,Nimiq 就是:

一个万维网上无摩擦的点对点(P2P)支付协议。它融合了比特币(Bitcoin)和以太坊(Ethereum)的元素,并为 Web 平台做了精简,是下一代的区块链协议。毫无疑问,它是开源和完全去中心化的。

浏览器是 Nimiq 分布式网络里的一等公民。它能够和网路建立共识,也能够在内部进行真正的点对点(P2P)支付,而不需要依靠受信任的第三方。和传统的加密货币比起来,这种浏览器优先的方案可以大大降低开发者、顾客和商家的使用门槛。

概览

基于 Web 的区块链的主要挑战是将核心区块链组件转到 Web 平台,包括:

网络组件 用于建立 P2P 连接。
存储组件 用于存储密钥和区块链数据。
加密组件 用于散列、签名和校验。

另外,因为 Web 的限制,协议必须精简:

数据压缩 以便几秒钟内完成区块链同步,而不是几个小时。
即时且可扩展的交易 这样才能实现在柜台支付。
简易 意味着我们只做“支付”这一件事,并把它做得比别人更好。
区块链参数 为了我们浏览器优先的策略而精简。

将区块链基元转到 Web 平台

网络组件

Nimiq 的 P2P 网络使用 WebRTCWebSocket 连接。

在 Nimiq 网络里面,主要有两种节点:中枢节点(Backbone Nodes )浏览器节点(Browser Nodes)。它们使用相同的可以在两种环境同时运行的 JavaScript 代码库。

中枢节点基于 NodeJS,运行在服务器上。它们通过 WebSockets 互相通讯,同时作为浏览器节点的入口点和信令服务器,供其建立浏览器到浏览器的 WebRTC 连接。

浏览器节点构建在浏览器引擎之上,因此它们完全不需要安装。为了连接网络,它们至少要和一个中枢节点建立一个 WebSocket 连接。一旦它们建立了第一个连接,它们就开始使用中枢节点作为信令服务器,建立浏览器到浏览器的连接。浏览器节点也可以作为后续浏览器到浏览器连接的信令服务器。

从长远来看,浏览器节点主要是轻客户端,不一定要作为矿工参与。其主要用途是迅速建立共识,以证明其账户收支并将交易发送到网络中。重型矿工出于性能和便利的原因,可能更喜欢运行中枢节点,尽管我们想要把中枢节点的收益降低,以便使激励向着我们浏览器优先的策略平衡。此外,即使是运行轻客户端的浏览器也会为网络贡献资源:它们与其他浏览器共享(压缩过的)区块链数据,以减少中枢节点上的网络负载。

这种实现方案有一些缺憾:

  1. 根据用户的 NAT 配置,可能无法建立直连的 P2P 连接。它们需要一台TURN 服务器才能连接到其他浏览器。在这种情况下,通过 WebSockets 仅连接中枢节点变得更有意义,因为没必要增加 TURN 服务器上的网络负载。
  2. 强大的浏览器 APIs 仅限于安全源。所以中枢节点需要通过 SSL 提供一个加密连接给浏览器。这样它就需要域和 SSL 证书。为了方便和廉价地访问域,我们将在中枢节点安装程序中提供动态 DNS 和 Letsencrypt
  3. 根据用户防火墙的配置,可能无法建立与非标准端口的连接。在这种情况下,至少有一些节点需要在标准443端口上运行。为了避免节点以 root 身份运行,最好使用 Nginx 作一个反向代理。

存储组件

浏览器节点使用 IndexedDB API 将区块链数据和密钥存储在用户的磁盘上。由于浏览器不能存储千兆字节的数据,因此我们使用迷你区块链(Mini-Blockchain)方案压缩区块链(见压缩)。在测试网络中,私钥未经加密存储,且一旦用户清除浏览器历史记录,会跟着被删除。

在主网络中,我们将使用更高的安全标准:

使用 Chrome 的持久化存储 API,即使你清除浏览器数据,区块链数据依然存在。私钥将始终加密存储。此外,我们将为用户提供一个简单的应用程序,用于将密钥打印备份到纸质钱包中。我们还计划通过 Web USBWeb 蓝牙支持冷钱包。

加密组件

由于性能与安全性相关,我们需要高性能加密基元。用 JavaScript 实现无法满足性能要求。

测试网络(Betanet)加密

前期测试网络中的加密是基于 WebCrypto APIs,以达到近乎原生性能。但是,WebCrypto API 功能并不是很丰富,导致太多的次优设计决策。因此,我们不会将它用于主网络。

工作量证明(PoW)算法 使用 SHA-256,因为它是 WebCrypto 唯一支持的散列函数,对于我们的第一个公开测试网络来说,它足够了。
数字签名算法 使用 NIST 曲线 P-256,因为它是 WebCrypto 唯一支持的曲线。

主网络(Mainnet)加密(初步方案)b

主网络中的加密基元将基于 WebAssembly,以达到近乎原生性能,并且我们在加密算法的选择上具有最大的灵活性。

工作量证明(PoW)算法 我们将在主网络中使用更复杂的 PoW,因为 SHA-256 将导致集中式挖矿。主网络 PoW 应该是内存费力(memory-hard)和低能耗的,使用常规硬件实现真正的分散式挖矿。至于用哪种具体算法还没有最终决定。我们正在调查多个候选方案,比如 Argon2 (虽然太慢) 或 ETHash,社区也可以提出建议,我们非常开放。

权益证明(PoS)算法 从长远来看,我们强烈希望切换到一种权益证明(PoS)算法,以实现更节能的区块链系统。我们正在跟踪其他项目的研究如以太坊,也在调查多个候选方案如 Ouroboros。同样,社区也可以提出建议。

数字签名算法 我们使用 Ed25519,因为出于性能它选用“无可置疑?(nothing up my sleeves)参数”,而且它正在成为一个行业标准。

更基础的浏览器 API

ES6 类 用于清晰简单的面向对象设计。
Promises 和深受欢迎的 async/await 用于从回调地狱中逃脱。
ArrayBuffer 将区块链数据序列化为字节级,用于加密操作,网络传输和存储。

受 Web 平台限制精简协议

数据压缩

让 Web 用户下载千兆字节的区块链数据来建立共识是荒谬的。特别是在网络连接薄弱的情况下,就更加不可能了。因此,我们需要压缩数据,使得轻客户端可以在几秒钟内完成同步。

这里就是迷你区块链方案Mini-Blockchain Scheme)发挥作用的地方:它引入了账户树(Accounts Tree,一种 Merkle Patricia Tree),这种设计跟比特币的比起来具有多重优势:

  • 它简化了交易。终端用户不需要理解未花费输出的概念。它只包含一个帐户和一个结余。
  • 用户可以只下载区块链的头部数据加上其帐户结余的简单加密证明,其分解为下载几百千字节,而不会失去可信度和安全性。
  • 旧的块可以被丢弃,因为在帐户树中存储了完整的状态。
  • 纳米客户端(Nano clients)可以运用签名的检测点来使头部链保持固定大小。此外,取决于每个检测点的完整区块链将被提供下载,以便对这些检测点进行公开验证。我们将按照每个发展计划持续实现迷你区块链方案。
  • 很容易监听收支变化。

即时交易

基于“比特币闪电网络:可扩展的链下即时支付”(The Bitcoin Lightning Network: Scalable Off-Chain Instant Payments),Nimiq 实施哈希时间锁定合约(Hashed Timelock Contracts),以支持支付通道和可伸缩的即时链下交易。这解决了微支付之上的可扩展性问题。此外,它们能够进行原子交换(atomic swaps)用以跨链互操作。还有一些方法可以在闪电网络之上启用洋葱路由(onion routing),以一种类似于 Tor 浏览器的方式提供匿名性。

简易:没有脚本语言

简易性是构建安全系统的最佳的切入点。因此,Nimiq 的唯一特征就是 — — 从用户 A 到用户 B 可进行快速和安全的支付。 Nimiq 有意不包含脚本语言,因为以太坊已经比我们更好的解决了智能合约问题。我们不会试图在这个领域里竞争。我们希望与以太坊兼容,这样,如果 Nimiq 用户想使用以太坊的智能合约功能,就可以很容易。

“没有智能合约”方案有一个例外:对于闪电网络,将会有一个硬编码到协议中的哈希时间锁定合约。

区块链参数(初步方案)

  • 区块时间:1分钟(受到“工作量证明的区块链之安全与性能”(On the Security and Performance of Proof of Work Blockchains)启发)
  • 区块奖励:一开始50 Nimiq(NIM);每~20160区块减半。这个方案模仿比特币。(在测试网络中它是固定不变)
  • 最大块大小:1 MB
  • 难度调整:每10个区块
  • 总供应量:21 Mio 币除于1⁰⁸(就像比特币)

总结

Nimiq 推出了万维网(World Wide Web)原生的区块链技术。与传统的加密货币相比,这种方案大大降低了门槛,并将培育加密货币的大众化采用。

敬请关注

本文档还在进行中,并将定期更新。敬请关注:

关注我们的 Github 代码仓库
加入我们的 Slack 频道
加入我们的 Telegram 频道
关注我们的 Twitter
订阅我们的 Youtube

参考:https://medium.com/nimiq-network/nimiq-a-peer-to-peer-payment-protocol-native-to-the-web-ffd324bb084

注:我们有一个微信 Nimiq 交流群,如果想加入请加我微信,备注:Nimiq。

The Nimiq team thanks jonfish for its translation. You can find his original translation here.

--

--