基于加密数字资产云尊币技术解析
扫描二维码
随时随地手机看文章
云尊币(WC)一一是一种以区块链为底层安全技术的加密数字资产,它的发展趋势和价值将随着时间的推移而日益彰显。云尊加密数字资产的发行量源于庞大的经销商数量和可循环的绿色生态系统,目前得到了全球各地的忠诚支持者支持 。
云尊币满足了所有这些需求,它消除了巨大的算力和处理在工作证明所带来的竞争。云尊币是一款采用了工作证明(POW)和权益证明(POS)双重共识机制的加密数字资产,它由加密技术(SCRYPT) 作为保证的,由区块链中的分布式节点维护,允许用户在网络上进行点对点交易,而不受任何企业、中介或人为因素的干扰。
云尊币技术架构
基于区块链的应用要可靠落地 , 我们认为需要将传统技术体系基于区块链系统进行整合,让区块链技术恰当的融入到平台。 区块链技术的安全、不可篡改等特性, 保证了去中心化可靠性,成熟技术的有序结合也保证了系统性能稳定流畅。
传统银行系统里的电子交易通常是可逆的,如果有人窃取你的信用卡金额,你可以对这项交易提出质疑,在大多数情况下损失是由银行或商家承担,消费者不用自掏腰包。这对消费者而言十分方便,但却要求金融系统必须是一个相当严谨的诚信网。允许一个新成员加入就给其他每位成员增加了风险。所以当前的金融机构不愿与不知名或资本不雄厚的电子商务网站对接,这也是可以理解的。云尊币就不一样了,由于交易是经过密码认证的并且不可逆,所以没有必要对接入该网络加以限制。接受毫不相识的人的付款也没有风险。这意味着,作为一个基于云尊币的商家或者金融中介的门槛将会降低,使诚信的从业者更容易的加入商务活动,而各种隐含欺诈动机的行为无法得以实施。接受云尊币也可使商家避免许多管理间接费,使交易得到更多的保障。
1、云尊币数据层
云尊币的区块链数据存储系统是由关系型数据库(sqlite)和 kv 数据库组成,其中关系型数据库用来存储区块头信息和每笔交易的具体信息, kv 数据库主要存储区块头、交易和状态表序列化后的数据。
这样处理的主要目的是单纯在查询区块头信息和具体每笔交易的时候,可以直接从关系型数据库中查找;而要构造整个区块数据的时候,除了从关系型数据库构造区块头信息外,还要依据区块头里的交易根哈希和状态表根哈希从 kv数据库中获取具体的交易和状态表信息。
区块头信息的序列化具体步骤:
交易的序列化具体步骤:
下表分别是 Ledgers 和 Transactions 表结构。
1、1 关系型数据库(sqlite)的特性
关系型数据库(sqlite)诞生于 2000 年 5 月。作为一个自包含的、基于文件的数据库,SQLite 提供了非常出色的工具集能够处理所有类型的数据,与托管在服务器上基于进程的关系型数据库相比它的约束更少,也更易用。
这是一款轻型的嵌入式数据库,它占用资源非常的低,在嵌入式设备中,可能只需要几百 K 的内存就足够了。它的处理速度比 Mysql、PostgreSQL 这两款著名的数据库都还快,sqlite 还具
有以下特性:
•零配置,无需安装和配置
sqlite 的核心引擎本身不依赖第三方的软件,使用它也不需要“安装”。所以在部署的时候能够省去不少麻烦。
•储存在单一磁盘文件中的一个完整的数据库
数据库中所有的信息(比如表、视图、触发器、等)都包含在一个文件内。这个文件可以 copy 到其它目录或其它机器上,也照用不误。
•数据库文件可以在不同字节顺序的机器间自由共享
sqlite 支持多种系统,除了主流操作系统,QLite 也支持了很多冷门的操作系统。例如对很多嵌入式系统(比如 Android、Windows Mobile、Symbin、Palm、VxWorks 等)的支持。SQLite生成的数据库文件可以在各种智能设备进行移植,为云尊币普及到其他智能设备提供了基础。
•足够小,全部源代码大约几百 KB,能够实现在轻便的智能设备中运行。
•比目前流行的大多数数据库对数据的操作要快。
1、2 sqlite 数据库工作原理
qlite 主要由 7 个构件子系统(也就是模块)组成,这些模块被分割为前端解析系统和后端引擎。
前端:
前端预处理应用程序传递过来的 SQL 语句和 SQLite 命令。对获取的编码分析,优化,并转换 为后端能够执行的 SQLite 内部字节编码。前端可分为三个模块。
•标示分析(Tokenizer):将输入的 SQL 语句分成标识符。
•语法分析(Parser):解析器分析通过标识器产生的标识分析语句的结构,并且得到一颗语法树。解析器同时也包含了重构语法树的优化器,因此能够找到一颗产生一个高效的字节编码程序的语法树。
•代码生成器(Code Generator):代码生成器遍历语法树,并且生成一个等价的字节编码程序,前端实现了sqlite3_prepare API 函数。
后端:
后端是用来解释字节编码程序的引擎。该引擎做的才是真正的数据库处理工作。后端部分由四个模块组成。
•虚拟机(VM):VM 模块是一个内部字节编码语言的解释器。它通过执行字节编码语句来实现 SQL 语句的工作。它是数据库中数据的最终的操作者。它把数据库看成表和索引的集合,而表和索引则是一系列的元组或者记录。
•B/B+树:B/B+树模块把每一个元组集组织进一个一次排好序的树状数据结构中,表和索引被分别置于单独的 B+和B树中。该模块帮助 VM 进行搜索,插入和删除树中的元组。它也帮助 VM创建新的树和删除旧的树。
•页面调度程序(pager):页面调度程序模块在原始文件的上层实现了一个面向页面的数据库文件抽象。它管理 B/B+树使用的内存内缓存(数据库页的),另外,他也管理文件的锁定,并用日志来实现事物的 ACID 属性。
•操作系统交界面(system interface):操作系统界面模块提供了对应于不同本地操作系统的统一交界面,后端实现了sqlite3_bind_*,sqlite3_setp,sqlite3_coloumn_*,sqlite3_reset 和 sqlite3_finalize API 函数。
关系型数据库的特点能够满足云尊币在轻便智能设备中运行的要求,并且能够在多种技术架构的的操作系统中进行移植,而无需很大的改动,这保证了云尊币在普通群体的能够快速的推广和普及。
2、加密算法
数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码。目前区块链一般常用的加密算法有对称加密、非对称加密、公私匙、Hash 算法等
等。
对称加密:对称加密是最快速、最简单的一种加密方式,加密(encrypTIon)与解密(decrypTIon)用的是同样的密(secretkey)。对称加密通常使用的是相对较小的密钥,一般小于 256bit。密钥的大小既要照顾到安全性,也要照顾到效率,是一个 trade-off。
非对称加密:非对称加密为数据的加密与解密提供了一个非常安全的方法,它使用了一对密钥,公钥(public key)和私钥(privatekey)。私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。非对称加密使用这对密钥中的一个进行加密,而解密则需要另一个密钥。
私钥(private key):非公开,是一个 256 位的随机数,由用户保管且不对外开放。私钥通常是由系统随机生成,是用户账户使用权及账户内资产所有权的唯一证明,其有效位长足够大,因此不可能被攻破,无安全隐患。
公钥(public key):可公开,每一个私钥都有一个与之相匹配的公钥。 ECC 公钥可以由私钥通过单向的、确定性的算法生成,目前常用的方案包括: secp256r1(国际通用标准)、secp256k1(比特币标准)和 SM2(中国国标)Photon chain 控制链与初始数据链选择 secp256r1 作为密钥方案。
Hash 算法:通常 Hash 算法是指安全散列算法 SHA(Secure Hash Algorithm),该算法是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院(NIST) 发布的一系列密码散列函数,包括 SHA-1、SHA-224、SHA-256、SHA-384 和 SHA-512 等变体。目前比特币采用 SHA-256 算法。Photon chain 除 PoW 外,其余 Hash 算法均指 SHA-256。
云尊币在此基础上进行了改进,使用的同态加密是一种无需对加密数据进行提前解密就可以执行计算的方法。它提供了一种急需的方法,能够在原有基础上使用区块链技术。
通过使用同态加密技术在区块链上存储数据可以达到一种完美的平衡,不会对区块链属性造成任何重大的改变。也就是说,区块链仍旧是公有区块链。然而,区块链上的数据将会被加密,因此照顾到了公有区块链的隐私问题,同态加密技术使公有区块链具有私有区块链的隐私效果。
2、1 同态加密算法处理过程
如图 3 所示,主要是对私有信息进行保护。Alice 有私有的函数 fA 和私有的信息 XA,Bob 把私有信息 yB用私有公钥 pkB加密得到 E(y)发送给 Alice,Alice 用自己的私有函数 fA 加密私有信息 XA 和 E(yB),由于同态性质,函数 fA 被隐藏,而 Bob 获得 E(fA(XA,yB))。Bob 通过私有的私钥加密 D(E(fA (XA,yB)))=fA (XA,yB)。
如图 4 所示,主要是对私有的操作函数进行保护。Alice 有私有的函数以,并用私有公钥 pkA加密函数 fA发送给 Bob,Bob根据私有信息 XB计算 E(fA )(XB),由于同态性质,因此隐藏了Bob 的信息 XB,得到 E(fa(xb)),并发送给 Alice,Alice 用私钥解密获得 fA(XB)。
同态加密技术不仅提供了隐私保护,它同样会允许随时访问公用区块链上的加密数据进行审计或其他目的。换句话说,使用同态加密在公用区块链上存储数据将能够同时提供公有和私有区块链的最好的部分。
如果 E 为针对 funcTIon_a 的全同态函数,即
其中,加密操作为 E,明文为 m,加密得 e,如果对于任意复杂明文操作 funcTIon_a,都能针对 E 构造出相应的 function_b。那么,E 就是一个针对 function_a 的同态加密算法,则称 E 为针对 function_a 的全同态加密算法。全同态加密的目的在于找到一种能在加密的数据上进行任意数量的加法和乘法运算的加密算法,使得对加密数据进行某种操作所得到的结果恰好等于对加密前的数据进行预期操作再加密后得到的密文。
3、Netty 构建高性能高可用的去中心化网络
3、1 Netty 的 I/O 模型
基于非阻塞 I/O 实现,底层依赖的是 JDK NIO 框架的Selector。
Selector 提供选择已经就绪的任务的能力。简单来讲,Selector 会不断地轮询注册在其上的 Channel,如果某个Channel 上面有新的 TCP 连接接入、读和写事件,这个 Channel就处于就绪状态,会被 Selector 轮询出来,然后通过SelectionKey 可以获取就绪 Channel 的集合,进行后续的 I/O操作。
一个多路复用器 Selector 可以同时轮询多个 Channel,由于JDK1.5_update10 版本(+)使用了 epoll()代替传统的 select实现,所以它并没有最大连接句柄 1024/2048 的限制。这也就意味着只需要一个线程负责 Selector 的轮询,就可以接入成千上万的客户端,这确实是个非常巨大的技术进步。使用非阻塞 I/O 模型之后,Netty 解决了传统同步阻塞 I/O带来的性能、吞吐量和可靠性问题。
3、2 线程调度模型
常用的 Reactor 线程模型有三种,分别如下:
Reactor 单线程模型:Reactor 单线程模型,指的是所有的I/O 操作都在同一个 NIO 线程上面完成。对于一些小容量应用场景,可以使用单线程模型。
Reactor 多线程模型:Rector 多线程模型与单线程模型最大的区别就是有一组 NIO 线程处理 I/O 操作。主要用于高并发、大业务量场景。
主从 Reactor 多线程模型:主从 Reactor 线程模型的特点是服务端用于接收客户端连接的不再是个 1 个单独的 NIO 线程,而是一个独立的 NIO 线程池。利用主从 NIO 线程模型,可以解决 1个服务端监听线程无法有效处理所有客户端连接的性能不足问题。
事实上,Netty 的线程模型并非固定不变,通过在启动辅助类中创建不同的 EventLoopGroup 实例并通过适当的参数配置,就可以支持上述三种 Reactor 线程模型。
在大多数场景下,并行多线程处理可以提升系统的并发性能。但是,如果对于共享资源的并发访问处理不当,会带来严重的锁竞争,这最终会导致性能的下降。为了尽可能的避免锁竞争带来的性能损耗,可以通过串行化设计,即消息的处理尽可能在同一个线程内完成,期间不进行线程切换,这样就避免了多线程竞争和同步锁。
为了尽可能提升性能,Netty 采用了串行无锁化设计,在 I/O线程内部进行串行操作,避免多线程竞争导致的性能下降。表面上看,串行化设计似乎 CPU 利用率不高,并发程度不够。但是,通过调整 NIO 线程池的线程参数,可以同时启动多个串行化的线程并行运行,这种局部无锁化的串行线程设计相比一个队列-多个工作线程模型性能更优。
3、3 序列化方式
影响序列化性能的关键因素总结如下:
序列化后的码流大小(网络带宽占用)、序列化&反序列化的性能(CPU 资源占用)
并发调用的性能表现:稳定性、线性增长、偶现的时延毛刺等对 Java 序列化和二进制编码分别进行性能测试,编码 100 万次,测试结果表明:Java 序列化的性能只有二进制编码的 6.17%左右。
Netty 默认提供了对 Google Protobuf 的支持,通过扩展Netty 的编解码接口,用户可以实现其它的高性能序列化框架,例如 Thrift 的压缩二进制编解码框架。
不同的应用场景对序列化框架的需求也不同,对于高性能应用场景Netty默认提供了Google的Protobuf二进制序列化框架,如果用户对其它二进制序列化框架有需求,也可以基于 Netty 提供的编解码框架扩展实现。
3、4 采用 Netty 框架的原因
1)设计
· 统一的 API,适用于不同的协议(阻塞和非阻塞)
· 基于灵活、可扩展的事件驱动模型
· 高度可定制的线程模型
· 可靠的无连接数据 Socket 支持(UDP)
2)性能
·更好的吞吐量,低延迟、
·更省资源
·尽量减少不必要的内存拷贝
3)安全
完整的 SSL/TLS 和 STARTTLS 的支持能在 Applet 与Android 的限制环境运行良好
4)健壮性
·不再因过快、过慢或超负载连接导致 OutOfMemoryError不再有在高速网络环境下 NIO 读写频率不一致的问题
5)易用
· 完善的 JavaDoc,用户指南和样例
· 简洁简单
· 仅信赖于 JDK1.5
Netty 框架能够为云尊币带来更好的兼容性、安全性、稳定性可操作性,为云尊币多功能性的应用快速读写提供基础,目前Netty 已经在很多不同的领域取得了良好的效果。
大数据领域:经典的 Hadoop 的高性能通信和序列化组件Avro的RPC 框架,默认采用 Netty 进行跨节点通信,它的 NettyService 基于 Netty 框架二次封装实现。
大数据计算往往采用多个计算节点和一个/N 个汇总节点进行分布式部署,各节点之间存在海量的数据交换。由于 Netty 的综合性能是目前各个成熟 NIO 框架中最高的,因此,往往会被选中用作大数据各节点间的通信。
企业软件:企业和 IT 集成需要 ESB,Netty 对多协议支持、私有协议定制的简洁性和高性能是 ESB RPC 框架的首选通信组件。事实上,很多企业总线厂商会选择 Netty 作为基础通信组件,用于企业的 IT 集成。
通信行业:Netty 的异步高性能、高可靠性和高成熟度的优点,使它在通信行业得到了大量的应用。
4、云尊币共识机制
云尊币采用 PoW+PoS 的混合共识机制,能够将受众群体最大化。持有云尊币的用户与矿工均可以参与到投票中,共同参与重大决定,数字资产持有者与矿工都可以影响预先编制好的更新,而这才是真正的去中心化。
4、1 POW 工作量证明的过程
POW 是一个经过广泛测试,并具有抗攻击性和拓展性的解决方案。 我们可以把工作量证明的步骤大致归纳如下:
生成 Coinbase 交易,并与其他所有准备打包进区块的交易组成交易列表,通过 Merkle Tree 算法生成 Merkle Root Hash
把 Merkle Root Hash 及其他相关字段组装成区块头,将区块头的 80 字节数据(Block Header)作为工作量证明的输入
不停的变更区块头中的随机数即 nonce 的数值,并对每次变更 后 的 的 区 块 头 做 双 重 SHA256 运算(即SHA256(SHA256(Block_Header))),将结果值与当前网络的目标值做对比,如果小于目标值,则解题成功,工作量证明完成。
该过程可以用下图表示:
4、2 权益证明(Proof of Stake)
在工作量证明中,各个节点协助创建和验证新的区块。奖励与贡献给整个网络的算力资源成正比。当然也会出现恶意攻击或者恶意欺骗其他节点的风险出现。权益证明系统试图先保留工作量证明的好处,同时消除一些潜在的安全问题。
权益证明机制可以辅助加强工作量证明,而不是取代它。其可以简单地作为添加和批准新区块的附加步骤。
•PoS 背后的理性逻辑
(1)使权益所有者能够通过投票决定记账人
(2)最大化权益所有者的红利
(3)最小化保证网络安全的消耗
(4)最大化网络的性能
(5)最小化运行网络的成本
云尊币这样设计的好处,权益所有者拥有控制权,PoS 的根本特性是权益所有者保留了控制权,从而使系统去中心化。可以提高区块链数字资产的安全性,因为工作量证明可能存在 51%攻击的潜在风险,控制大部分算力资源的人将可以轻易控制整个网络。
在技术上层面上,云尊运用了对区块的投票交易机制(一种灵活且实用的 PoS 机制),并把具备双层链结构和两极挖矿思想的加强版 PoW 机制与该 PoS 机制进行有机结合从而得到新型混合共识机制,在该新型混合共识中,keyBlock 必须获得足够的赞同票才会被视为合法,因此 PoW 和 PoS 都能参与系统共识并发挥重要作用。
5、云尊币解决区块链网络慢的弊端
云尊币是如何解决区块链网络慢的呢?通过“RingBuffer”和“Disruptor”来实现,
Disruptor 它是一个开源的并发框架,能够在无锁的情况下实现网络的 Queue 并发操作,Disruptor 为什么会这么快?
(1)锁的缺点
Disruptor 根本就不用锁。取而代之的是,在需要确保操作是线程安全的(特别是,在多生产者的环境下,更新下一个可用的序列号)地方,我们使用 CAS(Compare And Swap/Set)操作。CAS 操作比锁消耗资源少的多,因为它们不牵涉操作系统,它们直接在 CPU 上操作。所有访问者都记录自己的序号的实现方式,允许多个生产者与多个消费者共享相同的数据结构。在每个对象中都能跟踪序列号(ring buffer,claim Strategy,生产者和消费者),加上神奇的 cache line padding,就意味着没有为伪共享和非预期的竞争。
(2)缓存行填充
CPU 来执行所有运算和程序。主内存(RAM)是你的数据(包括代码行)存放的地方。Disruptor 的目标是尽可能多的在内存中运行,如果你访问一个 long 数组,当数组中的一个值被加载到缓存中,它会额外加载另外多个。因此你能非常快地遍历这个数组。事实上,你可以非常快速的遍历在连续的内存块中分配的任意数据结构。
(3)伪共享
(4)揭秘内存屏障
内存屏障作为另一个 CPU 级的指令,没有锁那样大的开销。内核并没有在多个线程间干涉和调度。但凡事都是有代价的。内存屏障的确是有开销的——编译器/cpu 不能重排序指令,导致不可以尽可能地高效利用 CPU,另外刷新缓存亦会有开销。Disruptor 的实现对序列号的读写频率尽量降到最低。对volatile 字段的每次读或写都是相对高成本的操作。也应该认识到在批量的情况下可以获得很好的表现。
我们使用 Disruptor 和 Ring Buffer。这种数据结构,是因为它给我们提供了可靠的消息传递特性。这个理由就足够了,不过它还有一些其他的优点。首先,Ring Buffer 比链表要快,因为它是数组,而且有一个容易预测的访问模式。这很不错,对 CPU高速缓存友好 (CPU-cache-friendly)-数据可以在硬件层面预加载到高速缓存,因此 CPU 不需要经常回到主内存 RAM 里去寻找 Ring Buffer 的下一条数据。第二点,Ring Buffer 是一个数组,你可以预先分配内存,并保持数组元素永远有效。这意味着内存垃圾收集(GC)在这种情况下几乎什么也不用做。此外,也不像链表那样每增加一条数据都要创建对象-当这些数据从链表里删除时,这些对象都要被清理掉。