前言Neo反对C#和java研发,在全球社区的共同努力下现把SDK扩展到了js,python等编程环境,所以展开Neo研发是没过于大的语言障碍的。比特币在解决问题拜占庭错误这个问题时除了引进了区块链这个最重要的概念之外,还引进了工作量证明(PoW)这个落后的解决方案,通过数学意义上的难题来确保每个区块创立都必须代价计算出来量。然而实践中已证明,通过计算出来来获取工作量证明,觉得是过于浪费了:全世界所有的几乎节点都展开某种程度的计算出来,然而只有一个节点计算出来出有的结果不会被加到到区块链中,其余节点计算出来消耗的电力都白白浪费了。特别是在,工作量证明不存在一个51%的有可能反击方案,即只要有人掌控了世界上多达50%的算力,他就能对比特币系统展开反击,重置区块链。
中本俊先生发明者这个算力工作量证明方法时,大约没预料到不会有人专门为了挖矿而研发ASIC矿机。Neo在解决问题这些问题时明确提出了一个新的共识机制概念dBFT( Delegated Byzantine Fault Tolerant),将节点分成两种,一种为不参予共识的普通节点,即不展开证书交易亲笔签名区块的过程。另一种为共识节点,即可以参予共识的节点,这部分基础概念可以参照官方文档。
接下来,我将从源码层面分析Neo网络通信协议。源码概览本文分析的源码地址:https://github.com/neo-project/neo通过git命令iTunes到本地:git clone https://github.com/neo-project/neo.git我用的编译器是VS2017社区版。关上Neo项目后可以看见项目根目录文件结构:- Consensus 共识节点间共识协议- Core Neo 核心- Cryptography 加密方法- Implementations 数据存储以及钱包的构建- IO Neo 的io类- Network 用作p2p网络通信的方法- SmartContract Neo 智能合约的涉及类整个项目代码量远比相当大,特别是在是项目本身是C#高级语言撰写,所以代码很更容易背诵。
消息在Neo网络中,所有的消息都以Message为单位展开传输,Message的定义在Message.cs文件中,其结构如下:Magic 字段用来确认当前节点是运营在月网络还是在测试网络,如果是0x00746e41则为月网,如果是0x74746e41则为测试网。_Command_命令的内容是必要用于的字符串,所以没展开严苛定义,在所有用于到的地方都是必要用于的字符串。
我指出倚赖比较严重,应先定义好命令再行在别的地方调用。虽然没说明都有哪些命令,但是在消息路由的代码里,我们可以寻找所有用于到的命令。源码方位:neo/Network/RemoteNode.cs/OnMessageReceived以上源码中关于命令的处置部分不是本小节辩论的重点。
通过分析代码可以告诉,消息种类大体有22种。消息的具体内容在序列化之后不存在在Message里的payload字段中。在所有的消息类型中有一类消息十分类似,与账本涉及的三种消息:账目消息(Block)、共识消息(Consensus)以及交易消息(Transaction)。
这三中消息分别对应系统中的三个类:- neo/Core/Block- neo/Core/Transaction- neo/Network.Payloads/ConsensusPayload这三个类都构建了模块IInventory,我把inventory翻译成为账本,把构建了IInventory模块的类沦为账本类,消息称作账本消息。IInventory接口定义了消息的哈希值Hash用来存放在亲笔签名、账本消息类型InventoryType用来留存消息类型以及一个检验函数verify用来对消息展开检验,也就是说所有的账本消息都必须包括亲笔签名,并且必须检验。账本消息的类型定义在InventoryType.cs文件中:源码方位:neo/Network/InventoryType.cs每个RemoteNode内部都有两个消息队列,一个低优先级队列和一个低优先级队列,低优先级队列主要负责管理:- "alert"- "consensus"- "filteradd"- "filterclear"- "filterload"- "getaddr"- "mempool"这几个命令,其余的命令都由低优先级队列负责管理。发送到命令的任务由StartSendLoop方法负责管理,在这个方法中有一个while循环,在每一轮循环中都会首先检测低优先级队列否为空,如果不为空则再行发送到低优先命令,否则发送到低优先级任务,循环中的核心源码如下:源码方位:neo/Netwotk/RemoteNode.。
本文来源:九游会j9-www.njmaxs.com