关键字:nodejs,区块链,比特币,udp
本文主要记录一个最近#在跳坑的边缘试探#的区块链系统开发过程,架构上并不复杂,参考了现存区块链系统的原理与算法,欢迎到github上提问:https://github.com/SteveWooo/swc
目录
1、网络层
网络层的目的是让所有节点结成一个非全连接的网络,让节点能主动把数据包发送到网络,然后网络把数据包传播给所有节点,实现节点之间能相互通信。
实现这个网络层主要使用了无状态的udp协议,要求网络中至少有一个部署在公网的节点。先定义几个概念
节点:普通入网设备(手机、计算机、嵌入式硬件)配置启动该软件,即为节点。
节点桶:指能和本地节点维持交换包状态的健康的其他节点栈。例如A节点刚登陆,节点桶为空,这时候如果收到B节点的包,就代表B节点为健康的节点,把B的IP端口压入节点桶。
心跳包:定期把节点桶中的内容,打包发送给桶中的所有节点。
数据协议:节点之间通信的协议(心跳包是其中一种
维持网络的主要流程如下:
1:启动公网节点,开放端口
2:普通节点发心跳包给公网节点
3:公网节点把普通节点压入节点桶
4:公网节点发送心跳包
5:普通节点收到心跳包中的新节点,压入节点桶
6:loop
消息传播方式:
1:普通节点创建消息,按照数据协议打包好
2:普通节点把数据发送给节点桶中所有节点,并写入缓存
3:节点收到数据包,根据数据协议校验正确后,转发给数据桶中所有节点(如果和缓存冲突,则不转发
2、数据协议层
数据层目的是规范节点之间通信的协议,在不安全的网络环境中签名与校验通信包的内容。这里涉及的概念主要有:
椭圆曲线验证算法:一种非对称校验的算法,用于签名校验。
目前设计的协议比较少,具体协议内容都在代码中可看到(block/create.js,trade/create.js)。主要有以下几个
心跳协议:
包含节点唯一id和节点桶,严格按照一定的时间间隔发出。
交易协议:
区块链数据的直接承载体。交易必须由交易创造者签名,每笔交易都需要被网络验证。
块协议:
交易的直接承载体。网络规定在一定的时间范围内产生区块(参考pow共识算法)。块需要生成者签名,每个块都需要被网络验证
3、持久层
持久层目的是存放,查询区块、交易的内容。
目前使用了简单的文件操作实现。