开源的世界,带你走进nkn系统

什么是NKN?

NKN是区块链驱动的一种开放,去中心化,社区共建共享的新型网络基础设施和生态系统。NKN的意义在于其视数据传输能力为一种有价值的资源,其价值在于数据传输能力的用途(为社区扩展网络连接范围和提高数据传输能力)。 NKN通证一部分用于初始的生态建设,另一部分则是依据特定算法,通过大量的网络数据传输产生,通过这种混合的发行模式促进新一代互联网的建设和使用。NKN直观上是一个网络数据传输的交易所,它使用整个点对点网络中众多节点构成的分布式数据库来确认并记录有效的网络传输交易行为。NKN通证能够让用户在一个去中心化的、点对点的网络中完成数据传输资源的数字资产化和支付,其独特的地方在于不需要一个中央的清算中心或者电信机构对数据传输交易进行清算。用户只需要互联网连接以及NKN软件就可以向另外一个公开的账户或地址进行支付操作。

为什么开源?

NKN开源意味着这个软件的所有源代码都是公开的。一个懂代码的程序员,可以拿到NKN的所有源代码,并读懂它的逻辑,编译出可以运行的软件,也可以对这些源代码进行修改后,编译出新的软件。

因为NKN的核心软件是开源的,这就意味着这个软件没有任何秘密。任何人都可以检查这个软件的内部实现逻辑来判断它是否有漏洞,是否藏有木马,或者后门。这是为了说明这个软件是没有被人控制的。 而且后续软件代码的演进和升级也都是清清楚楚的。这样做的目的是为符合公有链的基本特性,有助于NKN社区在这种公开、透明的环境下共同使用NKN网络,共同建设NKN生态系统,共同拥有NKN网络。

(NKN Github:https://github.com/nknorg)

NKN代码仓库概述

从技术上来说,NKN由全球分布的众多节点组成。 每个节点只连接其邻居节点。(一个真实的NKN测试网络会在近期发布) 数据包可以从任何节点以高效且可验证的路由转发到任何其它节点。 数据可以通过永久的NKN地址加密发送到任何没有公共或静态IP地址的客户端。

NKN网络中有两种主要类型的设备:节点和客户端。节点是发送,接收和最重要的中继数据的设备。客户端是仅发送和接收数据但不中继数据的设备。客户端通过节点与其它参与者进行交互。节点是NKN网络的维护者和建设者,通过有用的工作量证明可以获得系统的NKN通证奖励。节点需要有一个公共IP地址才能接收来自尚未建立连接的节点的消息。客户端是NKN网络中的消费者,它们通过支付节点来享受中继数据或接收数据的服务。客户端不需要有公共IP地址,因为它将建立与节点的连接,然后通过它们发送和接收数据。这种设备类型的区分是为了防止点对点(P2P)网络中固有的“搭便车”节点频繁进出网络造成的稳定性问题。因此,选择NKN地址时,节点和客户端会有不同的方案。整体来说NKN希望通过区块链的通证经济模型来鼓励客户转换为节点,促进网络的共建共享。

在NKN系统中, 为了防止分叉,每个区块都要达成共识。因为节点既是数据转发者又是共识参与者,所以节点间使用基于元胞自动机的共识算法与邻居进行通信,并有效地达成大规模节点之间的共识。数据传输的中继工作量可以通过中继证明(PoR)算法进行验证。PoR随机选择一小部分固定的数据包作为证明,被发送到其它节点进行付款和奖励。因此其具备可以被验证但是不能被预测或控制的特点。

基于以上的功能描述,NKN核心代码仓库的技术亮点包括:去中心化数据传输网络(DDTN)、可扩展的元胞自动机共识机制(MVCA )、有用的工作量证明:中继证明(PoR)、中继路径验证(RPV)和NKN地址方案。下面就让我们依次介绍一下。

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

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

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

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

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

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

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

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

基于元胞自动机的MVCA共识算法

在中心化的电子转账和交易系统中,是由一个权威中介(middleman)作信用背书来确定交易的有效性。例如,电信行业中电信运营商就充当的这个角色,由电信运营商来证明一个数据传输带宽交易的有效性。

因为NKN没有中介或者说没有中心化的角色,又是谁来确认网络传输带宽交易的有效性呢? 在去中心化的NKN网络里,达成共识就有点类似于我们选举一样,由大家来投票表决,得票最多的数据传输交易,就会被认定为一个合法的交易。没有了权威中心,好像缺乏信用,然而由投票产生的交易,却是最值得信任的。所以,NKN是去中心化的网络,符合最初互联网概念的设想,也被社区成为“新互联网”。

值得一提的是NKN这种投票共识机制并不是像拜占庭协议那样需要全局性的投票,而是创新性的采用了基于元胞自动机的伊辛(Ising)模型投票机制或者称之为 ”多数投票元胞自动机”(MVCA)算法。这种共识算法可以实现高度可扩展,可以支持数百万甚至数十亿个节点的网络规模(区块链可扩展性通常包含两层面含义:一是交易速度,二是网络规模,此处仅指后者)。MVCA共识算法在NKN的白皮书里有详尽的描述和数学证明 (https://www.nkn.org/doc/NKN_Whitepaper.pdf ) 。简言之,MVCA在共识时间和消息数量方面都很有效,因为只需要几个邻居之间的通信迭代就可以达成全网共识。通过Gossip协议,共识所需的信息在共识开始时发送给所有参与节点,这个协议花费O(logN)时间 (N为全网节点数量,k为邻居数量),这是共识过程的主要时间成本。

中继证明 (PoR)Proof of Relay (PoR)

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

(1)可验证的:任何参与数据传输的人都能够仅使用公共信息正确验证证明;

(2)不可伪造性:除非控制所有涉及的节点,否则没有一方能够伪造有效证明;

(3)不可篡改性:除非控制所有涉及的节点,否则没有一方能够修改有效的证明。

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

简单来说,PoR签名链是中继节点在中继数据包时依次签署的哈希链。签名链的原理就是在一个活跃的通信信道内的参与各方按照时间戳的顺序组成一条签名链,而这条签名链的哈希值包含了多个0,活跃的信道在进行数据传输时以一种类似于穷举的办法来找到这个符合要求的哈希值(哈希值小于某个阈值)。如果NKN系统要求的签名链哈希值中,随着0的数目增多,PoR工作量则呈现指数级增长。一旦矿工节点找到了这个符合条件的签名链,也就确定了一个数据块,根据数据块的哈希进行一定的运算就可以在参与签名链的节点中选出记账人。 因此,这个可验证的数据块具有确定性。除非对数据块进行一定的工作量运算,否则,数据块是无法更改的。由于哈希算法是一种穷举法,如果NKN网络上的诚实节点数量超过约2/3 ,基本上攻击者想伪造一个交易成功,它必将成功几率很低。

从结构上来说NKN的签名链由元素串联而成,而每个元素由下面字段组成:

( 1 ) 中继节点的NKN地址和公钥

( 2 ) 下一个中继节点的公钥

( 3 ) 使用中继节点私钥签署的签名

NKN使用移除有效载荷字段的NKN数据包作为路由中所有中继节点的中继工作证明。 它满足可验证的,不可伪造的和不可篡改的要求,使得每个节点都能够验证签名链的有效性,而没有人可以伪造或修改有效的签名链,因而无需控制路由中的所有节点。

另外,签名链不会出现分叉,因为每个元素都包含下一个节点的NKN地址和公钥。 如果路由上的节点是恶意的,并且在生成签名时删除或修改链上某些先前的元素,则该链不再有效。

NKN在PoR的设计也考虑到了效率的问题。每个NKN数据包都有一个证明,可用作验签从源节点到中继节点间交易的收据。但是,为NKN中传输的每个数据包创建一个交易是低效的。因此,PoR规定只有签名链上最后一个签名小于阈值的数据包才有资格进行交易。这样设计是因为签名链上的最后一个签名对每个人都是可验证的,但仍然是不可预测和不可控制的,除非包括源和目的地在内的所有沿途节点由同一方控制。考虑到有效载荷和完整路径,最后的签名本质上是确定性的,但如果没有沿路径的所有私钥,就不能提前计算。

由此可以看出在PoR算法中,记账人候选投票并不是一个人/IP地址一票,而是一个签名链(活跃的信道)一票。那么,如果一个人想控制NKN,他必须有足够多的活跃信道,那么当NKN的规模越庞大,控制就越难。就好比一个人也许可以很容易的控制有限数量的选票,而当选票规模越大,控制就越难。

另外,在一个对等网络中在做这种投票工作,假设工作量很小的话,那么确认交易仅需要少量的数据传输能力就可以完成了,这会导致伪造这种交易。 所以,NKN引入了PoR机制对一个交易进行证明。这个过程需要耗费一定的数据传输能力和时间,一旦数据传输成功,那么就确定了一笔交易。而反过来,对于其它节点来说,只要进行一个很简单的运算,就可以知道这个交易是真实的,还是假冒的。这种PoR机制,就好比在现实生活中,国家花费大量精力对钞票进行防伪设计,而普通的民众,只需要对钞票进行简单的辨认,就可以识别真假。

传统的比特币的工作量证明因为并不是出每个块之前都会达成共识,所以即使无恶意节点也会天然产生分叉。与此不同的是,NKN中的每个区块都会共识,所以NKN天然不会分叉,只有在一个节点被恶意节点包围了的情况下才会分叉,而且这个分叉是局部的,只有被包围的节点那里才可能有。然而,这种分叉产生以后,比特币的工作量会选择较长的链;NKN由于天然不会产生分叉,(局部)出现分叉则说明被攻击了,被攻击的节点需要重新加入网络以摆脱恶意邻居的影响来获取正确的区块链数据。

最后,比特币由于天然会分叉,所以才需要等待一段时间来确认交易,NKN不会天然分叉,所以不会有这个问题。在NKN的系统里只要出块了,并且从网络中随机抽样选取一些节点确认后(来避免某个节点被攻击),直接即可确认交易,无需额外的延迟,这是NKN的优势。

中继路径验证(RPV)

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

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

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

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

RPV选择第一种方法,因为它不需要节点之间的额外通信,而且效率更高。这种方法的缺点是全球信息有时间延迟,因此拓扑结构可能与过去达成共识的时间不同。只要有效路径是唯一的或几乎唯一的,我们认为这是可以接受的,并且有效路径仍然存在,并将在验证时由真实节点选择。RPV算法保证每一跳都是有效的。因为只有每一跳都有效,则路径才是有效的。由于验证仅利用签名链中的信息和先前块中的数据,因此接收签名链并具有先前块信息的网络中的每个节点都将产生相同的输出,从而确保验证的一致性。

嵌入公钥的NKN地址方案

节点的NKN地址需要保持随机性有两个原因。

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

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

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

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

Node NKN address = hash(Node public IP address, latest block 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开源的意义在于获得社区的共识,这点是公有链的特点,这种共识才是区块链的意义所在。比特币的价值在于其用户和生态系统,NKN的价值也在于其用户和生态系统。开源是NKN团队对于自己技术自信,对于社区建设自信的表现。只有坦诚、透明的将技术公开,才能获得社区的认可,只有社区认同NKN的价值,项目才能走的长远。

关注我们

Home: https://nkn.org/

Email: [email protected]

Telegram: https://t.me/nknorg

Twitter: https://twitter.com/NKN_ORG

Medium: https://medium.com/nknetwork

Github: https://github.com/nknorg