Nkn,让区块链改造共享的互联网

序言

在刚刚落幕的DoraHack全球黑客马拉松(Blockchain For Future)大赛上第一名和第三名获奖选手都运用了NKN刚发布一周的SDK!令我们更加惊喜的是,印度9岁编程女孩Shiry Sree Ju凭借基于NKN 网络开发应用的枪支管理和个人信息安全监测系统获得并列第一名的好成绩。开源社区的目的本身就是为了鼓励社区成员参与到其中,这也是NKN成立这个项目的初衷,基于区块链技术,建立一种开放、去中心化、社区共建共享的新型网络基础设施和生态系统,成为网络资源支付的一种通证。

NKN刚发布两周的测试网预览版演示

背景

区块链技术在经历比特币和以太坊两个重要发展阶段后,区块链正加速发展,凭借独有的经济模型创造出新的行业和产业机会,其中互联网就是NKN所要发力的领域。互联网的充分发展使得信息交换和转移变得极为便利。而其与区块链结合以后,会真正地激活价值互联网概念,从而使便利的价值和数字资产的交换和转移变成人们日常生活的一部分。

NKN要做什么

NKN是区块链驱动的一种开放,去中心化,社区共建共享的新型网络基础设施和生态系统。继以太坊区块链化计算能力, Filecoin/IPFS区块链化存储,NKN对信息基础设施的第三大支柱-网络传输-进行区块链化,创建新型区块链网络生态系统。直观来说,NKN将网络资源进行了数字资产化,通过独有的通证经济模型使得网络基础设施的使用和建设合二为一。因此,可以说NKN是第一个去中心化的数据传输交易所,能够处理大规模基于网络传输量的小额支付,服务于百万级用户。除此之外,还对传统电信行业技术的一些短板进行改进, 例如NKN将SDN区块链化, 它使网络运营商和企业能够根据实时性能和成本进行动态路由,降低数据传输的成本和提高整个网络的效率。

图1 区块链的第三支柱

NKN通过独有的解决方案,让不同区域的互联网设备可以互联互通,实现自主协同构建去中心化网络并实现规模化扩张。这种互联网并不受限于算力、存储等方面的限制,赋予互联网强大的扩展能力,实现真正的去中心化、开放、自激励、保障隐私和安全等。

NKN要怎么做

NKN网络由众多对等节点组成,并且每个节点只连接一些邻居节点。其网络的拓扑结构是动态且可验证的。任何节点都可以随时加入和离开网络而不会导致系统故障。数据包可以从任何节点以高效且可验证的路由传输到任何其他节点。NKN使用端到端加密的NKN地址标识网络中的设备,数据可以发送到客户端(只发送和接收数据,但不转发数据或参与协商一致),而无需公共或静态IP地址。

在数据传输过程中,转发工作负载通过中继证明(PoR)算法进行验证。PoR会随机选择一小部分固定的数据包作为证明。之所以要实现随机选择是为了保证这些证明可以被验证并且不能被预测或控制。证明将被发送到其他节点进行付款和奖励。

NKN网络中的每个节点既是转发节点又是共识参与者。只有使用独有的基于元胞自动机的共识算法与邻居进行通信,才能有效地达成大规模节点之间的共识。需要说明的是,在NKN系统中,为了防止分叉发生,每个块都必须达成共识。

设计原则概览

NKN要打造一个基于网络传输的区块链平台,要为整个互联网的生态系统提供服务,可以承载多样化的去中心化应用程序、改造传统电信业务模式、设计去中心化的软件定义网络SDN、赋能物联网以及垂直行业服务等。这些可以总结为NKN要成为解决去中心化和可扩展问题的互联网的中枢系统。由此,NKN提出了如下的设计原则:

  1. 真正去中心化。运用元胞自动机方法论打造一个对等的,真正分布式的互联网。

  2. 开放可扩展。无论何时何地, 任何设备都可以轻松接入NKN网络。

  3. 共享网络资源。参与者通过将闲置的网络资源分享给他人,从NKN系统中获得奖励

  4. 共建网络设施。NKN鼓励个体及企业部署设备为其它节点提供服务,在增强网络连

通性和吞吐量的同时自动结算来获益。

图2 去中心化的、开放的、可扩展的、社区共享共建的网络基础设施

设计架构概览

NKN技术的四个核心要素分别是去中心化数据传输网络(DDTN),中继证明(PoR),区块链共识和激励分配机制。 这些元素分别对应区块链基础设施叠层的网络层、共识层和激励层。通过NKN的精心设计可以提供高度可靠,安全和可扩展的网络区块链平台。

图3 NKN技术四要素

落实到工程层面,四要素可以扩展到七个部分,分别为

1.去中心化数据传输网络(DDTN)

  1. 中继证明(PoR)

  2. 共识和区块链

  3. 中继路径验证

  4. 可验证随机函数(VRF)

  5. NKN地址方案

  6. 挖矿经济模型

下面我们就来依次介绍一些这七个部分:

去中心化数据传输网络(DDTN)

去中心化数据传输网络(DDTN)对应到NKN区块链平台的网络层,它的功能是将任何数据传输到任何节点/客户端,无需任何中央服务器。

DDTN作为数据传输网络,可以包含数百万或更多的节点。因为每个节点可以随时加入或离开网络,网络是动态变化的。在这样的规模下,每个节点维护网络中所有节点的最新列表是不现实的。因此,NKN引入元胞自动机方法论,定义网络中的每个节点只连接并了解网络中称为邻居的有限几个节点。DDTN网络拓扑结构由邻居的选择决定。这对于性能和安全性至关重要。为了同时实现可扩展和安全性,NKN根据以下规则选择适当的拓扑:

  1. 网络保证连接性并且具有比较小的直径

  2. 仅使用关于邻居的信息保证任何节点之间存在有效的路由算法

  3. 在给定均匀分布的源和目的的随机流量的情况下保证节点之间负载是平衡的

  4. 邻居的选择是不可预测的,但可以验证以防止攻击

NKN使用改进的Chord分布式哈希表(DHT)的拓扑结构以保证可扩展性。每个节点在Chord环上都有一个m位随机地址。节点连接到一组具有特定距离的其他O(logN)节点,以便可以验证邻居的选择。任何节点对之间的路由平均为O(logN),最多为m,并且在给定拓扑的情况下具有确定性和可验证性。

其中,NKN网络中有两种主要类型的设备:节点和客户端。 节点是发送,接收和最重要的数据转发的设备。 客户端是仅发送和接收数据但不转发数据的设备。 客户端通过节点与NKN网络中的其它设备进行交互。节点是NKN网络的维护者和贡献者,从而获得NKN通证奖励。 节点需要有一个公共IP地址才能接收来自尚未建立连接的节点的消息。客户是NKN网络中的消费者,它们通过节点支付节点来转发数据或接收数据。 客户端不需要有公共IP地址,因为它将建立与节点的连接,然后通过它们发送和接收数据。

NKN网络中的每个节点和客户端都有一个0到2 ^ m-1之间的唯一m位NKN地址。节点和客户端共享相同的地址空间。 一旦节点或客户端加入NKN网络并具有NKN地址,则其他节点不再需要IP地址来发送流量。 相反,NKN地址是将数据包发送到节点或客户端所需的唯一信息。NKN网络在NKN网络中的作用类似于互联网中的IP地址。节点和客户如何选择NKN地址以及NKN地址方案的具体内容会在下面章节“NKN地址方案” 中进行详细介绍。

在NKN网络中,两个NKN地址之间的“距离”通过dist(x,y),其中x和y分别代表两个不同的NKN地址。

dist(x, y) = (y - x) mod 2^m

这个NKN地址间“距离”需要满足以下条件:

  • dist(x,y)> = 0
  • 当且仅当x = y时,dist(x,y)= 0
  • dist(x,z)<= dist(x,y)+ dist(y,z)
  • dist(x,y)= dist(x + a,y + a)

需要注意的是,NKN地址“距离”的度量是不对称的,使得dist(x,y)(从x到y的距离)通常不等于dist(y,x)。

有人会问,为什么NKN在网络中定义一个“距离”的概念呢?其实这是因为有了“距离”的定义,就可以进而定义网络的拓扑了。而网络拓扑对于NKN极为重要。例如:

  • 我们可以首先定义任何NKN地址x的后继节点和前继节点
  • 继节点(x)= argmin_y {dist(x,y)| y在所有节点}
  • 前继节点(x)= argmin_y {dist(y,x)| y在所有节点}

此处每一个NKN节点的后继节点和前继节点可以被类似地定义出来。这样一对相互的映射关系就可以产生出来了。例如:如果节点x是节点y的后继,那么y是x的前继。

为了符合元胞自动机方法论,NKN网络中的每个节点x都有几个邻居,可以根据以上关系定义为:

后继节点((x + 2^i) mod 2^m), 0 <= i < m

{y | x是y的后继节点}

由于不是所有的NKN地址都被分配给节点,所以上面的一些邻居指向相同的节点。 此处邻居被定义为对称的,如果y是x的邻居,x也是y的邻居。 一个节点的预期邻居数是O(log(N))。客户端通过节点连接到NKN网络的其它设备。NKN地址x处的客户端连接到前继节点(x)。 客户端仅通过与其所连接的节点建立的连接来发送和接收数据,因此不需要客户端公共IP地址。NKN网络中的客户端与Chord分布式哈希表中的密钥类似(除了连接到它的是其前继节点而不是后继节点)。尽管确实还有其他的分布式哈希表拓扑结构可以实现更高效的路由,但NKN的选择具有关键优势:即每个邻居的选择都可以由至少一个其他节点进行验证。 假设地址x处的节点应该选择A作为其第i个后继节点。 在这种情况下,在地址(x + 2 ^ i)mod 2 ^ m和A之间没有节点,并且A应该从它的前继节点知道这个信息。 因此A知道自己应该是x的邻居。 如果节点x不选择A作为邻居,则A能够伪造它。 同样,如果x选择A和(x + 2 ^(i + 1))mod 2 ^ m之间的另一个节点作为邻居,A也应该能够伪造它。 可验证性对于可能具有恶意节点的开放网络至关重要。 它大大降低了恶意节点选择特定邻居来共谋攻击系统的可能性。

如果你了解到了DDTN网络拓扑选择的原理,那么我们可以进一步介绍一下DDTN的路由技术。给定一个建立的NKN网络,路由可以通过只使用关于邻居的信息的greedy算法来实现。 当一个节点想要发送或转发一个数据包到一个目的地址时,它将数据包发送到距目的地址最近的邻居。 剩余距离至多为每次转发的先前值的一半,因此随着分组被转发而以指数或者更快的速度下降。DDTN路由与Chord分布式哈希表类似,给定均匀分布的地址的预期跳数为O(log(N))。在实际的DDTN工程设计中,NKN团队需要考虑各种的情况。例如: 如果目标地址是客户端而不是节点,则只要数据包到达连接到客户端的节点,上述路由就会停止。 然后节点通过建立的连接将数据包转发给客户端。但是无论如何,任何两个节点对之间的路由都是可验证的,这是NKN使用签名链技术设计一种有用的工作量证明(中继证明PoR)的大前提。NKN作为一条公链,这点也需要在设计时考虑的非常完备。 假设发送数据包到目的地址D的节点应当选择其邻居A作为下一跳,而它实际上选择了邻居B。从路由规则我们知道dist(A,D)<dist(B,D)。 然后A能够伪造路线。 如果节点选择非邻居节点作为下一跳,那么如前所述,这样的路由可能被实际邻居篡改。 路由的可验证性对于减少形成只包含恶意节点的路由的可能性至关重要。 有关实用的中继路径验证算法,我们在下面“中继路径验证”章节中会进行详细介绍。

除了网络拓扑和路由以外,NKN要打造一条基于网络的公链必然需要考虑开放性。这就需要一套NKN协议来定义节点的行为,例如节点/客户端加入,节点/客户端退出,信道保活(Keepalive)消息,网络维稳机制等。

因为NKN被定义为是一个开放的、去中心化网络基础设施。 也就意味着无论是否事先通知,节点或客户端随时都会加入和离开网络是不可避免的。 为了有效维护NKN网络,每个节点在本地维护三个列表:

  • 其后继节点和前继节点。 这至少需要一个后继节点和一个前任节点,同时在列表中保留更多节点可提高容错能力(具体原理可以参考NKN白皮书伊辛模型数学证明和仿真结果:https://www.nkn.org/doc/NKN_Whitepaper.pdf )。
  • 其邻居节点列表。
  • 连接到该节点的客户端列表。该节点更新这些列表以响应网络拓扑的动态变化。为了提高效率,重要的是当节点或客户端加入或离开网络时,其他节点中只有一小部分(最多O(logN))需要更新。NKN定义了以下协议来满足我们在动态环境中的目标。

表格1 NKN协议内容定义概览

设备行为 协议内容
节点加入 当一个节点想要加入DDTN时,它需要知道至少一个已经在网络中的其他节点。 我们为此提供引导服务器(其它来源也可以使用)。在其与DDTN中的至少一个其他节点取得联系后,它将执行如图4所示步骤。
节点退出 当一个节点想要离开DDTN时,它执行图5所示的步骤。如果节点退出违规(不执行上述过程而离开),其邻居会注意到这一点并将其从列表中删除。 连接到它的客户端在连接到新节点之前将连接到一个更新的节点上。
客户端加入 当地址x处的客户端想要加入网络时,它会与网络中的至少一个节点取得联系,并要求前继节点(x)获取它应该连接的节点。 然后它连接到前继节点(x)。
客户端退出 当客户端想要离开网络时,它会通知其连接的节点将其从客户列表中删除。如果客户端发生故障,其连接的节点会在连接失败时注意到这一点。 然后节点从列表中删除该客户端。
信道保活消息 每个节点周期性地向其邻居发送信道保活消息。 当一个节点接收到一个信道保持消息时,它发回它的后继节点和前继节点信息作为响应,用于维护每个节点上邻居的后继节点和前继节点。
网络维稳 节点定期地要求其后继节点/前继节点/邻居节点寻找其后继节点的前继节点和其前继节点的后继节点,以确保DDTN拓扑结构是正确的。

图4 NKN节点加入协议流程图

图5 NKN节点退出协议流程图

中继证明(PoR)

NKN中的一个关键问题是要证明一个节点中继了多少数据,也就是中继证明(Proof of Relay, PoR)。PoR对于NKN至关重要,因为被中继的数据量与NKN系统通证奖励直接相关。理想的证明应该满足以下条件:

  • 可验证的:任何参与数据传输的人都能够仅使用公共信息正确验证证明;
  • 不可伪造性:除非控制所有涉及的节点,否则没有一方能够伪造有效证明;
  • 不可篡改性:除非控制所有涉及的节点,否则没有一方能够修改有效的证明。

与比特币和以太坊挖矿不同,PoR是一个有用的工作证明:挖掘正在传递数据。PoR通过特殊的签名链进行实现。为了提高效率,PoR使用哈希签名链以不可控但可验证的方式随机选择样本。此外,PoR的特征还在于即使恶意攻击者控制了网络中大多数节点PoR也很难伪造。

NKN独有的通过签名链实现PoR机制的基础是NKN最主要功能之一就是是传输数据。 为了保证对应用程序透明,PoR适用于网络数据包。 数据包来自可以是节点或客户端的源节点,然后只能由至少一个节点进行转发,直至到达目的地。NKN中的基本传输单元是NKN数据包。NKN数据包的字段如表2所示。

表2 NKN数据包字段汇总

字段名称 是否属于数据头 是否属于签名链 是否属于数据包 是否上链
有效负载(网络数据包)
有效载荷哈希
有效载荷大小
随机数(Nonce)
源NKN地址和公钥
目的地NKN地址和公钥
签名链

由表2可知,签名链属于NKN数据包的一部分而且是NKN数据包中可能上链的那一部分。签名链是数据转发节点在转发NKN数据包时依次签署的签名链,如图6所示。 签名链中的每个元素都由以下字段组成:转发节点的NKN地址和公钥、下一个转发节点的NKN地址、和使用中继节点的私钥对前一跳节点有效数据的签名。

图6签名链结构示意图

根据图6所示可以看出,签名链的最大特点是具有可验证性。也就是说当且仅当最终签名链上的每个元素满足以下条件时,签名链才有效:

  • 转发节点的NKN地址匹配前一个元素中的下一跳转发节点NKN地址;
  • 签名字段是有效的。

除有效载荷(例如网络数据包)以外,对签名NKN数据包的任何修改都会使签名链无效,除非重新签名。 因此,签名链对任何有权访问NKN数据包的人都是可验证的(不需要有效载荷)。 恶意节点无法篡改或伪造签名链(除非拥该路由上的所有节点的私钥)。

当且仅当满足以下条件时,NKN数据包才有效:

  • 有效负载哈希值是正确的;
  • 有效载荷大小是正确的;
  • 签名链是有效的;
  • 源NKN地址和公钥与签名链的第一个元素匹配;
  • 目标NKN地址和公钥与签名链的最后一个元素匹配。

除非重新签名,否则对已签署的NKN数据包的任何修改都会使其无效。 因此,NKN数据包对任何人都是可验证的。 不需要额外的信息来验证NKN数据包。 恶意节点无法篡改或伪造NKN数据包(除非掌握沿路由所有节点的私钥)。

介绍到这里,我们已经做了充分的铺垫:NKN数据包,签名链及其可验证性设计。那么,画龙得点睛,是时候引出中继证明(PoR)机制了。如图6所, NKN使用移除有效载荷字段的NKN数据包作为路由中所有转发节点的中继工作证明(PoR)。 我们知道它可以满足可验证的,不可伪造的和不可篡改的要求,使得每个人都能够验证签名链的有效性,而没有人可以伪造或修改有效的签名链,除非他强大到可以控制系统指派路由中的所有节点的私钥。要做到这点几乎不可能,因为有效的系统路由一定是按照随机规则选取,一来这样做大大减小了共谋的可能,而且一旦发现共谋则该签名链会被立刻无效掉(无法参与共识)。除此之外,这些签名链不可能分叉,因为每个元素都包含下一个节点的NKN地址和公钥。 如果路由上的节点是恶意的,并且在生成签名时删除或修改链上某些先前的元素,则该链不再有效。 同样,如果一个部分签名的签名链被恶意方拦截,没有有效的签名链可以在没有指定的下一个节点的私钥的情况下生成。

考虑到要将PoR机制真正落地应用,必须要考虑其效率的问题。因此,每个NKN数据包都有一个证明,可用作收据来生成从源地址到转发节点的交易。但是,假如为NKN中传输的每个数据包而创建一个交易是及其低效率的做法。所以,PoR的设计考虑到了这点,并规定只有签名链上最后一个签名小于某个预定的阈值的数据包才有资格进行交易。因为签名链上的最后一个签名对每个人都是可验证的,但仍然是不可预测和不可控制的,除非包括源和目的地在内的所有沿途节点由同一方控制。考虑到有效载荷和完整路径,最后的签名本质上是确定性的,但如果没有沿路径的所有节点的私钥,就不能提前计算。使用理想的哈希函数,签名链上的最后一个签名在数据包中是随机的。因此,仅选择具有足够小的最后签名用于交易(具有调整后的每个数据包的价格)的NKN数据包不会改变转发节点的预期奖励,但引入了定价和奖励中的一些变化。这通过选择合理阈值来平衡对较少交易和较小奖励变化的需求。

与所有公链要面对复杂的开放环境一样,NKN需要在恶意攻击的情况保证PoR的安全性。只要至少一个节点的私钥保密,NKN数据包中的签名链就是不可预知和不可控制的。 但是,如果恶意方控制包括源和目的地的路由上的所有节点的私钥,则该方能够预测并创建有效的签名链和NKN数据包,而不实际传送该数据。 为了解决这个问题,NKN的设计区分了两类签名链。 一类是在数学上显示具有小概率被一方控制以用来获得更多的好处,例如挖掘奖励。 另一类没有额外的好处,因此创建此类签名链是徒劳的,会产生经济上损耗。如果想更多关于PoR安全的细节,可以参考NKN Github的wiki页面(https://github.com/nknorg/nkn/wiki)。 这里面包括如何设计安全的路径,基于会话的数据传输模式等内容。

共识和区块链

NKN的共识协议借鉴元胞自动机(伊辛模型)实现共识来提高网络的可扩展性。在NKN的白皮书中描述的使用多数投票元胞自动机(MVCA)算法在节点之间达成共识的数学证明以及仿真结果(https://www.nkn.org/doc/NKN_Whitepaper.pdf)。 在规模扩展性方面,MVCA在时间和消息数量方面都很有效,因为节点只需要其有限的邻居邻居之间的通信迭代就可以达成共识。通过类似Gossip的协议,共识所需的信息在共识开始时发送给所有参与节点,这个协议花费O(logN)时间,这是共识过程的主要时间成本。

MVCA共识算法通过由共识消息触发的事件驱动协议进行实现。 每个共识信息都有一个标识正在达成共识的主题ID。 对于从邻居收到的关于二元状态的每个共识消息执行以下过程:

  1. 如果它是带有主题ID的第一条消息,则计算自我初始状态并将状态发送给邻居。

  2. 更新主题ID的发件人状态。

  3. 如果超过一半的节点选择自身为邻居的具有来自自身状态的另一个状态作为主题

ID,则将自身状态改变为多数状态并将该状态发送给邻居。

主题ID的共识过程会在首次接收具有相同主题ID的消息后的一段固定时间后停止。 具体的细节可以参考NKN的白皮书,其中显示了MVCA算法的正确性和收敛性。

NKN中区块生产过程也很有特点。新区块通过首先选择提出新块的“记账人”添加到区块链中。 记账人的选择是不可控的,但可以验证。 节点被选为记账人的预期概率与安全路径上节点转发的数据成正比。 选定的记账人建议下一个区块并将其发送到网络进行确认。 如果达到了节点之间的共识,则建议的块将作为下一个区块添加到区块链中。

首先通过选择安全路径上的签名链来选择记账人。 被选择的签名链是具有最小值最后签名值的签名链。 如前所述,在恶意方控制了链中的所有节点之前,不能预测或伪造签名。 另一方面,任何恶意方都有可能控制安全路径上的所有节点。 这两个属性相结合保证了选择安全路径上最后签名最小值的签名链有效地随机选择安全路径上的签名链,并且选择不能由任何一方预测或控制。

为了选择具有最小值最后签名的签名链,签署最后签名的每个节点检查最后签名是否小于某个阈值。 如果最后一个签名小于该阈值,则节点将签名链发送给网络,作为最后一个最后签名的候选。 阈值的制定准则是要保证高概率并且最小值的最后签名小于阈值。 令t为以最大可能签名值为单位的阈值,并且签名从0到最大值均匀分布。 所有最后一个签名高于阈值的概率是(1-t)^ L,其中L是签名链的数量。 我们需要(1-t)^ L <e其中e足够小。 对于小t值,我们有t> - (log e)/ L。我们选择t = - (log e)/ L来最小化候选人的数量。L可以根据多个先前区块中的签名链的平均数量来估计。

节点在收到候选人后达成关于签名链选择的共识。 每个节点的最初选择是具有最小值最后签名的签名链候选人。 如果所有节点都收到相同的候选人,那么共识其实并没有发挥出作用,因为所有诚实的节点都会做出相同的初始选择。 否则,相同的签名链将由共识协议来保证。

当签名链的选择达成共识时,记账人便从该签名链中最终确定下来。 设S是签名链的最后一个签名。 签名链上的转发节点标记为从0到L-1,其中L是转发节点的数量。 然后,记账人就是签名链上具有标签(S mod L)的节点。

新区块由每轮选定的记账人进行提议。 被提议的区块被发送到全网所有节点进行验证和共识。 在协商一致阶段,每个节点向其邻居发送该块的哈希,并判断是否被接受。 当达成共识时,全网所有节点应该具有相同的被认可的区块,反之则无。 如果新区块被接受,该区块会被添加到区块链中。

中继路径验证

尽管签名链中的签名可以保证它是由所声明的中继节点签署的,但它们并不保证中继路径的正确性,如果路径是NKN的去中心化数据传输网络(DDTN)的指定路径,则路径被定义为正确。能够验证路径的正确性对于签名链的安全性至关重要,否则攻击者可以通过选择特定节点作为下一跳来打破每一跳通向随机节点的假设,并且恶意方可以完全构建签名链通过仅将数据包中继到受控节点来进行控制,以实现共谋攻击。由一方完全控制的签名链不再由该方不可预知,并且可由该方计算而不实际传送任何数据。然后,恶意攻击者可以通过生成更多的签名链来获得不公平的经济优势,从而增加获得挖矿奖励的机会。

任何中继路径的有效性应该是所有节点之间的共识,因为它是为每个区块选择全局唯一的挖矿节点的先决条件。NKN有两种方法可以达成共识:

  1. 节点使用已经达成共识的全局信息;

  2. 节点使用自己的本地信息,并在稍后达成共识。

RPV选择第一种方法,因为它不需要节点之间的额外通信,而且效率更高。这种方法的缺点是全球信息有时间延迟,因此拓扑结构可能与过去达成共识的时间不同。只要有效路径是唯一的或几乎唯一的,我们认为这是可以接受的,并且有效路径仍然存在,并将在验证时由诚实节点选择。

为了验证路径,我们验证路由上的每个节点是否将数据包转发到与其最接近目标地址的邻居,只考虑出现在最后X个块中的节点,其中X是可配置的。 更具体地说,在每跳中,假设节点NKN地址为x,则Chord虚拟环可以分成m个节段,其中节段i包含NKN地址在(x + 2 ^ i)mod 2 ^ m 和(x + 2 ^(i + 1))mod 2 ^ m。 如果段i中有任何节点,则段i中最靠近x的节点将是节点x的邻居。 同样,如果目标NKN地址位于段i中,则段i中最靠近x的节点应该是x应该发送数据包的下一跳。 实际上,验证路径的每个节点将检查:

1.下一跳确实在段i中

  1. 没有出现在最后X个区块中的节点在段i中并且比下一跳更接近于x。

如果满足这两个条件,则该跳是有效的。 如果每一跳都有效,则路径有效。 由于验证仅利用签名链中的信息和先前区块中的数据,因此接收签名链并具有先前区块信息的N每个节点都将产生相同的输出,从而确保验证的一致性。

可验证随机函数(VRF)

签名链中的签名需要满足以下条件:

  1. 只有密钥持有者才能生成有效签名,这样即使知道其他消息的有效签名,其他人也无法在不知道密钥的情况下计算消息的有效签名;

  2. 任何消息的签名都应该是唯一的,即只有一个签名对任何消息和密钥对都有效。

第一个属性(可验证性)保证签名确实由密钥持有者签名,而第二个属性(唯一性)防止转发节点为同一消息计算多个签名并选择具有最大优势(例如最小值签名)的签名。

尽管基于椭圆曲线的数字签名算法(例如ECDSA)提供可验证性,但它们不会为同一输入消息产生唯一的有效输出。 随机数(Nonce)可以自由选择以产生多个有效签名,并且验证者不知道或验证选择了什么随机数。 即使在某些确定性版本的ECDSA中,确定性地选择了随机数(例如,消息的哈希值),恶意节点仍然可以选择不同的随机数并为同一消息生成多个有效签名,而验证者无法知道是否在随机数中选择了随机数指定的方式。 相比之下,哈希函数提供了唯一性,但不能验证,因为任何人都可以计算输出。

因此,NKN使用可验证的随机函数(VRF)来计算签名链中的“签名”,因为它提供了可验证性和唯一性。 除了消息的输出(签名)外,它还产生验证签名所需的证据。 与签名算法类似,只有在密钥已知时才能计算有效签名。 与ECDSA不同,只有一个签名对于可验证的随机函数中的任何消息有效,尽管证明可能不是唯一的。

NKN地址方案

因为NKN网络中的设备类型分为节点和客户端两种,所以选择NKN地址时,节点和客户端有不同的方案。

为了实现系统安全性,节点的NKN地址需要保持随机性, 其原因有两个:

  1. 恶意节点很难选择特定的NKN地址。恶意节点一旦能够选择NKN地址则使其更容易以邻居的方式攻击系统,因为NKN的路由是基于NKN地址的。

  2. 随机性保证给定NKN地址的节点之间的负载更加平衡,有效地使网络更加分散。

为了保证NKN地址的随机性并防止恶意节点选择特定的NKN地址,当节点加入NKN网络时,使用唯一的,不可预知的,不可控的但仍可验证的功能来生成NKN地址。NKN在节点加入时选择公共IP地址和最新区块的哈希值的哈希值。

节点NKN地址=哈希(节点公共IP地址,最新块的哈希值)

Node NKN address = hash(Node public IP address, latestblock hash)

这样可以保证由其他节点可验证,但事先不可预知。

另外,客户端从节点有不同的NKN地址方案,并满足以下性质:

  1. 客户端NKN地址是永久性的,因此客户端可以在不同的物理网络中从同一个NKN地址接入;

  2. 客户端NKN地址与其公钥相关联,以避免NKN地址冲突,使其他客户端无法接收发送给它的数据包。

NKN选择这样的方案,使得客户端NKN地址是由类似url的NKN地址字符串计算的,该字符串由客户端选择的任意字符串及其公钥

客户端NKN地址=哈希(“任意字符串.客户端公钥”)

Client NKN address =hash("arbitrary-string.client-public-key")

在NKN地址字符串中,由点分隔的最后一个子字符串表示客户端的唯一身份(客户端公钥),类似于url中的根域; 其余的由客户端选择,类似于url中的子域名。这样的方案满足上述两个属性。另外,用户(密钥对持有者)可以生成尽可能多的NKN地址,因为他希望共享相同的帐户(密钥对)。

客户不直接分发他们的NKN地址。相反,客户端将其NKN地址字符串分发给节点或其他客户端,并且它们在本地计算客户端的NKN地址,以便他们同时知道客户端的NKN地址和公钥。使用这样的方案,任何客户端之间的端到端加密很容易实现。

挖矿经济模型

NKN通证总数量是十亿。 在主网启动时创世区块会产生70%的nkn。 其余30%将由传输网络挖矿产生,25年内年产量线性递减, 如图7所示。NKN通证产量(Q)的年供应量(单位为百万)根据时间变量 “T” 进行分配,按照以下公式进行挖掘:

因为NKN通证总量有限而且采矿产量随时间呈线性下降。 这部分挖矿发行通证的机制时为了激励社区早期参与NKN网络的共建共享。NKN通证的成本由客户和矿工之间的出价决定(类似于以太坊系统费用); 因此,NKN通证的市场价格变化不会影响数据传输交易或数据转发费的等效价格。

图7 nkn年采矿量供应曲线与时间的关系

构建生态体系

NKN的生态体系有三大目标:

  1. 超级开放性。无论何时何地, 任何设备都可以轻松接入NKN网络。

  2. 共享网络资源。参与者通过将闲置的网络资源分享给他人,从NKN系统中获得奖励。

  3. 共建网络设施。NKN鼓励个体及企业部署设备为其它节点提供服务,在增强网络连通性和吞吐量的同时自动结算来获益。

因此,NKN生态系统具有四大要素:网络设备、网络基础设施、互联网服务供应商和去中心化应用程序, 如图8所示。

图8 NKN生态系统要素及NKN在其中体现的价值

在改造传统网络基础设施方面,NKN注重以自身区块链技术优势和传统电信和互联网展开合作。近期,NKN加入了由Facebook, 德国电信, 英特尔,西班牙电信, 诺基亚, 沃达丰和英国电信创立的电信联盟组织TIP。NKN将在Edge Computing Group、OpenCellular Group和TIP(TelecomInfra Project)Community Labs等工作小组中担任重要角色。NKN在网络传输领域与区块链结合创新的经济激励模型会促进TIP联盟中的成员更快更广泛地接受技术创新。

另外NKN也是开放网络基金会ONF(Open Networking Foundation)成员。ONF是由AT&T、Google、Comcast、德国电信、NTT和土耳其电信等电信行业巨头组成的非营利性组织,旨在将开源创新技术引入正式的商业部署。该组织最重要的工作之一就是SDN(Software Defined Network,软件定义网络)新商业模式和应用场景的研究和探索,这与NKN提出将SDN和区块链结合的创新模式不谋而合。NKN将会重点参与ONF的以下项目:SDN, ONOS,CORD,P4/Stratum,和其他重大相关项目实验和落地。

技术路线图

图9展示了NKN最新的技术路线图,可以分为测试网和主网两个阶段。 现在已经在NKN官方网站上线的是v0.1 Firefox (https://youtu.be/0Kluy9YjTVI),作为不断演进的测试网的第一个版本(http://preview.nkn.org/)。这意味着NKN会在2019年1月之前上线全功能测试网。而且NKN主网的早期版本将于2019年3月发布并在明年6月正式上线,这比我们之前的计划整整提前了3个月。

图9 NKN技术路线图

如图9所示,该技术路线图开始于2018年5月,这个阶段的主要任务是开发去中心化数据传输网络(DDTN)、中继证明(PoR)和元胞自动机子系统的最小可实现原型(MVP),其中包括:

  • 完成了基于Chord分布式哈希表(DHT)的去中心化数据传输网络(DDTN)的初步设计。
  • 完成了中继证明(PoR)的初步设计,作为去中心化数据传输网络的有用工作证明(PoW)机制。
  • 完成了基于元胞自动机(CA)的共识机制的初步设计。
  • 构建NKN的基本区块链基础设施。

现在NKN处于测试网开发阶段,发布0.1版本测试网,代号“Firefox”:2018年6月16日。第一个测试网包含所有核心子系统,实现全球节点上正常工作并且可以进行实时测试。此阶段的主要任务有:

  • 发布基于Chord 分布式哈希表技术的去中心化数据传输网络的设计及其初级技术实现原型。
  • 发布中继证明(PoR)的设计及其初级技术实现原型。
  • 发布基于中继证明和元胞自动机的共识算法的公有链设计和初级技术实现。
  • 上线具有数据传输能力和中继证明的区块链系统原型。
  • 区块链系统原型测试网拥有15个节点部署在全球15个地区。
  • 开发图形用户界面(GUI)的客户端以提供网络连接和用户交互。
  • 公布可以进行去中心化应用程序(dAPP)实验的软件开发套件(SDK)预览。

下一个阶段是在2018年8月发布0.3版本测试网,代号“Lemur”:优化系统可扩展性和效率,SDK 的alpha版本。此阶段的主要任务有:

  • 优化NKN系统设计以提高可扩展性和效率。
  • 进一步开发和完善NKN核心系统。
  • 为其它应用程序开发NKN的公共协议和接口,包括去中心化应用程序(dApps)。

在2018年10月,NKN会发布0.5版本测试网,代号“Koala”:增强抗攻击能力,更大规模的测试网络,以及SDK Beta版本。此阶段的主要任务有:

  • 引入防攻击机制,防止恶意攻击和共谋攻击。
  • 用数百个节点构建测试网络进行测试和演示。

在2019年1月,NKN会发布0.7版本测试网,代号“Meerkat”:全功能测试网络,完整的实施和性能,以及SDK 1.0版本。此阶段的主要任务是推出具备全功能的NKN 测试网,包括容错,数据传输和路由,中继证明,以及完整实现的共识算法。 该共识算法可实现大规模网络中的快速收敛。

2019年3月, NKN结束测试网阶段发布0.9版本主网,代号“Beluga”, 此阶段的主要任务包括:

  • 根据测试网的状态进一步开发和改进NKN核心系统,以准备主网上线。
  • 基于NKN生态系统开发网络密集型去中心化应用程序(dApp)。

最后,NKN会在2019年6月正式发布1.0版本主网,代号“Narwhal”,主要包括:

  • 正式启动NKN 主网
  • 正式启动NKN生态系统

结语

NKN是将下一代网络技术提供给其他领域的通用网络层基础设施。这是使用区块链技术改变互联网的战略探索和创新。 高度可靠,安全和去中心化的互联网对于我们至关重要,这样每个个人和每个行业都可以在数字世界中充分发挥其潜力。NKN将为实现完全去中心化的点对点系统提供巨大的潜力,使互联网更加高效,可持续并且安全。当前互联网在网络中立性、资源使用率、过度依赖中心控制容易造成单点故障方面显得力不从心。现在是时候重建我们真正需要的新互联网,NKN让区块连技术重塑未来的互联网,让我们拭目以待。

关于NKN

Home: https://nkn.org/

Email: [email protected]

Telegram: https://t.me/nknorg

Reddit: https://www.reddit.com/r/nknblockchain/

Twitter: https://twitter.com/NKN_ORG

Medium: https://medium.com/nknetwork

Github: https://github.com/nknorg