区块链学习大纲(简介)
链表
区块链一般表示为一个单链列表,区块链中的块相当于链表中的Node节点,节点之间使用哈希串联形成链。区块链上的数据基本不可能修改,比普通链表要复杂得多
树
区块链中使用Merkle Tree即默克尔树。是二叉树的一种,最底层是叶子节点,内容是对应数据的哈希。每两片相邻的叶子结点加起来做哈希计算,计算结果为上层节点的内容,这样持续计算就会产生一个最顶端的哈希值,该值被放在比特币的区块头中。
主要用于验证一个交易已经存在对应的区块中,一般来说,验证交易需要搭建节点下载和同步区块链数据后根据哈希值查询,这样既占用空间和验证计算量都较大。如果使用Merkle Tree,可直接下载块头数据即可验证
过滤器
Bloom Filter即布隆过滤器。它是一种基于概率的数据结构,主要用来判断某个元素是否在集合内,它具有运行速度快(时间效率),占用内存小的优点(空间效率),但是有一定的误识别率和删除困难的问题。它能够告诉你某个元素一定不在集合内或可能在集合内。
在比特币网络中,轻节点客户端查找自己账户地址相关的UTXO时需要用到。客户端通过过滤器告诉全节点自己的地址信息,全节点返回结果可能相关的UTXO,过滤器过滤掉了不属于该地址的UTXO。保护隐私、节省带宽
HASH
即哈希算法、散列算法,一个单项函数,可以将任意长度的输入数据转化为固定长度的输出。将一个输入给哈希,会很快计算出来一个输出,但一个输出无法反推输入,只能暴力穷举,这种概率非常小。如果两个输入数据不同但哈希相同,则发生了哈希碰撞。
区块链中,哈希算法主要用于防止交易被篡改,交易经过哈希算法计算写入MerkleTree
非对称加密与数字签名
非对称加密中有连个密钥,公钥和私钥,是一对。如果使用公钥加密,那必须用对应的私钥解密;如果对私钥加密,那必须用对应公钥解密。非对称加密信息传输过程如下:
- A要向B发送信息,A和B都要产生一对用于加密、解密的公钥和私钥
- A保管自己的私钥,把公钥告诉B;B保管自己的私钥,把公钥告诉A
- A要给B发送信息时,A用B的公钥加密信息,因为A知道B的公钥
- A将这个消息发给B(已经用B的公钥加密消息)
- B收到这个消息后,B用自己的私钥解密A的消息。其他所有收到这个报文的人都无法解密,因为只有B才有B的私钥
数字签名有两个算法:签名、验证。签名就是使用私钥处理信息或因为信息的哈希而产生的签名,验证就是使用公钥验证签名的真实性。整个验证过程如下:
-
张三在比特币转账前需要将交易信息缩短成一段字符串,用自己的私钥进行加密以形成数字签名
-
张三会将交易信息、数字签名和公钥都广播出去,矿工会将这些记录下来,并用张三的公钥进行验证
-
如果验证成功就证明该笔交易确实是由张三发出的,之后接受转账者李四会收到比特币
在区块链中,非对称加密和数字签名利用公私钥对加密,可以保证数据安全。
分布式网络:
P2P网络
- 传统Client-Server模式是中心化网络,资源集中,海量访问时可能受限
- P2P网络是去中心化的,各节点可直接通信,节点既是服务器又是客户端
- P2P架构下是无信任的,用户无需担心隐私泄露,且通信加密,安全
- 节点间的直接通信,效率较高
- 目前的应用:文件共享(如种子下载)、区块链应用
共识算法
共识算法是允许用户或机器在分布式环境中协调关系的机制,它需要确保系统中的所有代理对单一事实来源能够最终达成一致意见(即使某些代理持反对意见),也就是说,系统必须具有良好的容错性。经典的共识概念可以参考拜占庭将军问题。
目前我们国家的货币系统是一个记账货币,例如支付宝扫码支付,其中并没有进行实际的货币转移,而是支付宝在它的数据库里记了一笔账,这就是中心化的记账方式。这种方式效率很高,但也存在一系列问题,如中心化节点引发的错误等黑天鹅事件,一般的解决方案就是做备份、对人员进行SOP培训,或者使用更可靠、安全的系统。
去中心化记账系统中,每个区块都记录着很多交易,这种系统有很多优点,但其中一个很重要的问题就是各节点账本的一致性。因为每加入这个系统的节点都需要保存一份完整的账本,但却不能有两个节点同时记账,因为节点处于不同的环境,接收到的交易信息不一致,如果同时记账就会导致账本的不一致。所以,需要通过共识机制决定让哪个节点来记账,目前常用的就是POW、POS等
POW工作量证明
例如,工作面试中,招聘网站写着岗位需要本科学历,如何证明是本科毕业生?只要将本科毕业证给面试官看就行了。但是你要拿到本科毕业证需要上4年大学、在此之前还要上3年高中、初中小学,中途要上课、考试,还不能挂科。这是一个艰辛的过程,但对于面试官而言,只要展示出毕业证就可以证明你上过大学。这种获取困难但验证简单的不对称性也是POW的特点。它通过对一个区块链头部中的父区块哈希、MerkleTree树根、nonce值三个字段进行哈希运算,如果结果小于目标值则计算成功,如果大于目标值则改变nonce值,重复运算直到结果小于目标值为止
区块头部信息:
字段名 | 长度/字节 | 含义 |
---|---|---|
version | 4 | 版本号 |
prev_hash | 32 | 前一区块哈希 |
merkle_root | 32 | 区块体中交易的Merkle树的根节点的哈希 |
time | 4 | 当前区块生成时间,时间戳 |
terget | 4 | 当前目标值 |
nonce | 4 | 随机数 |
POS权益证明
参与比特币挖矿的人越来越多,PoW的许多问题逐渐显现,例如随着算力竞争迅速加剧,获取代币需要消耗的能源大量增加,记账权也逐渐向聚集了大量算力的“矿池”集中。为此研究者尝试采用新的机制取代工作量证明。POS最早的应用是点点币,它出了币龄的概念,币龄是持有的代币与持有时间乘积的累加。利用币龄竞争取代算力竞争,使区块链的证明不再仅仅依靠工作量,有效地解决了PoW的资源浪费问题。关于POS可详见百度
在区块链中,共识算法可以解决两个问题:双花问题和拜占庭将军问题
并行计算模型
在区块链系统中,交易是组成事务的基本单元。交易吞吐量(TPS)很大程度上能限制或拓宽区块链业务的适用场景,愈高的吞吐量,意味着区块链能够支持愈广的适用范围和愈大的用户规模。业界的TPS优化方案层出不穷,但都是为了尽可能提交交易的并行处理能力,降低交易处理时间。如FISCO BCOS基于DAG模型的并行交易引擎等
事务一致性原理
一致性是指分布式系统中(如区块链)的多个服务节点,给定一系列的操作,在约定协议的保障下,使它们对外界呈现的状态是一致的。换句话说,也就是保证集群中所有服务节点中的数据完全相同并且能够对某个提案(Proposal)达成一致
注意:共识性描述的是节点之间彼此对某个状态达成一致结果的过程,而一致性是指多个节点对外呈现的数据的状态,描述的是对数据状态的维护能力。也就是说,一致性描述的是结棍状态,共识则是一种手段。达成共识并不意味着保证了一致性,只能说共识机制能够实现某种程度上的一致性。在实际应用中,如果要保证系统满足不同程度的一致性,往往需要通过共识算法来达成
一致性的要求
- 达成一致的结果在有限的时间内完成,简称为有限性
- 不同节点最终完成决略的结果是相同的,即约同性
- 决策的结果必须是系统中某个节点提出来的。即合法性。
在分布式系统中,如果一个由节点提出的提案,能够用在有限的时间内达到一致性的结果,我们就说该提案达到了一致性
一致性的分类
- 严格一致性
- 理想状态,对于某数据项的任何读写操作将返回最近一次对它进行的写操作的结果所对应的值,依赖于绝对的全局时间。严格一致性在系统不发生任何故障,且所有节点之间的通信无需任何时间这种理想的条件下才能达到,这时候整个分布式系统相当于一台机器。这在现实中基本不可能达到,且一致性越强往往导致处理性能、可扩展性弱
- 强一致性
- 标准:当分布式系统中更新操作完成之后,任何多个进程或线程,访问系统都会获得最新的值
- 强一致性包括以下两类
- 顺序一致性
- 线性一致性
- 弱一致性
- 系统并不保证后续进程或线程的访问都会返回最新的更新的值。系统在数据成功吸入之后,不承诺立即可以读到最新写入的值,也不会具体承诺多久读到。但是会尽可能保证在某个时间级别(秒级)之后。可以让数据达到一致性状态。也就是说,如果能容忍后续的部分或者全部访问不到,则是弱一致性
- 最终一致性
- 弱一致性的特定形式。系统保证在没有后续更新的前提下,系统最终返回上一次更新操作的值。 也就是说,如果经过一段时间后要求能访问到更新后的数据,则是最终一致性。在最终一致性的要求下,如果没有故障发生,不一致窗口的时间主要受通信延迟,系统负载和复制副本的个数影响。DNS是一个典型的最终一致性系统。
博弈论
多个个体之间的收益与奖励、以及如何使用它们来分析一次性和持续性游戏中的激励因素。博弈论应用到区块链的核心就是共识机制——让链上所有成员就同一问题达成一致:纳什均衡、谢林点。博弈论是研究战略决策的理论,一个博弈论模型至少有三个组成部分:
-
决策者,例如公司董事长
-
战略,为了推动发展而做出的决定
-
回报,策略的结果
博弈论中的2种类型:
- 零和游戏:以牺牲另一个玩家为代价换取一个玩家的收益的游戏
- 非零和游戏:一个玩家的收益不以另一个玩家的损失为代价的游戏
纳什均衡:博弈论的一个解决方案,假设每个参与者都知道其他参与者的策略的情况下,没有参与者可以通过改变自身策略使自身受益时的一个概念。
谢林点:同样是博弈论的一个解决方案,指人们在没有沟通的情况下的选择倾向,做出这一选择可能因为它看起来自然、特别、或者与选择者有关。
- 例如,两人驱车相对而行,如果两车相撞,两人均死于车祸;如一方转弯,而另一方没有,则转弯的一方被耻笑为胆小鬼,另一方胜出。这种情况下使用谢林点的概念来解决问题,即开车时闭上眼睛,切断与对方的沟通,专注自己本能。在现实生活中,车子一般靠右行驶,直接会让各自均靠右边行驶。
- 在生活中,有各种聚焦点,如公司、小区门口、奶茶店等,这些地方都属于谢林点
补充:有限理性概念:
例如小明每天都去水果店买一个苹果,每次来店主都会离开5分钟,且店里没有监控,他可以很容易地偷到一个苹果,但他从来没有这样做过。有限理性概念意味着当有选择的时候,人们总是会选择一条简单且习惯的道路。这条道路可能不是最适合他们的,也可能不会给他们最高的回报,却是最简单的道路
区块链、加密货币中的博弈理论
区块链使用博弈论来保护系统。例如比特币中的双花攻击,系统本身是没有道德可言的,因为道德无法量化,系统中的大部分节点会接着最长合法链的后面去挖矿,双花攻击的成本很大,根本没有必要去做这件事。从这个方面来看,可以说区块链本身就是一个能够自动执行纳什均衡点的系统
资料来源:https://blockgeeks.com/guides/cryptocurrency-game-theory/
激励相容
经济学家哈维茨在机制设计理论中提出的,意思是在市场经济中,每个理性经纪人都会有自利的一面,其个人行为灰暗自利的规则行为行动。如果能有一种制度安排使得行为人追求的个人利益正好与企业实现集体价值最大化的目标相吻合,这一制度安排就是“激励相容”。
这通过实施一个博弈规则来达到该目标。激励相容通过经济平衡的手段,鼓励节点参与到维护区块系统安全运行中来,防止对总账本进行篡改,是长期维持区块链网络运行的动力。当集体和个人的利益达到了一个平衡点,这个游戏就会一直持续下去,不会崩塌。
语言:Sodility、WebAssembly
https://solidity-cn.readthedocs.io/zh/develop/
https://developer.mozilla.org/zh-CN/docs/Learn
网络拓扑结构
大部分区块链网络底层仍然使用TCP/IP协议,和HTTP、SMTP协议都处在应用层。经常和P2P对比的是当下最为广泛的HTTP,从C/S架构变更成点对点拓扑结构。比特币的P2P网络非常复杂,这里只了解全节点场景下的网络路由
比特币P2P网络基于TCP协议,主网默认端口8333。P2P网络拓扑结构本身可有很多种,如中心化、半中心化拓、全分布式。
- 比特币全节点组成的网络是一种全分布式的拓扑结构,节点间的传输过程接近“泛洪算法”。
- 比特币全节点与SPV简化支付验证客户端之间的交互模式接近半中心化的拓扑结构,SPV随机选择一个全节点连接,这个全节点成为SPV的代理,帮助SPV广播交易
节点发现
节点发现是接入区块链P2P网络的第一步
- 初始化节点发现:你的全节点刚下载,首次运行,没有任何节点数据
- DNS-seed,即DNS 种子节点。例如nslookup seed.bitcoin.sipa.be 会发现多个IPv4主机地址,使用nc命令连接域名下的某个主机的8333端口就会发现连接成功
nc -nvv 68.183.188.105 8333 found 0 associations
- 硬编码种子节点
- DNS-seed,即DNS 种子节点。例如nslookup seed.bitcoin.sipa.be 会发现多个IPv4主机地址,使用nc命令连接域名下的某个主机的8333端口就会发现连接成功
- 启动后节点发现:正在运行的钱包已经能跟随网络动态维护可用节点
- 初始节点发现后,你的节点需要向已存在的节点要一份对等节点列表(peer list),所以在每次需要发送协议消息的时候,它会花费固定的时间尝试和已存的节点列表中的节点建立链接,如果有任何一个节点在超时之前可以连接上,就不用去 DNS seed 获取地址
局域网穿透
局域网里运行的区块链节点,在公网是无法发现的,公网上的节点只能被动接受连接,并不能主动发起连接。通过NAT、UPnP技术可自行建立映射。比特币和以太坊均使用了UPnP协议作为局域网穿透工具(局域网内的路由设备支持NAT网关、支持UPnP协议)
- NAT:源 NAT,替换 TCP 报文中的源地址并映射到内网地址
- UPnP:通用即插即用(Universal Plug and Play)主要用于设备的智能互联互通,所有在网络上的设备马上就能知道有新设备加入
节点交互
一旦节点建立连接以后,节点之间的交互是遵循一些特定的命令,这些命令写在消息的头部,消息体写的则是消息内容。
- 请求命令
- 数据交互命令
用Java SDK接入到区块链
官方文档:https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/sdk/java_sdk/quick_start.html
本文来自博客园,作者:我永远喜欢石原里美,转载请注明原文链接:https://www.cnblogs.com/yuan-zhou/p/16330783.html