区块链架构详解
链客,专为开发者而生,有问必答!
此文章来自链客区块链技术问答社区,未经允许拒绝转载。
准备工作
区块链不是一种技术实现,而是一个系统的架构设计,使用一系列的技术组合用于完成去中心化的数据存储。比特币在区块链之上融入了金融学,货币学,博弈学,甚至一定程度的哲学思想,用于电子货币的发行,运行和交易。在学习区块链之前有一些基础知识需要提前掌握好,后面将不再对具体技术展开描述,而是从这个技术解决了什么问题,为什么要用这个技术这个角度去描述。
P2P
不可逆算法
不对称加密算法
Merkle树
CAP理论
最终一致性算法
比特币要做什么?
如果你是一个架构师,做一个系统的架构,你首先要搞清楚这个系统要做什么?要解决一个什么问题?带着这个问题进行分析,设计系统整体的架构。对于比特币也一样,首先搞清楚比特币是要做什么,要解决什么问题?然后带着这些问题去解析比特币的技术实现。
如果用一句话来描述比特币要做什么,那么可以这样描述:做一个去中心化电子货币发行交易系统。这里有三个关键词:
去中心化
电子货币发行
电子货币交易
去中心化
当今世界的所有货币交易都是有一个第三方可信任的金融机构提供服务处理,任何人不能访问由这个第三方机构中心化存储的数据,理论上来说如果这个金融机构发生了欺诈或倒闭,那么存储在这个机构中的货币,以及所做的交易就会存在风险。当然比特币的去中心化,不是因为担心这种风险,而是根本就不需要这个第三方机构了。这也是区块链的强大颠覆性之一,凡是需要某个第三方可信任的机构需要安全保存处理的数据,都可以去中心化安全存储,所有人都可以访问。
从技术角度分析,如何做到去中心化?
中心化对应的就是分布式,去中心化就是分布式。把原先存储在某个第三方机构,中心化存储的数据,进行分布式存储。
分布式存储要解决的3个基本问题
网络结构
数据不可篡改性
最终一致性
网络结构
去中心化的分布式存储是指整个发行的电子货币,以及货币交易数据由不同机构,不通个人的成千上万的计算机共同存储,共同维护了同一份相同的数据,只有共同维护的这份相同的数据才是认为最终正确的数据,任何个人篡改自己的数据都没有意义,并且存储的数据所有人都可访问。
利用P2P协议进行节点之间数据传输主要有两个功能点:
a. 把需要存储的数据广播到所有节点上进行储存。 b. 查询整个网络集群中所有节点的最新数据,如果自己节点的数据与大部分节点的数据不一致,则更新自身的数据与大部分节点存储的数据一致。
比特币是去中心化存储,最大的风险是整个比特币网络集群被破坏,篡改了整个网络存储的数据。但是上述第二个功能点能够有效的防止这种风险,由于系统会自动更新为整个集群中大部分节点存储的相同数据,所以要篡改数据,必须要同时篡改整个网络一半以上的数据,这不是说做不到,但是比特币利用区块链的方式再加上利益博弈机制,当你拥有这种能力的时候,也不需要去做篡改这种投入产出比这么低的事了,在数据不可篡改性一节中再详细描述。
数据不可篡改性
在设计了比特币系统运行的网络结构之后,需要考虑数据的不可篡改性,因为这种数据存储是去中心化的,任何人都可以访问,那么就容易被篡改,上节描述了在这种网络结构的运行机制下,要篡改数据,必须同时更改这个网络集群上一半以上的节点数据,如果每个节点没有一个安全的保护机制的话,那是很容易做到被同时修改网络集群中一半以上节点的数据。
一种方式是每个人把自己的插入的这条数据hash后用自己的密钥进行签名,然后附带上自己的公钥,系统可以用签名和公钥验证插入的数据是否被修改过。如果把数据库表比喻为一本帐本,表中的每一条数据就认为是账本中记录的每一笔交易。这里还有两个问题,第一,不能随意插入数据,如果你没有比特币,但还是插入一条转帐给某人的数据,系统需要发现是不合法的,拒绝此次插入请求。第二,除了不能随意插入和修改外,也需要防止删除数据,上述把每条记录进行签名并不能阻止被恶意删除。
一旦形成了链式帐本后就无法去更改某个历史帐本中的数据,更改了某个历史帐本,那么在它之后的所有帐本都需要更改,但是每个帐本都是根据当前的系统时间戳验证hash值是否满足条件才能接收,所以无法去篡改历史帐本的数据。所能做的只能另外投入非常大的代价再构建一个比特币集群,这个集群超过当前的集群,那么数据就自动按照新构建的集群为准。这就是多个帐本的相互保护机制比单个帐本更难以被篡改。后续货币的发行和交易中再会描述,当你有能力重新构建一个新的比特币网络集群用于去攻击篡改数据时,你获得的收益将远远低于你投入的成本。
为了防止上个帐本的数据被篡改,产生新的帐本需要依赖于上一个帐本中的所有交易记录的hash值,这样一旦上个帐本的数据发生变化就与新帐本对应不上。但是帐本中所有交易记录计算hash值是一件耗时的计算,因此比特币采用了merkle树对某个帐本中的所有交易记录进行hash计算。它主要是解决帐本中交易记录hash计算的效率问题。如下图HA,HB…HP是具体的交易记录,每相临的两条交易记录向上形成一个Hash值,再与相邻的节点再往上形成hash值,一直到树根形成所有交易记录的唯一hash值。
之前描述的网络结构和本节描述的帐本链式结构,本质上都是用于解决去中心化的数据安全存储。
最终一致性
是分布式存储就绕不开CAP理论,比特币也一样,比特币采用P2P协议进行节点之间的数据传输,放弃了CAP中的Consistency,采用了AP两个维度。如果放弃了Consistency这个属性,那么就产生了拜占庭将军问题,这么多节点如何达成数据一致性。拜占庭军队都是一个个小分队组成,每个小分队都有一个将军负责,将军们通过号令兵传达一系列行动,但是当中出现一些叛将,故意破坏号令怎么办?
分布式存储系统和拜占庭将军问题一样,做到一致性是很难的,在比特币开放式的全球化部署的系统集群更是如此。所以比特币放弃了强一致性,并且通过P2P点对点通信,没有中心节点,整个集群中的服务器故障,离开,加入集群都不会对整个集群产生影响。
电子货币发行
上一章节去中心化中,主要描述了一个去中心化系统,如何做到安全的数据存储,不被篡改。它主要采用了P2P网络结构+区块链式结构解决了数据的安全存储。但是对于一个货币,还需要解决一个货币的发行,如何发行,发行给谁?如何让比特币系统能够让所有的人自发的运行下去?货币的发行需要公平,公开,公正,而且货币不能发行到某个第三方机构中,任何人只要符合一定的条件就能获取发行的货币。想一想,如果你是架构师,你会如何设计系统去发行货币?
本质上讲,比特币系统自身就可以寻找一个随机值,产生新的帐本。但是比特币把发行货币和寻找新帐本背后的计算力结合在一起。寻找新帐本需要消耗计算力,谁找到了符合新帐本条件的随机值,代表了他消耗了大量的计算力,新帐本一旦被系统接收,那么系统自动在该新帐本中记录一条转帐给他一定个数比特币的纪录,就完成了货币的发行。
电子货币交易
上节电子货币发行一节中描述了,谁通过算力找到了新的帐本,系统就会自动记一笔账,转一定数量的比特币给谁,他也就获得了比特币。那么如何确认记录的这笔交易是属于你的,而不被别人拿走呢?做为架构师的你如何解决这个问题?
比特币采用了非对称加密技术对用户的帐户操作,公钥就是用户的帐户号码,谁找到了新帐本,系统自动往新帐本发现者的公钥帐户,记一条特定数量比特币的纪录。当用户要消费比特币时,需要用私钥进行签名,系统会用帐户号码也就是公钥验证签名是否正确,并且根据用户的帐户号码从历史的交易中计算出当前帐户中的真实金额,确保用户操作的资金在帐户真实金额之内。这里的设计有两个要点:
插入的每一条纪录都需要用私钥签名,系统用帐户号码也就是公钥进行验证签名是否正确,验证正确则认为合法。
如果满足第一个条件,则验证插入的纪录中转帐金额是否正确,验证的方式是对该公钥以往的所有交易纪录进行计算得出该帐户当前的金额,如果不超过该金额值则为合法。图示如下:
区块链的应用
比特币系统解决了去中心化的安全存储问题,解决了货币的发行问题,解决了货币交易的帐户安全问题后,就构建了一个当前的比特币电子虚拟货币系统了。而比特币使用的区块链被认为是一个颠覆性的技术,革命性的技术,那他的颠覆性体现在什么地方呢?它不是技术上面的颠覆,主要是在思想层面上的,商业运作模式层面上的革命性。就比如一个国家从集权式的到民主式的转变,对这个国家和社会就是一个革命性的变化。而区块链技术带来两个基本功能:
去中心化的数据存储
保证帐户的安全性
理论上让原先需要通过某个第三方机构提供的数据服务,都可以革命性更改为去中心化的方式提供服务,比如比特币可以替代各个国家的法币使用。区块链这种特性也会衍生出各行各业的商业模式颠覆性的变化。
相关文章:

Git详解之九 Git内部原理
以下内容转载自:http://www.open-open.com/lib/view/open1328070620202.html Git 内部原理 不管你是从前面的章节直接跳到了本章,还是读完了其余各章一直到这,你都将在本章见识 Git 的内部工作原理和实现方式。我个人发现学习这些内容对于理解…
Hadoop2.6.0伪分布环境搭建
用到的软件: 一、安装jdk: 1、要安装的jdk,我把它拷在了共享文件夹里面。 (用优盘拷也可以) 2、我把jdk拷在了用户文件夹下面。 (其他地方也可以,不过路径要相应改变) 3、执行复制安…

ios 设置tableview左滑删除按钮的相关属性
自定义cell时在layoutSubviews处理 - (void)layoutSubviews { [super layoutSubviews]; [self dealDeleteButton]; } - (void)dealDeleteButton{ for (UIView *subView in self.subviews) { if ([subView isKindOfClass:NSClassFromString("…

区块链基础:理论和术语
链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 一、区块链: 1.百度百科上对区块链的定义是:区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机 技…

Python Socket编程基础篇
Socket网络编程 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求。 socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文…

redis使用epoll
redis使用epoll的代码在ae_epoll.c文件中。 epoll_create:redis服务器在启动时,创建事件循环,调用epoll_create方法创建epoll实例。 static int aeApiCreate(aeEventLoop *eventLoop) {aeApiState *state zmalloc(sizeof(aeApiState));if (!…

贝塞尔结合CAShapeLayer绘制路线,CABasicAnimation实现的小动画
最近项目需求,做的一个标识正在直播的小动画,代码如下: #import "YGIsOnLiveAnmationView.h" interface YGIsOnLiveAnmationView () property (strong, nonatomic) CAShapeLayer * progressLayer; property (strong, nonatomic) CAShapeLayer * triangleLayer; p…

区块链和可持续性
链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 区块链和可持续性 在区块链算法和区块链平台方面,可持续性可以有多种解释。一方面,任何听说过比特币网络能源需求的…

eclipse中maven打包
第一种方式:将依赖包打包进一个jar包中。 <build><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target><encoding>${pro…

2014年国内最热门的.NET开源平台
http://developer.51cto.com/art/201501/464292.htm转载于:https://www.cnblogs.com/littlehb/p/5646300.html

从 PoS 进化 SPoS:无能耗共识机制
链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 从 PoS 进化 SPoS:无能耗共识机制 我们为 V SYSTEMS 区块链平台设计了了一个注重高扩展性的权益证明(PoSÿ…

Linux运维跳槽必备的40道面试精华题
过一次年,结婚、存款、父母养老,一系列向钱看的事都在碾压我们本来还挺简单的神经,但难过没有出路,唯有找到好的方法和事业方向,才能实现一步一个脚印的逆袭。 下面是一名资深Linux运维求职数十家公司总结的Linux运维面…

Oracle Sales Cloud 实施(二)
Oracle Sales Cloud 实施(二) 从第一个任务列表开始: Review Company Profile(公司的主要信息) 第一个任务:Manage Enterprise HCM Information (管理公司HCM信息) 名字可以修改&a…

修改系统tabbar的高度
项目中用到了不规整的tabbar, 但是如果使用自定义又会有tabbar动画方面的问题 找到了一个折中的办法, 修改系统tabbar的高度 - (void)viewDidLoad { [super viewDidLoad]; [self.tabBar setShadowImage:[UIImage new]]; self.tabBar.backgroundImage [UIIm…

区块链技术的标准化和颠覆性
链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 区块链技术的标准化和颠覆性 区块链技术的实施是企业财务战略上的明智之举。它不仅在加密货币方面,而且在数据标准化软件方面&…

RHEL/CentOS通用性能优化、安全配置参考
RHEL/CentOS通用性能优化、安全配置参考 本文的配置参数是笔者在实际生产环境中反复实践总结的结果,完全适用绝大多数通用的高负载、安全性要求的网络服务器环境。故可以放心使用。 若有异议,欢迎联系zhangxugg163.com探讨。 提示:强烈建议使…

关于Cocoa Pods的升级安装和使用说明
前段时间要使用Cocoa Pods ,安装时发现Ruby版本过低导致安装失败, 查找教程解决后又出现Cocoa Pods新版本导致的问题, 以下给出解决办法: 一 . 升级Ruby 1.安装RVM RVM是用于Ruby的版本管理 安装命令行: $ curl -L get.rvm.io | bash -s stable $ source ~/.rvm/scripts/rvm 等…

Linux使用netstat命令查看并发连接数
我们的网站部署在linux的服务器上,特别是web服务器,我们可能有时候做为运维人员,肯定是要查看网站的并发连接数是不是达到瓶颈等,所以在linux下,我们如何查看服务器的并发连接数呢?使用以下命令即可分组查看…

深入挖掘Hyperledger Fabric中的私有数据
链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 深入挖掘Hyperledger Fabric中的私有数据 私有数据是fabric中讨论最多的特性,在v1.2中发布。它在多个参与者之间引入了数据隐私…

几种任务调度的 Java 实现方法与比较
综观目前的 Web 应用,多数应用都具备任务调度的功能。本文由浅入深介绍了几种任务调度的 Java 实现方法,包括 Timer,Scheduler, Quartz 以及 JCron Tab,并对其优缺点进行比较,目的在于给需要开发任务调度的程序员提供有…

7.Mongodb复制(副本集)
1、复制 什么是复制 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性,并可以保证数据的安全性复制还允许从硬件故障和服务中断中恢复数据为什么要复制 数据备份数据灾难恢复读写分离高(24* 7ÿ…

关于iOS10的适配
每一次的iOS升级, 都伴随着各种坑的出现, 今年iOS10也不例外 本着一定要紧随最新科技的开发态度, 最近将手机升级到了iOS10, xcode升级到了8.0 但是紧随而来的就是各种崩溃, 各种坑, 现列举如下: 一 . 用户隐私权限的访问 公司是做视频直播的, 所有在用户隐私权限上面还是有…

分布式系统中节点之间的同步形成区块链
链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 分布式系统中节点之间的同步形成区块链 分布式系统由Tanenbaum定义,“分布式系统是一组独立的计算机,在”分布式…

hdu 2199 Can you solve this equation? 二分
1.精度问题 由于是double类型,rmid 而不是rmid-12.如果首位两端(f(0)和f(100))同号,证明解不在[1,100]区间内 这是我之所以TE的原因,没有预先判断3.若在这个区间内&#…
iOS iTunes Connect协议更新导致无法构建新版本
最近公司项目发新版本时遇到不能构建新的版本的情况, 了解后才知道 必须同意更新后的协议才能构建新版本、创建内购App,提交新的App 点击其中的蓝色文字进入相关界面 这样就可以构建新版本了 参考博客: http://blog.sina.com.cn/s/blog_134451adb0102wger.html

白话hash和数字签名,保证你看得懂
链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 摘要:最近有朋友在后台问为啥最近老介绍hash相关文章,其实hash算法在信息安全中非常重要,尤其是作为数字…

几种Windows进程通信
32位Windows采用虚拟内存技术使每个进程虚拟4G内存,在逻辑上实现了对进程之间数据代码的分离与保护。那么相应的进程之间的通信也就有必要整理掌握一下。 Windows进程间通讯的方法有很多:管道、邮件槽、剪切板、共享内存、消息、套接字、RPC、DDE等。 但…

TestNG学习随笔
转载自:http://blog.sina.com.cn/s/blog_68f262210102vh5c.html 通过本人实践,文中所讲的程序可以正确运行,作用正确,并且浅显易懂。以下就是我从中摘录的重要知识点,就当留作自己记录或者帮助其他想学TestNG的人一点借…

录制短视频的录制按钮边框计时效果
项目增加录制短视频功能, 需一录制功能按钮, 使用贝塞尔曲线结合shapelayer绘制按钮边框的计时功能 代码如下: #import "YGRecordView.h" #define BeforeRecord_LineWidth 2.0#define BeforeRecord_LineColor UIColorFromRGBA(0xffffff, 1)#define Record_LineWidt…

区块链学堂:区块链引子
链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 区块链学堂(1):区块链引子 相信正在看这篇文章的读者一定已经听说过区块链了,并且也相信…