区块链学习笔记

Posted xiao_a_tong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了区块链学习笔记相关的知识,希望对你有一定的参考价值。

*区块链更大的不是制造信任,而是让信任产生无损的传递,整个降低社会的摩擦成本,从而提高整个效益。*

区块链技术是通过P2P网络和区块链来实现数据存储的去中心化、不可逆、不可篡改。

区块链主要解决的交易的信任和安全问题,因此它针对这个问题提出了四个技术创新:

①分布式账本

交易记账由分布在不同地方的多个节点共同完成,且每个节点记录的是完整的账本,因此它们都可以参与监督交易合法性,同时可以共同为其作证。

传统分布式存储:将数据按照一定规则分成多份进行存储,通过中心节点往其他备份节点同步数据。

区块链分布式存储:每个节点都按照块链式结构存储完整的数据,每个节点存储的都是独立的、地位相等的,依靠共识机制保证存储的一致性。

没有任何一个节点可以单独记录账本数据,从而避免单一记账人被控制或者贿赂而记假账,也由于节点较多,理论上除非所有节点遭破坏,否则账本不会消失,从而保证账本的数据安全。

②非对称加密和授权技术

存储在区块链上的交易信息是公开的,但是账户身份是高度加密的,只有在数据拥有者授权的情况下才能访问到,从而保证了数据的安全和个人的隐私。

③共识机制 (少数服从多数,人人平等)

记账节点之间怎么达成共识,认定一个记录的有效性,既是认定手段,也是防篡改手段,区块链提出四种共识机制,适用于不同的应用场景,在效率和安全性之间取得平衡。

少数服从多数:不只是节点数,还有计算能力、股权或者其他计算机可以比较的特征量。

人人平等:节点满足条件时,所有节点都有权优先提出共识结果、直接被其他节点认同后并最后有可能成为最终共识结果。

基于这些可信和不可篡改的数据,可以自动化的执行一些预先定义好的规则和条款。

密码学

最开始,比特币更多的是对椭圆曲线公钥密码算法、Ripemd和SHA2数据摘要算法的应用,随着区块链的发展,链上隐私保护成为关注的重点,对称加密、密钥协商、新型密码学技术如环签名、同态加密、零知识证明***(证明者能够在不向验证者提供任何有用的信息的情况下,使验证者相信某个论断是正确的)***、私有账本等开始被广泛应用在隐私保护方案中。1024位的RSA私钥加密已经可以破解。

hash算法

哈希算法是一个单向函数,可以将任意长度的输入数据转化为固定长度的输出数据(哈希值),哈希值就是这段输入数据唯一的数值表现。由于在计算上不可能找到哈希值相同而输入值不同的字符串,因此两段数据的哈希值相同,就可以认为这两段数据也是相同的,所以哈希算法常被用于对数据进行验证。

在区块链中,数据存储在区块里。每个区块都有一个区块头,区块头中存储了一个将该区块所有数据经过哈希算法得到的哈希值,同时,每个区块中还存储了前一个区块的哈希值,这样就形成了区块链。如果想要篡改某一个区块A中的数据,就会导致A的哈希值发生变化,后一个区块B就无法通过哈希值正确地指向A,这样篡改者又必须篡改B中的数据…也就是说,篡改者需要篡改被篡改的区块以及后面的所有区块,才能让所有的节点都接受篡改。

私钥就是随机数或坐标,相当于把金子埋在2256个格子的任意一个里,几乎找不到。

打款人:A 收款人:B

A用B的公钥加密,用自己私钥签名

B用自己私钥解密,用A公钥验证

Merkle树

Merkle树是一种树形结构,在区块链中,Merkle树的叶子节点是区块中数据的哈希值,非叶子节点是其子结点组合后的哈希值,这样由叶子节点开始逐层往上计算,最终形成一个Merkle根,记录在区块的头部,这样就可以保证每一笔交易都无法篡改。

非对称加密

私钥加密,公钥解密。

在区块链中,非对称加密技术主要用于信息加密、数字签名和登录认证。

主要目的不是解密,而是对文件来源的验证,而且,即使文件遭恶意篡改,再用公钥解密,就是无效的,由此可证明信息被改过了,并不是原文件,用这种方式使用公私钥可以证明信息的来源并且有不可否定的特性。只有非对称加密才能 实现不可否认性,但速度较慢且大量使用电力资源及计算资源。

RSA加密算法

RSA的安全基于大数分解的难度。其公钥和私钥是一对大素数(100到200位十进制数或更大)的函数。从一个公钥和密文恢复出明文的难度,等价于分解两个大素数之积(这是公认的数学难题)。

第一步:生成密钥对,即公钥和私钥。

①随机找两个质数P和Q,P与Q越大越安全。

②计算n的欧拉函数φ(n)。

φ(n)表示在小于等于n的正整数中,与n构成互质关系的数的个数(两个整数只有公约数1时,它们的关系叫做互质)。如果n=PQ,P与Q均为质数,则φ(n) = φ(PQ) = φ(P-1)φ(Q-1) = (P-1)(Q-1)

③随机选择一个整数e,条件是1 < e < m,且e与m互质。

④有一个整数d,可以使得e*d除以m的余数为1。

第二步:

*加密生成密文。*

甲向乙发送消息,将密文以utf-8方式编码再转成十进制形成明文(例如“中”以utf-8方式编码为[e4 b8 ad],转为十进制为[228,184,173],则明文为[228,184,173]),甲要使用公钥(n , e)进行加密,要求被加密的数字必须小于n,被加密的数字必须是整数,字符串可以取ASCII或unicode值。假设a为明文,b为密文,按下列公式计算出b,ae% n = b

*解密生成明文。*

乙收到密文用自己的私钥(n,d)解密,解密公式如下,ad % n = b

密文解密后再按utf-8解码为原消息。

对极大整数做因数分解的难度决定了RSA算法的可靠性。

椭圆曲线加密算法(ECC)

​ 是一种基于椭圆曲线数学的公开密钥加密算法,其本质是利用离散对数问题实现加密,相比于RSA,ECC的优势是可以使用更短的密钥,来实现与RSA相当或者更高的安全(例如,一个256 bit的对称密钥必须由大于15 000 bit 的 RSA 来保护,然而,仅用512 bit的ECC非对称密钥就可以提供相等的安全性,因而可有效节约计算成本)。据研究,160位ECC加密安全性相当于1024位RSA加密,210位ECC加密安全性相当于2048位RSA加密,但是缺点是设计困难,实现复杂,如果序列号设计过短,那么安全性并没有想象中完善。(更适用于资源受限的边缘设备)

*什么是椭圆曲线?*

椭圆曲线并不是椭圆的,只是因为椭圆曲线的描述方程,类似于计算一个椭圆周长的方程故而得名。一条椭圆曲线就是一组被y^2^ = x^3^ + ax + b定义的且满足4a^3^ + 27b^2^ ≠ 0 (这个限定条件为了保证曲线不含奇点,即曲线上任何一点都存在切线)

椭圆曲线中的阿贝尔群:

​ ①群中的元素就是椭圆曲线上的点;

​ ②单位元就是无穷处的点0;

​ ③相反数P,是关于X轴对称的另一边的点;

​ ④二元运算规则定义如下:取一条直线上的三点(这条直线和椭圆曲线相交的三点),PQR(皆非零),他们的总和等于0,P+Q+R=0。

*离散对数问题*

ECC算法是在有限域Fp定义公式: Q = k*P,已知大数k和点P的情况下,很容易求点Q,但是已知点P、点Q,却很难求得k,这就是经典的离散对数问题,ECC算法正是利用该特点进行加密,点Q为公钥,大数k为私钥,点P为基点,和RSA最大的实际区别主要是密钥长度。

椭圆曲线加密算法原理

描述一条Fp上的椭圆曲线,常用到六个参量:T=(p,a,b,n,x,y)

(p,a,b)用来确定一条椭圆曲线,p为素数域内点的个数,ab是其中的两个大数;x,y为G基点的坐标,也是两个大数;n为G基点的阶。

以上六个量就可以描述一条椭圆曲线,有时候我们还会用到h(椭圆曲线上所有点的个数p与n相除的整数部分)h≤4,p≠n*h。

利用椭圆曲线进行加密的过程

①选定椭圆曲线Ep(a,b),并取椭圆曲线上的一点,作为基点P。

​ ②选择一个大数k作为私钥,并生成公钥 Q=k P。

​ ③将Ep(a,b)和点Q、P传给用户。

​ ④用户接到信息后,将待传输的明文编码到Ep(a,b)上的一点M,并产生一个随机整数r。

​ ⑤公钥加密(密文C是一个点对):C = { r P , M+rQ }

⑥私钥解密(M+rQ - k(rP),解密结果就是点M),公式如下:

M + rQ - k(rP) = M + r(kP) - k(rP) = M

​ ⑦对点M进行解码就可以的到明文

如今ECC应用范围很广,在TLS、区块链、SM2国密算法、证书、银行政府机构等许多方面都有大量应用。

Curve25519加密算法

Curve25519 是目前最高水平的 Diffie-Hellman函数,适用于广泛的场景,由Daniel J. Bernstein教授设计。在密码学中,Curve25519是一个椭圆曲线提供128位安全性,设计用于椭圆曲线Diffie-Hellman(ECDH)密钥协商方案。它是最快的ECC曲线之一,并未被任何已知专利所涵盖。给定一个用户的32字节密钥,curve25519计算该用户的32字节公钥。给定该用户的32字节密钥和另一个用户的32字节公钥,curve25519计算一个32字节的共享密钥提供给这两个用户使用。然后可以使用这个秘密对两个用户进行身份验证和信息加密。

https://blog.csdn.net/u011897062/article/details/89633193

对称加密

****优点:****①更容易配置和撤销 ②使用时更容易保护 ③更快的执行速度 ④降低功耗、内存和CPU使用率 (与RSA和ECC相比) ⑤降低每个密钥的成本

****缺点:****密钥数量随着参与方的增长而呈指数级增长

高级加密标准(AES)

RC2

零知识密钥

在零知识密码系统中,证明者能够向验证者证明其知道秘密,而不必在操作阶段的任何时间泄露秘密。验证者可以提问以确认证明者确实知道秘密,但验证者或任何第三方都无法发现有关该秘密的信息。

实现零知识性,允许你安全地向他人进行证明。交互的消息能构成一个证明(仍然体现了传统证明的精髓)而它们本身不泄漏“断言为真”之外的任何知识。这里的“知识”可以理解为“计算能力”,证明是“零知识的”意味着整个证明过程没有增加验证者的计算能力(即验证者之前无法解决的问题在证明完成之后仍然无法解决)。这个性质保证了交互完成后验证者只知道被证明的断言为真,但他并不知道怎么转而向其他人证明这一断言,它的代价是会产生一些微小的错误。
这里一个比较精确一点的例子就是向红绿色盲来证明两个球着色不同(一个红一个 绿):视觉正常的证明者持有的传统证明/证据是眼里看到的不同颜色,他先将两个球分别放在色盲的两只手中,记住左右手中的颜色;色盲将手放背后,脑子里随机决定是否在背后交换手中的球,然后将双手握球展示给证明者并问他自己是否刚才在背后交换了手中的球,证明者通过对比之前色盲两手中球的颜色来回答他的问题。这一交互证明体现了上述传统证明系统的两点精髓,对于第二点, 这里带来了1/2的错误概率,即对于错误的断言(即两个球颜色相同),证明者仍能以1/2的概率骗过验证者,不过这可以重复多次来降低这一概率。零知识在这里显而易见:色盲在交互结束后除了相信他手中球是颜色不同的之外并没有得到任何额外的知识。

零知识证明一个显然的密码学应用就是身份认证。如你可以随机挑选两个素数p和q,在“分解整数是困难的”假设下,这构成了一个身份认证系统:验证方在证明完成后没有得到任何有关两个素因子的知识。

隐私计算

隐私计算是一类技术统称,旨在保护数据本身不对外泄露的前提下,实现数据分析计算。

隐私计算针对不同的应用场景、信任环境和需求,将不同技术、算法、接口集成在一个平台上,并结合人工智能、机器学习、区块链等跨学科技术,为用户提供综合的解决方案,使得“不分享数据、但分享数据的价值”成为可能。

隐私计算可区分数据承载的具体信息和计算价值,厘清数据使用的“权、责、利”,使得数据可以作为资产流通与变现。

关键技术

隐私计算的关键技术包括联邦学习、安全多方计算、机密计算、差分隐私、同态加密。其中,联邦学习、多方安全计算和机密计算目前应用最广。

联邦学习目前商业化更为成熟,适用于机器学习建模;多方安全计算目前支持的功能较少,适用于统计分析、查询等基本功能,但安全性更高;机密计算基于可信任硬件,可以减少对特有软件的信任依赖,但受到硬件采购成本、对硬件厂商信任度等因素的制约。

隐私计算将贯穿整个IaaS基础算力层、BaaS、SaaS服务层。

算力层,隐私计算与云计算作为重要的IaaS基础设施,同时和AI存在融合空间,可以为数据交换、存储和计算协作的可信环境提供算法支撑

BaaS/SaaS层,隐私计算在数据价值挖掘环节可以发挥巨大作用,在金融、医疗、科学研究、社会征信、供应链金融、防伪溯源、社会治理等领域提供基于数据分析的应用服务。

应用场景

隐私计算已在金融、政府、营销、医药等场景初步商业落地,具体应用模式包括跨域分布式身份的认证、数据授权分享、区块链钱包管理与隐私交易、数据安全匹配、多方联合建模、安全建模应用等。

**1)金融场景:**主要应用包括数字营销、风控与反欺诈、存客激活与信用分析等。

金融行业数据交易多,对风控要求高;客户付费能力强,数字化程度高,因此是隐私计算的最佳切入点。

**2)政府场景:**主要应用涉及能源、交通、规划、环保等多行业和多部门。

政务领域具有较完备的数据基础,但需要打通并共享各部门数据,才能支撑各项应用。

**3)营销场景:**主要应用在精准获客等环节,包括消费者的信息、购买能力等,以便为不同的消费人群提供定制化的服务。

**4)医疗场景:**主要应用在精准医学、AI制药的核心要素。

医疗机构中的病例数据是最重要的隐私数据,但是单个医疗机构的数据样本不足以支撑大规模的模型训练,需要多方共享数据。

随着三大运营商打造大数据安全开放平台,地方政府安全开放共享政务数据,金融机构需要在风控、营销场景中进行大数据内外融合,大数据安全计算与数据服务将迎来极佳机会点。

联邦学习

区块链与联邦学习结合的学习网址:

https://blog.csdn.net/sgentle/article/details/116139971

共识机制

所谓共识机制,就是区块链中的节点,其中包括诚实节点和恶意节点,如何写入下一个区块达成共识。

把出现故障但不会伪造信息的情况称为“非拜占庭错误”或“故障错误”;伪造信息恶意响应的情况称为“拜占庭错误”。

由 Eirc Brewer 提出,Lynch 等人证明的 CAP 定理为解决分布式系统中的一致性问题提供了思路。CAP 定理的描述如下:在分布式系统中,一致性可用性和分区容错性三者不可兼得。这三个术语的解释如下:

  • 一致性(Consistency):所有节点在同一时刻拥有同样的值(等同于所有节点访问同一份最新的数据副本
  • 可用性(Availability):每个请求都可以在有限时间内收到确定其是否成功的响应
  • 分区容错性(Partition tolerance):分区是指部分节点因为网络原因无法与其他节点达成一致。分区容错性是指由网络原因导致的系统分区不影响系统的正常运行。例如,由于网络原因系统被分为 A, B, C, D 四个区,A, B 中的节点无法正常工作,但 C, D 组成的分区仍能提供正常服务。

工作量证明(POW)proof of work

可以容纳一半以下算力时的任何错误的发生,但是对资源消耗高,共识时间慢,常用于比特币、以太坊等初期公链项目中。出块慢、吞吐量小、耗电量大。(导致人们构建越来越大型的挖矿设备,电力消耗严重,促进矿池的产生,让区块链变得中心化)

PoW 机制的大致流程如下:

  1. 向所有节点广播新交易和一个数学问题
  2. 最先解决了数学问题的节点将交易打包成区块,对全网广播
  3. 其他节点验证广播区块的节点是否解决了数学问题(完成了一定的工作量),验证通过则接受该区块,并将该区块的哈希值放入下一个区块中,表示承认该区块

由于在 PoW 机制中,区块的产生需要解决一个数学问题,也就是所谓的挖矿,这往往要消耗较大的算力和电力,因此节点们倾向于在最长的链的基础上添加区块,因为如果节点想在自己的链上添加新的区块,那么就需要重新计算 1 个或 n n n 个这样的数学问题(每添加一个区块就需要计算一个)。因此在比特币中最长的链被认为是合法的链,这样节点间就形成了一套“共识”。

PoW 机制的优点是完全去中心化,缺点是需要依赖数学运算,资源的消耗会比其他的共识机制高,可监管性弱,同时每次达成共识需要全网共同参与运算,性能较低。

权益证明(POS)proof of stake

POS原理的核心概念为币龄,即持有货币的时间,例如有10个货币,持有90天,即拥有900币天的币龄,使用货币即意味着币龄的销毁。在POS中有一种特殊的交易成为利息币,即持有人可以销毁币龄获得利息,同时获得为网络产生区块以及POS造币的优先权。可以容纳一半以下算力时的任何错误的发生,减少资源消耗,效率提高,但是权益越高权力越大,最终会走向集中式发展。通过选举的形式,其中任意节点被随机选择来验证下一个区块,验证者也不是完全随机选择的,要成为验证者,节点需要在网络中存入一定数量的货币作为权益,可以将这理解为保证金,权益份额大小决定被选为验证者的几率,从而得以创建下一个区块,如果验证者通过了一些欺诈性的交易,他们将失去一部分权益,只要权益比交易费高,就是可行的。

PoS 针对 PoW 的缺点做出了改进。PoS 要求参与者预先放置一些货币在区块链上用于换取“股权”,从而成为验证者(Validator),验证者具有产生区块的权利。PoS 机制会按照存放货币的量和时间给验证者分配相应的利息,同时还引入了奖惩机制,打包错误区块的验证者将失去他的股权——即投入的货币以及产生区块的权利。PoS 机制的大致流程如下:

  1. 加入 PoS 机制的都是持币人,称为验证者
  2. PoS 算法根据验证者持币的多少在验证者中挑选出一个给予产生区块的权利
  3. 如果一定时间内没有产生区块,PoS 就挑选下一个验证者,给予产生区块的权利
  4. 如果某个验证者打包了一份欺诈性交易,PoS 将剥夺他的股权

PoS 的优点在于:

  1. 引入了利息,使得像比特币这样发币总数有限的通货紧缩系统在一定时间后不会“无币可发”
  2. 引入了奖惩机制使节点的运行更加可控,同时更好地防止攻击
  3. 与 PoW 相比,不需要为了生成新区块而消耗大量电力和算力
  4. 与 PoW 相比,缩短了达成共识所需的时间

由于 PoS 机制需要用户已经持有一定数量的货币,没有提供在区块链应用创立初始阶段处理数字货币的方法,因此使用 PoS 机制的区块链应用会在发布时预先出售货币,或在初期采用 PoW,让矿工获得货币后再转换成 PoS,例如以太坊现阶段采用的是 PoW 机制,在第四阶段“宁静”(Serenity)中将过渡到 PoS。

股份授权证明算法(DPOS)delegated proof of stake

DPOS既能解决POW在挖矿过程中产生的大量能源消耗的问题,也可以解决POS权益分配下可能产生的信任天平偏颇的问题。DPOS是由被社区选举的可信账户**(超级节点)**来创建区块。对恶意节点的惩罚:不按排程产生区块的超级节点将在下一轮被投票剔除,被没收缴纳的保证金。能耗与网络运行成本低、理论上更加去中心化、较快的确认速度、坏节点不能及时处理,只有经过选举才能清除坏节点、小散投票积极性不高、依赖代币。应用于比特股(Bitshare)密码货币。

DPoS 有更快的区块产生和确认速度,每个区块产生的时间仅为 10 秒,交易的确认时间仅为 1 分钟(6 -10 个节点确认),这与比特币运行机制中的 10 分钟产生一个区块,确认一笔交易需要一个小时时间来确认的速度大大提升。但是其缺点也十分明显,第一,网络中节点参与选举的参与度大幅度降低,因为投票选举需要耗费时间和精力,人的惰性使之不愿花费时间而直接获取利益。第二,对于网络中恶意节点的破坏阻止难度更大,给整个网络安全运行安全造成极大的威胁。

轮询算法

区块链上链设备的选择可根据轮询或系统规则匹配的方式进行区 块信息的上链,而避免通过 Pow 和 PoS 机制竞争上链,以减少计算和通信资源的过度浪费,有效保障 业务系统的可靠运行。

轮询算法是最简单的一种负载均衡算法。它的原理是把来自用户的请求轮流分配给内部的服务器:从服务器1开始,直到服务器N,然后重新开始循环。

算法的优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度。假设有N台服务器:S = {S1, S2, …, Sn},一个指示变量i表示上一次选择的服务器ID。变量i被初始化为N-1。该算法的伪代码如下:

j = i;
do
{
j = (j + 1) mod n;
i = j;
return Si;
} while (j != i);
return NULL;

轮询算法假设所有服务器的处理性能都相同,不关心每台服务器的当前连接数和响应速度。当请求服务间隔时间变化比较大时,轮询算法容易导致服务器间的负载不平衡。所以此种均衡算法适合于服务器组中的所有服务器都有相同的软硬件配置并且平均服务请求相对均衡的情况。

加权轮询算法(WeightedRound-Robin)

轮询算法并没有考虑每台服务器的处理能力,实际中可能并不是这种情况。由于每台服务器的配置、安装的业务应用等不同,其处理能力会不一样。所以,加权轮询算法的原理就是:根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权值数的服务请求。

首先看一个简单的nginx负载均衡配置。

http { 
upstream cluster { 
server a weight=1; 
server b weight=2; 
server c weight=4; 
} 
...
} 

按照上述配置,Nginx每收到7个客户端的请求,会把其中的1个转发给后端a,把其中的2个转发给后端b,把其中的4个转发给后端c。

加权轮询算法的结果,就是要生成一个服务器序列。每当有请求到来时,就依次从该序列中取出下一个服务器用于处理该请求。比如针对上面的例子,加权轮询算法会生成序列{c, c, b, c, a, b, c}。这样,每收到7个客户端的请求,会把其中的1个转发给后端a,把其中的2个转发给后端b,把其中的4个转发给后端c。收到的第8个请求,重新从该序列的头部开始轮询。

总之,加权轮询算法要生成一个服务器序列,该序列中包含n个服务器。n是所有服务器的权重之和。在该序列中,每个服务器的出现的次数,等于其权重值。并且,生成的序列中,服务器的分布应该尽可能的均匀。比如序列{a, a, a, a, a, b, c}中,前五个请求都会分配给服务器a,这就是一种不均匀的分配方法,更好的序列应该是:{a, a, b, a, c, a, a}。

网址: [负载均衡之加权轮询算法 - -零 - 博客园 (cnblogs.com)](https://www.cnblogs.com/-wenli/p/11664191.html#:~:text=轮询算法是最简单的一种负载均衡算法。,它的原理是把来自用户的请求轮流分配给内部的服务器:从服务器1开始,直到服务器N,然后重新开始循环。 算法的优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度。)

拜占庭容错(PBFT)

是联盟链普遍使用的共识算法,可以容纳三分之一的错误(3f+1个节点时,容纳f个节点出错),效率相对更高,但是节点数量受限,规模不能过大。要求所有节点之间两两通信,因此要求节点不宜过多,通常是几十个。效率高、吞吐量高、节能、可拓展性及去中心化较弱、容错性较低。PBFT算法的节点数量是固定的,节点身份提前确定,无法动态添加或删除,只能适用于节点数目固定的联盟链或私有链场景中。一般适用于对强一致性有要求的私有链和联盟链场景,但如果结合DPOS节点代表选举规则,也可以应用于公有链,并且可以在一个不可信的网络里解决拜占庭容错问题。在Hyperledger Fabric项目中,共识模块被设计成可插拔的模块,支持像PBFT、Raft等共识算法。

拜占庭将军问题是分布式网络中的通信容错问题,可以描述为:

一组拜占庭将军各领一支队伍共同围困一座城市。各支军队的行动策略限定为进攻或撤离两种。因为部分军队进攻而部分军队撤离可能会造成灾难性的后果,因此各将军决定通过投标来达成一致策略,即“共进退”。因为各将军位于城市不同方向,他们只能通过信使互相联系。在投票过程中每位将军都将自己的选择(进攻或撤退)通过信使分别通知其他所有将军,这样一来每位将军根据自己的投票和其他所有将军送来的信息就可以知道共同投票的结果,进而做出行动。

拜占庭将军的问题在于,将军中可能出现叛徒。假设3名将军中有1名叛徒,2名忠诚将军一人投进攻票,一人投撤退票,这时叛徒可能会故意给投进攻的将军投进攻票,而给投撤退的将军投撤退票。这就导致一名将军带队发起进攻,而另外一名将军带队撤退。

另外,由于将军之间通过信使进行通讯,即使所有将军都忠诚,也不能排除信使被敌人截杀,甚至信使叛变等情况。

假设存在叛变将军或信使出问题等情况,如果忠诚将军仍然能够通过投票来决定他们的战略,便称系统达到了拜占庭容错(Byzantine Fault Tolerance)

拜占庭问题对应到区块链中,将军就是节点,信使就是网络等通信系统,要解决的是存在恶意节点、网络错误等情况下系统的一致性问题。

简化版拜占庭容错(RAFT)

{先选出领导节点}{主要阶段:①领导者选举②同步日志}不能容纳拜占庭错误,基于联盟链与参与方之间已有一定的信任基础,常用于联盟链中。 在日常中更多的是计算机故障挂掉了或者网络通信问题无法传递信息,这种情况不考虑计算机之间发送恶意消息。每个系统节点有三种状态:Follower、Candidate、Leader。实现Raft算法两个最重要的事是:选主和复制日志。

Paxos算法(Paxos)

Paxos算法是基于消息传递且具有高度容错特性的一致性算法,是目前公认的解决分布式一致性问题最有效的算法之一,其解决的问题就是在分布式系统中如何就某个值(决议)达成一致。Paxos算法的前提假设是不存在拜占庭将军问题,即:信道是安全的(信道可靠),发出的信号不会被篡改,因为Paxos算法是基于消息传递的。因此在对一致性的研究过程中,都往往假设信道是可靠的,而事实上,大多数系统都是部署在一个局域网中,因此消息被篡改的情况很罕见;另一方面,由于硬件和网络原因而造成的消息不完整问题,只需要一套简单的校验算法即可。因此,在实际工程中,可以假设所有的消息都是完整的,也就是没有被篡改。

Algorand 共识算法:

https://blog.csdn.net/omnispace/article/details/79653972?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161793563716780269893635%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=161793563716780269893635&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-2-79653972.pc_search_result_no_baidu_js&utm_term=algorand%E5%85%B1%E8%AF%86%E7%AE%97%E6%B3%95

P2P网络

P2P (Peer to Peer)是一种分散的网络通信模型,其中,对等节点是彼此连接的计算机平台中的,对等节点之间的通信无需中央平台(服务器)即可完成。
换句话说,网络中的每个对等节点既是服务器又是客户端。使用 P2P 通信的优点是可以保护用户隐私,降低服务器成本等。
计算机加入对等网络的唯一要求是 Internet 网络连接和 P2P 软件。常见的 P2P软件程序包括 Kazaa、Limewire、BearShare、Morpheus 和 Acquisition。这些程序连接到 P2P 网络,例如 Gnutella,它使计算机可以访问网络上成千上万的其他平台。

连接到网络后,P2P 软件允许您在其他人的计算机上搜索文件。同时,网络上的其他用户可以在您的计算机上搜索文件,但通常只能在您指定共享的单个文件夹中搜索。P2P 网络使文件共享变得容易和方便,同时也导致了许多软件盗版和非法音乐下载。

通过 P2P 网络下载相同文件时,处理流程和集中式有所不同。在这里,用户必须预安装对等软件,当用户下载文件时,该软件会创建一个对等用户的虚拟网络,该文件是从网络中已经具有该对等点的其他对等点传输来的比特数中接收到的。在接收到数据的同时,文件也被发送到网络中需要该资源的其他的对等方。

对等网络体系结构中的每个对等方都有相同的职责,每个对等方都是服务器和客户端。对等网络分类为三种类型:非结构化、结构化和混合网络。
在非结构化对等网络上没有覆盖网络设计的特定结构。它们由节点相互之间随机连接形成。因为没有结构,所以非结构化的对等网络很容易构建,但效率不高。

P2P 网络有许多便利的同时,其缺点也不容忽视。例如,数据没有组织到特定的共享区域中,有时可能很难找到文件;网络中的数据没有安全保障。因此P2P 网络的使用需要根据自身需求来使用。

以太坊

以太坊简介

以太坊是目前使用最广泛的支持完备应用开发的共有区块链系统。

和比特币不同,比特币只适合加密数字货币场景,不具备图灵完备性,也缺乏保存实时状态的账户概念,以及存在 PoW 机制带来的效率和资源浪费的问题,而以太坊作为区块链2.0的代表,目标是扩展智能合约和建立一个去中心化应用平台,具有图灵完备的特性、更高效的共识机制、支持智能合约等多种应用场景,使得开发者能够很方便地在以太坊上开发出基于区块链的应用。

以太坊的特点

以太坊团队和外界对以太坊的描述都是“世界计算机”,这代表它是一个开源的、全球的去中心化计算架构。它执行称为智能合约的程序,并使用区块链来同步和存储系统状态,以及使用名为以太币的加密数字货币来计量和约束执行操作的资源成本。同时,以太坊提供了一系列的接口,使得开发者能够通过以太坊来开发去中心化 Web 应用DApps。

幽灵协议

幽灵协议的英文是“Greedy Heaviest Observed Subtree" (GHOST) protocol,

假设目前以太坊区块链中的区块高度(区块链上的区块个数)为6,现在产生了一笔新的交易,矿工A先将该笔交易打包成了区块 Block 7,在矿工A将 Block 7 广播到其他节点的这段时间里,矿工B和矿工C又分别产生了 Block 8 和 Block 9。Block 7、Block 8、Block 9 都指向 Block 6,即 Block 6 是他们的父区块。由于 Block 7 是最先产生的,因此 Block 7 被认为是有效区块,Block 8 和 Block 9 就是叔区块(作废区块)。

现在链上的区块高度为7,在这基础上又产生了新的交易,并被打包成了 Block 10。在以太坊中,Block 10 除了可以引用它的父区块 Block 7 外,还可以引用叔区块 Block 8 和 Block 9。并且,Block 8 和 Block 9 的矿工会因此获得一笔奖励,称为叔块奖励,Block 10 的矿工除了基础奖励之外,由于引用了叔区块,还会获得一笔额外的叔块引用奖励

幽灵协议是以太坊的一大创新。由于在比特币中的出块时间被设计为10分钟,而以太坊为了提高出块速度,将出块时间设计为12秒(实际14~15秒左右),这样的高速出块意味着高速确认,高速确认会带来区块的高作废率低安全性。因为区块需要花一定的时间才能广播至全网,如果矿工 A 挖出了一个区块,而矿工 B 碰巧在 A 的区块扩散至 B 之前挖出了另一个区块,矿工 B 的区块就会作废并且没有对区块链的网络安全做出贡献。此外,这样的高速确认还会带来中心化的问题:如果 A 拥有全网 30% 的算力而 B 拥有 10% 的算力,那么 A 将会在 70% 的时间内都在产生作废区块,而 B 在 90% 的时间内都在产生作废区块,这样,B 永远追不上 A,后果是 A 通过其算力份额拥有对挖矿过程实际上的控制权,出现了算力垄断,弱化了去中心化。

幽灵协议正是为了解决上述问题而引入的,协议的主要内容如下:

  • 计算最长链时,不仅包括当前区块的父区块和祖区块,还包括祖先块的作废的后代区块(叔区块),将它们综合考虑来计算哪一个区块拥有支持其的最大工作量证明。这解决了网络安全性的问题
  • 以太坊付给以“叔区块”身份为新块确认作出贡献的废区块87.5%的奖励(叔块奖励),把它们纳入计算的“侄子区块”将获得奖励的12.5%(叔块引用奖励)。这就使得即使产生作废区块的矿工也能够参与区块链网络贡献并获得奖励,解决了中心化倾向的问题
  • 叔区块最深可以被其父母的第二代至第七代后辈区块引用。这样做是为了:
    • 降低引用叔区块的计算复杂性
    • 过多的叔块引用奖励会剥夺矿工在主链上挖矿的激励,使得矿工有转向公开攻击者链上挖矿的倾向(即公开攻击者可能会恶意产生大量作废区块,无限引用将会诱使矿工转移到攻击者的链上,从而抛弃合法的主链)
    • 计算表明带有激励的五层幽灵协议即使在出块时间为15s的情况下也实现了了95%以上的效率,而拥有25%算力的矿工从中心化得到的益处小于3%

以太坊的组成部分

在以太坊中,包括了 P2P 网络、共识机制、交易、状态机、客户端这几个组成部分。

  • P2P 网络:在以太坊主网上运行,可通过TCP端口30303访问,并运行称为 ÐΞVp2p 的协议。
  • 共识机制:以太坊目前使用名为 Ethash 的 POW 算法,计划在将来会过渡到称为 Casper 的 POS 算法。
  • 交易:以太坊中的交易本质上是网络消息,包括发送者、接收者、值和数据载荷(payload)。
  • 状态机:以太坊的状态转移由以太坊虚拟机(Ethereum Virtual Machine,EVM)处理,EVM 能够将智能合约编译成机器码并执行。
  • 客户端:用于用户和以太坊进行交互操作的软件实现,最突出的是 Go-Ethereum(Geth) 和 Parity。

以太坊中的概念

  • 账户:以太坊中的账户类似于银行账户、应用账户,每个账户有一个20字节的地址。账户又分为普通账户(又叫外部账户,External Owned Account, EOA)和合约账户(Contract)。普通账户是由以太坊使用者创建的账户,包含地址、余额和随机数;合约账户是创建智能合约时建立的账户,包含存储空间和合约代码
  • 状态:状态是由账户和两个账户之间价值的转移以及信息的状态转换构成的
  • 地址:地址是一个账户 ECDSA 公钥的 Keccak 散列最右边的160位,通过地址可以在以太坊上接收或发送交易。在 Etherscan 上,可以通过地址来查询一个账户的信息
  • 交易:以太坊中的交易不仅包括发送和接收以太币,还包括向合约账户发送交易来调用合约代码、向空用户发送交易来生成以交易信息为代码块的合约账户
  • Gas: Gas 是以太坊中的一种机制,用于执行智能合约或交易操作的虚拟燃料。由于以太坊是图灵完备的,为了避免开发者无意或恶意编写出死循环等浪费资源或滥用资源的情况,以太坊中的每一笔交易都需支付一定的 Gas (燃料费),即需支付一定的以太币作为 Gas。Gas 的金额通常是由交易的发起者指定并支付的
  • 挖矿:和比特币类似,以太坊同样通过挖矿来产生区块。在以太坊目前的 PoW 机制下,每当一笔交易发出并广播,就会吸引矿工来将该交易打包成区块。每产生一个区块都会有一笔固定奖励给矿工,目前的固定奖励是3个以太。同时,区块中所有操作所需的 Gas 也会作为奖励给矿工。与比特币不同的是,以太坊中产生叔块的矿工可能会获得叔块奖励,引用叔块的矿工会获得叔块引用奖励
  • DApp(去中心化应用):通过智能合约,开发者能够设计想要的逻辑,相当于是网站的后端。而 DApp 则相当于是一个完整的网站(前端+后端),因此 DApp = 智能合约 + Web 前端。以太坊提供了一个名为 web3.js 的 javascript 库,通过 web3.js 可以实现 Web 与以太坊区块链的交互和与智能合约的交互,方便开发者创建 DApp

以太坊交易的数据结构

在以太坊网络中,交易执行属于一个事务。具有原子性、一致性、隔离性、持久性特点。

  • 原子性: 是不可分割的最小执行单位,要么做,要么不做。
  • 一致性: 同一笔交易执行,必然是将以太坊账本从一个一致性状态变到另一个一致性状态。
  • 隔离性: 交易执行途中不会受其他交易干扰。
  • 持久性: 一旦交易提交,则对以太坊账本的改变是永久性的。后续的操作不会对其有任何影响。

以太坊交易的本质是由外部拥有的账户发起的签名消息,由以太坊网络传输,并被序列化后记录在以太坊区块链上,交易是唯一可以触发状态更改或导致合约在EVM中执行的事物

交易的数据结构

以太坊的数据结构主要可以分为四部分:noncegas、交易目标和消息(主要部分)、交易签名

开头是一个 uint64 类型的数字,称之为随机数。用于撤销交易、防止双花和修改以太坊账户的 Nonce 值。

第二部分是关于交易执行限制的设置,gas 为愿意供以太坊虚拟机运行的燃料上限。 gasPrice 是愿意支付的燃料单价。gasPrcie * gas 则为愿意为这笔交易支付的最高手续费。

第三部分是交易发送者输入以太坊虚拟机执行此交易的初始信息: 虚拟机操作对象(接收方 To)、从交易发送方转移到操作对象的资产(Value),以及虚拟机运行时入参(input)。其中 To 为空时,意味着虚拟机无可操作对象,此时虚拟机将利用 input 内容部署一个新合约

第四部分是交易发送方对交易的签名结果,可以利用交易内容和签名结果反向推导出签名者,即交易发送方地址。以上总结如下:

  • nonce:由发起人EOA发出的序列号,用于防止交易消息重播。
  • gas price:交易发起人愿意支付的gas单价(wei)。
  • start gas:交易发起人愿意支付的最大gas量。
  • to:目的以太坊地址。
  • value:要发送到目的地的以太数量。
  • data:可变长度二进制数据负载(payload)。
  • v,r,s:发起人EOA的ECDSA签名的三个组成部分。
  • 交易消息的结构使用递归长度前缀(RLP)编码方案进行序列化,该方案专为在以太坊中准确和字节完美的数据序列化而创建。

交易中的nonce

按以太坊黄皮书的定义, nonce是一个标量值,它等于从这个地址发送的交易数,或者对于关联code的帐户来说,是这个帐户创建合约的数量。因此nonce便有以下特征:

  • nonce不会明确存储为区块链中帐户状态的一部分。相反,它是通过计算发送地址的已确认交易的数量来动态计算的。
  • nonce值还用于防止错误计算账户余额。nonce强制来自任何地址的交易按顺序处理,没有间隔,无论节点接收它们的顺序如何。
  • 使用nonce确保所有节点计算相同的余额和正确的序列交易,等同于用于防止比特币“双重支付”(“重放攻击”)的机制。但是,由于以太坊跟踪账户余额并且不单独跟踪 UTXO ,因此只有在错误地计算账户余额时才会发生“双重支付”。nonce机制可以防止这种情况发生。

并发和nonce

以太坊是一个允许操作(节点,客户端,DApps)并发的系统,但强制执行单例状态。例如,出块的时候只有一个系统状态。假如我们有多个独立的钱包应用或客户端,比如 MetaMask 和 Geth,它们可以使用相同的地址生成交易。如果我们希望它们都够同时发送交易,该怎么设置交易的nonce呢?一般有以下两种做法:

  • 用一台服务器为各个应用分配nonce,先来先服务——可能出现单点故障,并且失败的交易会将后续交易阻塞。
  • 生成交易后不分配nonce,也不签名,而是把它放入一个队列等待。另起一个节点跟踪nonce并签名交易。同样会有单点故障的可能,而且跟踪nonce和签名的节点是无法实现真正并发的。

交易中的gas

Gas 中译是:瓦斯、汽油,代表一种可燃气体。 这形象地比喻以太坊的交易手续费计算模式,不同于比特币中直接支付比特币作为转账手续费, 以太坊视为一个去中心化的计算网络,当你发送Token、执行合约、转移以太币或者在此区块上干其他的时候,计算机在处理这笔交易时需要进行计算消耗网络资源,这样你必须支付燃油费购买燃料才能让计算机为你工作。最终燃料费作为手续费支付给矿工。

因为手续费等于gasPrice * gasUsed,用户在转账,特别是执行智能合约时 gasUsed 无法提前预知。 这样存在一个风险,当用户的交易涉及一个恶意的智能合约,该合约执行将消耗无限的燃料, 这样会导致交易方的余额全部消耗(恶意的智能合约有可能是程序Bug,如合约执行陷入一个死循环)。

为了避免合约中的错误引起不可预计的燃料消耗,用户需要在发送交易时设定允许消耗的燃料上限,即 gasLimit。 这样不管合约是否良好,最坏情况也只是消耗 gasLimit 量的燃料。

然而,一笔交易所必须支付的燃料已经在区块中通过该交易已执行的计算量记录。 如果你不想支出太多燃料,而故意设置过低的 gasLimit 是没太多帮助的。 你必须支付足够燃料来支付本交易所必要的计算资源。如果交易尚未执行完成,而燃料已用完, 将出现一个 Out of Gas 的错误。特别注意的是,即使交易失败,你也必须为已占用的计算资源所支付手续费。 比如,你通过合约给 TFBOYS 投票,设置 gasPrice=2 gwei,gasLimit=40000(实现投票需要40001的燃料开销), 最终你投票失败且仍然需要支付 40000*2 gwei= 80000 gwei= 0.00008 ETH。

另外,如果最终 gasUsed 低于 gasLimit,即燃料未用完。则剩余燃料(gasLimit - gasUsed )将在交易后退还给你。 比如你发送 1 Ether 到另一个账户B,设置 gas limit 为 400000,将有 400000 - 21000 返回给你。

注意:21000 是标准转账交易的gasUsed。因此一笔标准的转账交易你可以设置 gasLimit 为21000

以太坊账户

对比比特币的UTXO余额模型,以太坊使用“账户”余额模型。 以太坊丰富了账户内容,除余额外还能自定义存放任意多数据。 并利用账户数据的可维护性,构建智能合约账户。下面我们首先将比特币的UTXO余额模型与以太坊账户进行比较,说明其各自的优缺点以及适用性。

比特币UTXO

UTXO是 Unspent Transaction Output的缩写,意思是**未花费的输出,**可以简单理解为还没有用掉的收款。比如韩梅梅收到一笔比特币,她没有用掉,这笔比特币对她来说就是一个UTXO。关于UTXO的具体介绍可以查看这篇文章

**UTXO 核心设计思路是:它记录交易事件,而不记录最终状态。**要计算某个用户有多少比特币,就要对其钱包里所有的UTXO求和,得到结果就是他的持币数量。UTXO模型在转账交易时,是以UTXO为单位的,也就是说在支付时,调用的是整数倍UTXO,比如1个UTXO,3个UTXO,没有0.5个UTXO的说法。

  • 比特币在基于UTXO的结构中存储有关用户余额的数据,系统的整个状态就是一组UTXO的集合,每个UTXO都有一个所有者和一个面值(就像不同的硬币),而交易会花费若干个输入的UTXO,并根据规则创建若干个新的UTXO
  • 每个引用的输入必须有效并且尚未花费,对于一个交易,必须包含有每个输入的所有者匹配的签名,总输入必须大于等于总输出值。所以系统中用户的余额是用户具有私钥的UTXO的总值

以太坊账户

为什么以太坊不用UTXO呢?显然是因为麻烦,以太坊的做法更符合直觉,以太坊中的状态就是系统中所有账户的列表,每个账户都包含了一个余额和以太坊特殊定义的数据(代码和内部存储)。如果发送账户有足够多的余额来进行支付,则交易有效,在这种情况下发送账户先扣款,而收款账户将记入这笔收入。如果接受账户有相关代码,则代码会自动运行,并且它的内部存储也可能被更改,或者代码还可能向其他账户发送额外的消息,这就会导致进一步的借贷资金关系。

优缺点比较

比特币UTXO的优点

  • 更高程度的隐私:如果用户为他们收到的每笔交易使用新地址,那么通常很难将账户互相链接。这很大程度上适用于货币,但不太适用于任何dapps,因为dapps通常涉及跟踪和用户绑定的复杂状态,可能不存在像货币那样简单的用户状态划分方案
  • 潜在的可扩展性:UTXO在理论上更符合可扩展性要求,因为我们只需要依赖拥有UTXO的那些人去维护基于Merkle树的所有权证明就够了,即使包括所有者在内的每个人都决定忘记该数据,那么也只有所有者受到对应的UTXO的损失,不影响接下来的交易。而在账户模式中,如果每个人都丢失了与账户相对应的Merkle树的部分,那将会使得和该账户有关的消息完全无法处理,包括发币给它。

以太坊账户模式的优点

  • 可以节省大量空间:不将UTXOs分开存储,而是合成一个账户;每个交易只需要一个输入、一个签名并产生一个输出
  • 更好的可替代性:货币本质上都是同质化、可替代的;UTXO的设计使得货币从来源分成了“可花费”和“不可花费”两类,这在实际应用中很难有对应模型
  • 更加简单:更容易编码和理解,特别是设计复杂脚本的时候,UTXO的脚本逻辑复杂时更令人费解
  • 便于维护持久轻节点:只要沿着特定方向扫描状态树,轻节点 可以很容易地随时访问账户相关的所有数据。而UTXO地每个交易都会使得状态引用发生改变,这对应节点来说长时间运行Dapp会有很大压力

外部账户(EOA)

外部账户是由人来控制的,也就是常规理解的普通账户,外部账户包含以太币余额,主要作用就是发送交易(是广义的交易,包括转币和触发合约代码),是由用户私钥控制的,没有关联代码,所有在以太坊上交易的发起者都是外部账户。

外部账户特点总结:

  1. 拥有以太余额。
  2. 能发送交易,包括转账和执行合约代码。
  3. 被私钥控制。
  4. 没有相关的可执行代码。

合约账户

合约账户有时也叫内部账户,有对应的以太币余额和关联代码,它是由代码控制的,可以通过交易或来自其他合约的调用消息来触发代码执行,执行代码时可以操作自己的存储空间,也可以调用其他合约

合约账户特点总结:

  1. 拥有以太余额。
  2. 有相关的可执行代码(合约代码)。
  3. 合约代码能够被交易或者其他合约消息调用。
  4. 合约代码被执行时可再调用其他合约代码。
  5. 合约代码被执行时可执行复杂运算,可永久地改变合约内部的数据存储。