Nimiq

作者:扎克-赫斯, Zack Hess

https://github.com/zack-bitcoin/amoveo-docs/blob/master/other_blockchains/Nimiq/17_10_17.md

2017年10月17日

Nimiq - 尼米克简介 #

Nimiq是一个正在用javascript编写的区块链。这意味着Nimiq浏览器钱包从一开始就能很好地工作。默认的钱包将是一个浏览器钱包。

Nimiq关注的用例是一个可扩展的支付系统。这个用例之所以好,是因为。

  • 它是巨大的,每年都有大量的钱被送来支付。
  • 它是如此简单的一个用例。Nimiq并没有比比特币多做什么。Nimiq只存储账户pubkeys和余额,远比那些存储任意状态的竞争对手简单。
  • 还没有人充分地解决这个问题,Nimiq可以有先发优势。

Nimiq正计划使用闪电网络来实现可扩展性。这也是Amoveo、比特币Hivemind、以太坊和其他公司正在使用的设计选择。通道已经被理解了。这不是一个研究问题,而是一个工程问题。其他可扩展性的解决方案,如分片,仍处于研究阶段。也许做分片是不可能的。总的来说,Nimiq通过使用闪电网络做出了正确的选择。

尼米克目前对通道的计划 #

与替代方案相比,HTLC通道有一些主要的缺点。

  • HTLC通道有一个问题,如果你通过同一通道进行多次闪电支付,而接受支付的人是离线的,那么内存和计算要求随着尚未接受的闪电支付的数量呈指数增长。你必须准备好N个付款的任何组合,要么成功,要么失败,这就是2^N个可能的结果。在HTLC风格的通道中,你需要为2^N种不同的可能性写出不同的合同,而且你和闪电中心都必须签署这些合同。
  • HTLC通道是一个hack,使账户像通道一样运作。这使得软件很脆弱,因为如果你试图改变账户或频道的工作方式,它就会同时改变它们。
  • 由于Nimiq使用的是账户的trie设计,而不是UTXO池,所以不清楚比特币式的HTLC通道如何运作。这些类型的通道通常依赖于引用UTXO来处理尚未被纳入任何区块的交易。如果Nimiq同时使用账户trie,和UTXO池,这是一个糟糕的组合,因为UTXO池使轻节点更糟糕,而且它是不必要的,所以我们在浪费内存。

更好的通道 #

Nimiq目前在merkle trie中存储账户。我们也可以在这个 trie 中存储通道。Nimiq可以使用6种不同的交易类型来编程一个理想的通道,不受必须同时作为一个账户的限制。我把它编入Amoveo。通道的代码大约是450行,翻译成nimiq的javascript应该不难。你可以重新使用你的账户数据库。

这个理想的通道的内存和计算要求只随着未完成的闪电支付的数量线性增加。所以它的扩展性非常好。

更好的轻节点 #

在比较轻节点设计时,比较最坏的情况是很重要的。在最坏的情况下,可能会有一个看起来有效的区块头由一个无效的区块组成。全节点可以警告轻节点关于无效的区块,但最终轻节点将不得不处理那一个区块,以查看哪一方的分叉是有效的。大多数区块链设计需要下载许多区块,只是为了验证一个区块。解决方案是,对于每一个区块,都应该有一种方法可以确定地计算出一个merkle证明,证明验证区块所需的所有数据。如果Alice的账户在一个区块中收到或花费了币,那么这个区块的merkle证明就必须证明Alice的账户在收到或花费币之前是什么样子。这样你就可以在不知道任何其他区块的情况下验证一个区块。这意味着我们需要在头文件中添加另一个哈希值。确定性的merkle证明的哈希值。这样,攻击者就不能通过让我们验证大量附着在有效区块上的略微无效的merkle证明来DDOS我们。