blockchain

区块链

区块链的本质,是去中心化的分布式的数据库系统,实现了数据公开、透明、可追溯。

区块链技术,广义上来说,区块链技术是实现了数据公开透明可追溯的产品的架构涉及方法,必须包含点对点网络设计、加密技术应用、分布式算法的实现、数据存储技术的使用等4方面,可能还涉及到分布式存储,机器学习,VR,物联网,大数据等;狭义上来说,区块链是指类似比特币的数据存储方式或数据库实现,仅仅涉及到数据存储技术,数据库或文件操作等。

从架构上来说,区块链由下到上可以简单的分为三个层次,协议层扩展层应用层。最底层的协议层分为存储层和网络层,存储层存储各个区块,组成区块链,存储层的上方是网络层,网络层的主要工作是通过挖矿投票等共识算法保障节点安全,网络层再向上,便是扩展层了,扩展层中含有的扩展例如智能合约、各种侧链应用,或者文档、图书电子书视频等用户数据文件存储或分享等..应用层就要就是可视化操作等..

协议层涉及的技术主要是,网络编程,加密签名,分布算法,数据存储。总的看来,网络的实现和并发处理是开发的难点,故开发语言选择优先选择网络编程能力强,并发处理简单的语言,例如Nodejs,Go。

扩展层的编程语言与协议层的编程语言可以不用,因为二者交互是通过http/rpc或json/rpc实现,二者基本完全分类,二者除了在交易时发生交互之外,其他时候尽量不要混在一起。扩展层与应用层更加接近,也可以理解位B/S架构的产品中的服务端(Server)。

共识机制

区块链是去中心化的,去中心化的基础就是节点众多,那么如何吸引用户加入网络成为节点,有哪些激励机制?同时,开发的重点是让多个节点维护一个数据库,那么如何决定哪个节点写入?何时写入?一旦写入,又怎么保证不被其他的节点更改(不可逆)?这些问题的答案,就是共识机制。共识机制可防双花

  • POW, 工作量证明,引入了对一个特定值的计算工作,比特币采用的共识算法就是POW
  • POS,权益证明,简单说来,这种机制通过计算你持有占总币数的百分比,包括你占有币数的时间来决定记账权。因此在PoS中,一个账户的余额越多,在同等算力下,就越容易发现下一个区块。
  • DPOS, 委托权益证明
  • PBFT, 实用拜占庭容错

智能合约

智能合约就是可编程合约,或者叫做合约智能化,其中的”智能”是执行上的智能,也就是说达到某个条件,合约自动执行,比如自动转移证券、自动付款等

加密货币

生活中接触到的数字货币很多,像Q币等的平台内币,这些用“代币”来称呼更为适合。那么加密货币和这些“代币”又有什么区别呢?加密货币定义如下:

加密货币,是一种基于点对点网络(P2P网络)、没有发行机构、总量基本固定的加密电子通货。

  1. P2P网络:这个不是什么新鲜玩意,最早我们使用的BT(BitTorrent)下载,就是基于P2P网络的,现在很多下载工具都支持。它的好处就是“去中心化”,也就是没有中央服务器,要下载的文件都在用户自己电脑上,而且下载速度更快;
  2. 没有发行机构:就是说,不是那个公司、银行或国家控制发行的。要做到这一点,同时防止通货膨胀等因素,需要在编程中使用非常复杂的机制和规则来实现。
  3. 总量基本固定:这是保证加密货币价值的一种策略,“物以稀为贵”,任何东西没有上限就会失去它的吸引力。这一点,区别于很多网络社区使用的积分,比如:A币、C币、Q币、S币等。
  4. 加密:这里说的加密,不是用户使用的输入用户名、密码那种简单的权限控制,而是对每一个产生的电子货币本身的交易与传输的加密。密码学本身很复杂,但是使用它并不复杂,明白这个就足够了。
  5. 电子通货:也就是说加密货币就是货币,跟法币一样,可以自由交易,只不过是一种电子(数字)形式而已。

吞吐量

区块链每秒交易量。吞吐量对于区块链项目来说,还算是一个比较重要的点。共识算法中,采用POW/POS的区块链的吞吐量就受到了极大的限制,吞吐量不超过100tx/s,例如比特币和以太坊。原因在于单纯的提高区块大小或者减少区块生成之间的时间解决不了问题,因为区块需要时间传输验证,如果区块太大,那么就会造成网络节点的不一致性加重(分叉变多),从而严重影响可靠性。DPOS通过缩小参与核心共识过程的节点数量,提高共识效率。PBFT对于节点数量少(小于100)的情况下,交易量大概还能有1000tx/s这样。

Token

代币。

  • ICO: 当某方以某个价格向投资者提供一些新的加密货币(即代币)时,可以与其他加密货币(即代币)进行交换。 这个想法是投资者购买这些代币,代币可以进行互换和转移。销售代币筹资的概念称作Initial Coin Offer或ICO

硬分叉/软分叉

比特币交易其中一个含义指的是我们发送比特币统一使用的数据结构,这是一套规则,我们所有人发送比特币,不论你使用什么钱包软件都得遵守这一套规则。

硬分叉定义

硬分叉是指比特币区块格式或交易格式(这就是广泛流传的“共识”)发生改变时,未升级的节点拒绝验证已经升级的节点生产出的区块,不过已经升级的节点可以验证未升级节点生产出的区块,然后大家各自延续自己认为正确的链,所以分成两条链。

软分叉定义

软分叉是指比特币交易的数据结构(这就是被广泛流传的“共识”)发生改变时,未升级的节点可以验证已经升级的节点生产出的区块,而且已经升级的节点也可以验证未升级的节点生产出的区块。

硬分叉不向前兼容,旧版本不会接受新版本创建的区块。要实现硬分叉所有用户都需要切换到新版本协议上。

软分叉向前兼容,旧的版本会接受新版本创建的区块,在软分叉中只需要矿工升级到新版本即可,用户可以继续使用旧版本的协议,他们仍然会接受新版本协议创建的区块。如果有至少51%的矿工的算力转向的新版本,那么网络自动完成软分叉:一开始旧版本创建的区块在新协议下被认为是不合法的,这时会出现一个短暂的分叉,但最终新版本的分叉会赶超旧版本的分叉成为最长链。因为在旧版本上的算力是小于新版本的。

石墨烯技术

github地址

bft

本文提出了Zyzzyva1,一种使用推测来降低成本并简化BFT状态机复制设计的新协议[18,34]。与传统的状态机复制协议[9,32,40]一样,主要提出了客户端对其他副本的请求的顺序。在Zyzzyva中,与传统协议不同,复制品推测性地执行请求,而不运行昂贵的协议协议来确定订单。因此,正确的副本状态可能会有所不同,并且副本可能会向客户端发送不同的响应。尽管如此,客户端的应用程序观察到复制状态机的传统和强大的抽象,它以可线性化[13]的顺序执行请求,因为答复带有足够的历史信息给客户端以确定答复和历史记录是否稳定并最终保证最终承诺。如果推测回复和历史记录稳定,则客户端使用回复。否则,客户端会等待系统收敛于稳定的回复和历史记录。

Zyzzyva面临的挑战是确保对正确客户的响应变得稳定。 最终,副本负责确保来自正确客户端的所有请求最终完成,但等待回复并且历史稳定的客户端可以通过提供将导致请求在当前视图内快速稳定的信息来加速进程 或触发视图更改。 请注意,由于客户不需要提交请求,而只是为了保持稳定,因此客户可以按照一到两个阶段而不是惯常的三个请求行事[9,32,40]。

鉴于BFT复制协议已经在客户端上实施的职责[3,9,10,21,32,40],将输出提交完全移交给客户端并不是一个很大的步骤,但这一小步骤带来了巨大的收益。首先,Zyzzyva利用推测执行 - 复制品在订单完全建立之前执行请求。其次,Zyzzyva利用快速协议协议[11,20,24]在少至三个消息延迟的情况下建立请求排序。第三,一旦客户知道请求的顺序,协议子协议就停止处理请求,从而避免在副本上建立这些知识所需的工作。

这些选择导致设计Zyzzyva时遇到两个关键挑战。首先,我们必须仔细地指定请求在客户端完成的条件,并定义协议,检查点和视图变更子协议,以保留请求在单个正确的状态机上执行的抽象。直接地,当正确的客户端可以安全地处理对该请求的回复。为了帮助客户确定何时适合回复,Zyzzyva会将历史信息附加到客户收到的回复中,以便客户可以判断回复是否基于相同的请求顺序。

协议概述

3f+1个节点replicas执行,由一系列views组成,在一个view内,一个单点的节点replica被指定为主要负责子协议共识的leader。

客户端发送一个请求给到leader, leader转发给其余replicas, 收到请求的replicas执行请求并将结果返回给客户端,客户端完成1个请求有两种方式,首先,如果客户端收到3f+1相互一致的响应结果(包括history和application-level的回复),然后客户端便认为请求完成并执行之。其次,如果客户端收到再2f+1 ~ 3f之间个数的一致的结果,客户端将手机2f+1的结果然后分发commit certificate给replicas,一旦2f+1的replicas确认收到commit certificate,客户端将会认为请求完成并且执行响应的回复。

如果有足够的replicas认为leader故障,然后view将会进行更换,一个新的leader将会产生。

在本节的其余部分中,我们描述基本协议并概述其正确性的证明[16]。 在§4中,我们描述了一些优化,这些优化全部在我们的原型中实现,通过用消息认证码(MAC)代替公钥签名来降低加密成本,通过批量请求提高吞吐量,通过缓存out-of 通过优化只读请求来提高读取性能,通过使大多数副本发送散列而不是完整回复来减少带宽,通过仅为首选法定数包括MAC来减少开销,并且通过包括额外的附加功能来提高存在故障节点的性能 证人副本。

节点状态和检查点协议

为了明确地讨论我们的讨论,我们首先讨论由每个副本维护的状态,如图2所总结的。每个副本i维护它已执行的请求的有序历史记录,以及最大提交证书副本,提交证书(定义如下)由我看到,涵盖了我存储历史的最大前缀。这个提交证书覆盖的序列号最高的请求的历史记录是承诺的历史记录,以下的历史记录是推测历史记录。如果n是提交历史记录中的任何请求的最高序列号,我们说一个提交证书的序列号为n。

每个CP INTERVAL请求都会创建一个检查点。副本维护一个稳定的检查点和一个相应的稳定应用程序状态快照,并且它可以存储多达一个暂定检查点和相应的暂定应用程序状态快照。尝试性检查点和应用程序状态提交的过程与早期BFT协议所使用的过程类似[9,10,17,32,40],因此我们将详细讨论推迟到我们的扩展技术报告[16]。但是,简要总结一下:当正确的副本生成临时检查点时,它会向所有副本发送签名检查点消息。该消息包含检查点中包含的任何请求的最高序列号以及对应的试验性检查点和应用程序快照的摘要。当收集由不同副本签名的f + 1匹配检查点消息时,正确的Zyzzyva副本会将检查点和相应的应用程序快照视为稳定。为了限制历史的大小,副本(1)在提交的检查点之前截断历史记录,(2)在处理自上次提交的检查点以来的2×CP INTERVAL请求之后阻止处理新的请求。最后,每个副本维护一个响应缓存,其中包含每个客户端的最新订购请求的副本以及相应的响应。

IPFS

IPFS是一个分布式文件系统,它综合了以前的对等系统的成功想法,包括DHT,BitTorrent,Git和SFS(SFS文件系统的名字认证了它的服务,用户可以通过服务提供的公钥来验证,协商一个共享的私钥,保证所有的通信。所有的SFS实例都共享了一个全局的命名空间,这个命名空间的名称分配是加密的,不被任何中心化的body控制)。

IPFS的贡献是简化,发展和将成熟的技术连接成一个单一的内聚系统,大于其部分的总和。 IPFS提供了编写和部署应用程序的新平台,以及一个新的分发系统版本化大数据。 IPFS甚至可以演进网络本身。

IPFS是点对点的;没有节点是特权的。 IPFS节点将IPFS对象存储在本地存储中。节点彼此连接并传输对象。这些对象表示文件和其他数据结构。 IPFS协议分为一组负责不同功能的子协议:

  • 身份
    管理节点身份生成和验证。
  • 网络
    管理与其他对等体的连接,使用各种底层网络协议。可配置的。
  • 路由
    维护信息以定位特定的对等体和对象。响应本地和远程查询。默认为DHT,但可更换。
  • 对象
    具有链接的内容寻址不可更改对象的Merkle DAG。用于表示任意数据结构,例如文件层次和通信系统。
  • 交换
    一种支持有效块分配的新型块交换协议(BitSwap)。模拟市场,弱化数据复制。贸易策略可替换。
  • 文件
    由Git启发的版本化文件系统层次结构。
  • 命名
    自我认证的可变名称系统。这些子系统不是独立的;它们是集成在一起,互相利用各自的属性。但是,分开描述它们是有用的,从下到上构建协议栈。符号:Go语言中指定了以下数据结构和功能

一步步来学习IPFS。

P2P

P2P网络结构可分为结构化和非结构化,非结构化组建方便,多个peer同时加入或下线离开,整个网络也会很稳定,结构化网络数据查询效率高,但当大量peer同时加入或离开时网络稳定性差,性能受影响。

结构化网络与纯分布式网络不同的是,所有节点按照某种结构有序组织,比如形成环状网络,或树状网络。DHT提出了一种网络模型,基于DHT,实现结构化网络的算法如Chord、Pastry、Kad等

DHT的核心为,资源空间和节点空间都进行编号,资源空间的编号可映射到对应节点空间。节点路由的普遍实现为trie树,形成K桶。资源的实现的话,邻近节点可存储冗余,对于热点信息,查询周围可缓存,Kad算法本身并未实现资源的冗余存储,主要是K桶的实现,逻辑的距离为节点Id的异或。

K桶一般为定时刷新,以自己为中心,查询距离自己最近的节点组成K桶,以太坊的Kad算法不太一样的是查询的是某个随机ID作为刷新基点,所查找的节点均在距离上向随机生成的TargetId收敛。

示例

可查看以太坊P2P解析进一步理解。

DHT的实现,BT种子嗅探器

参考自

  1. https://github.com/imfly/bitcoin-on-nodejs/blob/master/