# 区块链基础

By [cxy's blog](https://paragraph.com/@cxy-s-blog) · 2023-01-08

---

区块链原理
=====

基于哈希算法，然后通过复杂的方式生成密码学证明

hash
----

💡 以太坊中使用的算法是`keccak25`

哈希是一个独一无二的固定长度的字符串，用来代表一段data，他是通过将一个data传入“哈希函数”来生成的。哈希算法是一个函数，他可以计算一段数据，生成一个独一无二的哈希值

![](https://storage.googleapis.com/papyrus_images/d3ba72eb96a4907e531e7f30783ff9bdc218cca212c84bf50c4052dd9ce27281.png)

区块
--

`value = hash(block number + nonce + data)`

![](https://storage.googleapis.com/papyrus_images/da80d9c3bcb684b2491e1d8003dac0683d1e1e9cd5898f532b26bc26a71703f4.png)

在这里矿工要解决的问题是，他们需要找到一个随机数nonce，使得对nonce、区块数和data的哈希是以`0000`开头

💡 挖矿（mining）是找到区块链难题的答案的过程。在这个例子中，这个难题是找到一个以4个0开头的哈希值。节点通过挖矿来获得收入，同时不同区块链要解决的难题也不同

区块链
---

`value = hash(block number + nonce + data + pre)`

![](https://storage.googleapis.com/papyrus_images/3740fad2eb07e8cb893f064c0de72ea9520525e7f94a19cc2a598e15fbe3294e.png)

💡 pre指针全是0的区块，被称为创世区块。是区块链中的第一个区块

**如果修改任意区块的data，会导致他后面的区块都无效，因为没有一个区块里的nonce能够生成正确的hash值（这是区块链不可篡改的原因）**。例如：

![](https://storage.googleapis.com/papyrus_images/d5ba5b7238c27f65988ffaf896e1e4d3fe2f10ff5a388c6b21a8a58b6deb7530.png)

修改的区块越靠前，重新hash运算的难度越大。

分布式/去中心化的区块链
------------

![](https://storage.googleapis.com/papyrus_images/ec4012997512b01c0376c816438bd50c73dc1990ae0c87f4b4d17fb44c300c10.png)

**如何决定那条链才是正确的链？**

通过最后一个区块的hash值。因为他包含了前面所有区块的信息。如果其中一个节点（节点A）的数据发生了变化，其他节点发现他最后一个区块的hash与自己的不同时，会指出节点A的错误，并且节点A不会获得挖矿奖励。因为节点A实际上分叉出了一条区块链，记录他自己的历史数据。

代币
--

![](https://storage.googleapis.com/papyrus_images/7a9539a8fa3fc55d5bcf6c8fcbc24f1e211e44f99e2b48da9ab9acc2dc238a7e.png)

**hash（哈希）**：哈希是一个独一无二的，固定长度的字符串，他可以代表一段数据。

**hash algorithm（哈希算法）**：哈希算法是一个函数，他可以计算一段数据，生成一个独一无二的哈希值。

**mining（挖矿）**：挖矿（mining）是找到区块链难题的答案的过程。在上面例子中，这个难题是找到一个以4个0开头的哈希值。节点通过挖矿来获得收入，同时不同区块链要解决的难题也不同。

**block（区块）**：区块由块高（block number），随机数(nonce)，交易(tx)和前一个区块的哈希值组成。这个区块的哈希值可以通过着四个参数生成。（当然，区块链的不同，区块可能有不同的信息）。

*   nonce是用来的到这个哈希值的数字
    

**区块链**：区块链是去中心化或者说是分布式的，因为很多不同的用户在运行这个区块链软件。他们会彼此检查和对比，哪些是诚实节点，哪些是恶意节点。区块链的状态，是被大多数节点决定的。

签名交易
====

> **怎样确认交易确实是由某个人发出的？**

公钥/私钥对
------

![](https://storage.googleapis.com/papyrus_images/3c9db36f779fc5b90a4310c84bddaa416de8709189090f966db4362d2db984bc.png)

签名
--

![](https://storage.googleapis.com/papyrus_images/b4afbccbab05c085eeaebc29a0413d5b7b79bf45bd3c519c7d7e93ea40ded961.png)

![](https://storage.googleapis.com/papyrus_images/b506097456f695e05bdd2b3acdbcdffeb1fc0337df5418b1b5313964a4bd62c0.png)

使用公钥对信息进行验证，得到一个和私钥签名相同的结果。如果有人仿造你的签名，别人只需要用你的公钥验证这个签名，就可以发现签名是错误的

对交易进行签名
-------

![](https://storage.googleapis.com/papyrus_images/351206382425332cd65650d7c05112b27f822a83798bb94d4166932eb5a895d8.png)

![](https://storage.googleapis.com/papyrus_images/67ef75d0cdfbf348821e5208bc6ddc91aeb8e89869543e9ac353a4be0b0527ba.png)

*   公钥：是通过对私钥使用签名算法得到的。任何人都可以看到他，并且用它验证一个交易的来源是你。
    
*   对交易进行签名：拥有私钥的人，可以通过使用私钥对交易数据进行哈希运算，从而对交易进行签名。在签名中无法获得你的私钥，但是，任何拥有你的公钥的人都可以验证这个新交易的哈希。（在以太坊中，可以理解为，私钥生成公钥，公钥生成地址）
    

gas
===

区块链是在不同的节点被运行的。不同的节点运行区块链是因为他们可以通过区块链上的交易获得收入。当你创建一个交易时，就会有一个节点（或者叫矿工和验证者）。某个运行区块链软件的人，他们会被支付一小部分以太坊、polygon或者其他区块链的原生代币，这些收入会激励人们运行节点。他们的收入是又gas使用量来决定的。gas是一个计量单位。要使用更多的计算资源，就需要支付更多的gas，例如：

![](https://storage.googleapis.com/papyrus_images/a2f786f612d598e9fe4d06be9659b42bb7e7e65015fb5e1bc4df19ed662bed68.png)

💡 Transaction Fee = Gas Price \* Usage by Txn

区块奖励
----

💡 一个链用的人越多，发送交易就越贵

![](https://storage.googleapis.com/papyrus_images/a2f786f612d598e9fe4d06be9659b42bb7e7e65015fb5e1bc4df19ed662bed68.png)

交易总费用 = （区块基础费 + 最大优先费）\* gas使用数量

![](https://storage.googleapis.com/papyrus_images/a399654c5ada04d7934370e7e1e57435d86b30e1cf0e0de0a65d30557f330a1a.png)

在发送交易时，由于交易发送时间和指令不同，花费的gas可能比预计的多

*   gas price： 每个gas的话费
    
*   gas limit： 交易花费gas的上限（愿意为这个交易话费的gas数量788）
    
*   max priority: max gas fee + 我们愿意给矿工的最多的费用
    
*   base gas fee：每个gas消费的基础网络费或者叫做交易的最小gas费（在以太坊中，这个费用会被燃烧掉。这意味着，每次转账的时候，一部分以太币会永远不再流通，会被燃烧掉）
    
*   max gas fee：我们愿意为这个交易付多少gas费
    
*   burnt：燃烧掉的费用（`gas limit * base gas fee`）
    
*   支付给以太坊矿工的以太币数量 = transacation fee - burnt
    
*   txn saving fees： 实际支付费用和费用上限之间的差额
    

gas price、gas fee都是每个gas的费用

💡 在区块链中，区块能存储交易的空间有限，为了让你的交易被写在某个区块中，你需要支付手续费，这个手续费会根据需求变化。以太坊的base gas 费用会上下调节。调节的依据是有多少人正在发送交易，想把交易写入这个区块中。如果有很多人想将交易写入区块，那就有大量的gas会被烧掉

base gas fee 会被算法调整适配，调整的目标是期望每个区块被写入50%。如果被写入超过50%，base fee就会上涨；如果小于50%，base fee就会下降。

![](https://storage.googleapis.com/papyrus_images/40cbf20241f459a4ad0f822dc23b5833a3e7e5a2cfa6325840e86076aad47e02.png)

EIP1559
-------

[![]({{DOMAIN}}/editor/youtube/play.png)](https://www.youtube.com/watch?v=MGemhK9t44Q)

区块链概念性知识
========

node（节点）：在去中心化网络中的单一实例，运行区块链软件的节点。

blockchain（区块链）：如果一个节点活着一个运行了多个节点的主体关闭了，并不会出现问题。只要有一个节点在运行，区块链就会运行下去。每一个节点都保存着链上发生的所有的交易记录。如果有一个节点发生问题，所有的哈希值就会有问题，与其他节点的区块链不匹配。这让区块链有了不可篡改性。

共识（consensus）
-------------

工作量证明(PoW)和权益证明(PoS)都属于共识。挖矿就是工作量证明。共识的定义是一个机制，通过这个机制，区块链可以在状态和数值上达成一致。（例如：一个人修改了数据，别人不修改，那就会按大多数人的结果，将这个人踢出去）。区块链获得去中心化系统的共识协议，可以粗略的分为两部分：

*   Chain Selection(链的选择算法)
    
*   Sybil Resistance(抗女巫攻击机制)：指一种区块链的能力。这种能力可以防止用户使用大量的假身份在整个系统中，来获取超过应有比例的权益和影响力。通俗地讲，他防止某些人创建假的节点，然后获得越来越多的奖励。PoW和PoS都是抗女巫攻击机制。
    

💡 谁获得了交易手续费？在Pow中，是矿工。在PoS中，是验证者。

### Sybil Resistance(抗女巫攻击机制)

PoW(proof of work)是一种抗女巫机制。因为节点必须完成很大的计算量，也就是挖矿，从而找到区块链难题的答案，像是正确的nonce或者其他区块链所要求的答案。PoW能够抗女巫攻击，是因为不管一个用户有多少账户，每个账户都需要经过大量计算来找到答案。

实际上，每个区块链都有意让难题更难或者更简单，从而调整出块时间。出块时间是每个区块被发布之间的时间，他和这些算法的难度相关。所以难题的难度可以被调整，取决于系统想要多长的出块时间。

在PoW中，可以验证谁挖出了区块，所以他是抗女巫攻击的。

### Chain Selection(链的选择算法)

如何判断哪条区块链是正确的链呢。在比特币和以太坊中，是用了中本聪共识。中本聪共识包括了PoW和最长链规则。去中心化网络约定，哪条链最长，有最多的区块，就用哪条链。这很合理，因为一个链落后的区块越多，就需要越多的计算量来赶上其他链。这就是为什么有`确认区块`。确认区块的数量是在我们的交易写入区块后，新挖出的区块数量。

区块链中的攻击
-------

### Sybil Attack(女巫攻击)

在攻击中，单一用户会创建很多匿名账户，来影响区块链。在比特币和以太坊中，这种攻击很困难。因为用户在工作量证明中需要很多计算，在权益证明中，有很多质押物。

### 51% Attack(51%攻击)

作为共识协议的一部分，最长的链会被选择为正确的链，当你有最长的链和51%的网络，那就可以分叉区块链，让整个用户使用你的区块链。如果一些节点有足够的算力，他实际上就是51%的网络，从而影响区块链在他的方向上前进。

💡 综上所述，一个区块链越长，去中心化程度越高，越安全。

PoW工作量证明(proof of work)
-----------------------

在PoW中，节点会彼此竞争来解决区块链难题。所有节点会可能多的尝试，以便能第一个找到难题的答案。因为第一个找到答案的节点会获得交易手续费(transaction fee)和出块奖励，从而获得收入。收入有两部分：交易手续费(transaction fee)和出块奖励(block reward)。gas费（gas fee）就是为了写入交易而支付的手续费。出块奖励是由区块链协议自身发给节点的。每4年，出块奖励会减少一半。出块奖励会增加这个加密货币的流通量。有些区块链，比如比特币，会设置一个时间点，过了时间点就会取消出块奖励，到时矿工或者节点只能获得tansacation fee。gas fee是由发起交易的人支付的。在PoS中，也有transaction fee，但是这个费用是支付给验证者的。

PoS权益证明(proof of stake)
-----------------------

工作量证明很棒，他可以抵御女巫攻击，保证区块链的去中心化和安全。但是，他也有缺点。PoW需要消耗很多电力。每个节点都想算的越快越好，因为会增加获得奖励的概率。现在有其他的共识可以减少电力消耗，使能源更加环保，他就是权益证明。

权益证明也是一个抗女巫攻击机制。与解决难题的方式不同，权益证明需要放置一些抵押物以保证不作恶，也叫做质押(stake)。在以太坊2.0中，节点需要质押以太币以保证自己会诚实运行。如果他们没有诚实运行，他们会被踢出，或者质押会被扣掉。所以他也是抗女巫攻击的，因为就算你创建大量的匿名虚假账户，你还是需要在每个账户中加入质押，如果你没有正常运行，你就有失去你质押的资产的风险。在PoS中，矿工被称为验证者，因为他们不再需要挖矿，他们需要去验证其他节点。

在PoW中，每个节点需要竞争第一个挖到区块。而在PoS中，节点会被直接选举出来，然后提出一个区块，别的节点会验证这个被提出的区块是否有效。从上面讲解的密码学知识了解到，去检查一个协议或者交易是否有效非常简单。

随机(Randomness)是区块链中一个重要的话题。因为区块链是一个确定性系统，而确定性系统没法产生随机数，那么在系统中如何选择随机验证者。每个区块链选择节点的方式都不同，但是以太坊2.0使用了RANDAO。RANDAO是一个去中心化自治组织，他们共同选择随机数，共同选择下一个生成随机数的几点。

很明显，权益证明也有自己的优缺点。优点是他有很好的抗女巫攻击机制，可以很好的决定哪个节点来提议下一个区块；另一个优点是获得新的区块所需的计算量大大降低，不同于让网络中所有的节点来做这件事，权益证明只需要一个节点来做，其他节点只需要验证。缺点是权益证明的网络被认为有一些不够去中心化。因为有质押的话费，这是参与权益证明的花费。权益证明的绿色环保的优点，是以太坊2.0使用他的两个原因之一，可以把对环境的不哈的影响降低99%。

可扩展性
----

如果同时有很多人发送交易，gas费用会非常高。因为区块的存储空间有限，节点存储的交易也有限，所以当很多人想要使用区块链的时候，gas费就会暴涨。这就会导致使用区块链的花费越来越高，因为人们想要将交易写入区块。这就意味着，使用系统的用户有一个上线，当gas费持续上涨的时候，经济就会出现限制。以太坊2.0将工作量证明改为权益证明，除了因为环保原因以外，还是用了新的方法，叫做**分片(sharding)。**

分片就是可扩展性问题的一种解决方案。区块链的分片指的是多个区块链的区块链。有一个主链会协调一些不同的链，将他们连接起来。这意味着，人们可以在多个链上发送交易，很有效率的提高了区块链的空间。分片可以极大的增加在**layer1**上发送的交易数量。

*   layer1是区块链实现的基础层，比特币、以太坊和avalanche都是layer1。这些是区块链基础层的解决方案。
    
*   layer2是加在layer1和区块链上的任何应用，Chainlink、Arbitrum和Optimism都是layer2。Arbitrum和Optimism也是Rollups。他们把自己的交易集中起来，然后写入以太坊这样的layer1中。Rollups可以理解成区块链的一个分片，他继承了以太坊这样的基础链也就是layer1的安全性，他们都会把交易发送给layer1
    

总结
--

*   以太坊和比特币，目前都是工作量证明，使用的是中本聪共识；然而以太坊升级到2.0后，将会使用权益证明和分片。
    
*   工作量证明和权益证明杜绝了女巫攻击。
    
*   区块链越大，51%攻击越困难。
    
*   共识是区块链确定当前状态的机制。
    
*   分片和rollups是可扩展性的解决方案。
    
*   可扩展性问题，是因为区块空间不足导致的写入的交易有限，这会导致gas price很高。gas price是与区块链交互的费用。

---

*Originally published on [cxy's blog](https://paragraph.com/@cxy-s-blog/F5IuxH5X7kxTd40ZP6md)*
