5
头图

中心化网络已经帮助数十亿人融入了互联网,并在其上创建了稳定、可靠的基础设施。 与此同时,少数中心化巨头几乎垄断了互联网,甚至可以为所欲为。Web3 是摆脱这一困境的方案。 不同于科技巨头垄断的传统互联网,Web3 采用去中心化,由所有用户构建、运营和拥有。 Web3 将权力赋予个人而非公司...

——来自etherum官网文档

前言

按学习路线不定期分享我自身入行区块链领域学习心得和笔记,欢迎纠正和交流~

学习路线

区块链理论部分:北京大学肖臻老师《区块链技术与应用》公开课

以太坊浏览器:etherscan

合约实战:openzeppelin

etherscan增强插件:MetaDock

交易浏览器:Phalcon

DApp开源项目:Uniswap

NFT市场:Opensea

发展历程

用一张图大致回顾一下 web 发展的3个主要时代:

  • web1时代(1990 年至 2004 ):互联网站点以门户网站为主,大多用来获取信息,那时候的网站信息以文字为主。
  • web2时代(2004 年 - 至今):axios的出现让网站有了及时交互性,大多数网站都是用js框架开发而不单纯的是为了获取信息,前端工程师岗位也由此兴起,大部分企业开始注重用户体验。
  • web3时代:通过区块链、加密货币和非同质化代币将权力以所有权的形式归还用户。

区块链

区块链(blockchain)就是使用哈希指针区块组成的链表.

区块(block):累积了一定数量的交易后,会产生一次结算,把刚刚累积的交易信息用高级密码学打包成交易区块。

链(chain):链会依照区块结算的时间先后,把区块一个个依序串连,形成锁链一样不断延伸这条链。

创世纪块: 第一个区块, 区块链的头, 写死在代码中。

对于 web3 前端从业人员来说,图中每个区块都可以看作是一台服务器,里面保留了当前区块打包的交易数据,在以太坊中,合约也部署在这样的区块中,它是通过一笔特殊的交易(receiver 是0地址)被打包进区块。

后面会提到的 DApp (去中心化应用)本质上跟 web2 应用的区别就是:DApp 是从我们前端应用通过 RPC 访问这些区块中的数据,而以往的项目都是通过 http 请求从我们中心化的服务器上获取数据。

区块

每个区块包含两个部分: 区块头(记录当前区块的特征值)和区块体(实际数据),其中区块头包含了当前区块的多项特征值:

  • 生成时间
  • 区块体哈希
  • 上一个区块的哈希
  • nonce
  • ...

区块头结构:

SizeFieldDescription
4 bytesVersionA version number to track software/protocol upgrades
32 bytesPrevious Block HashA reference to the hash of the previous (parent) block in the chain
32 bytesMerkle RootA hash of the root of the merkle tree of this block’s transactions
4 bytesTimestampThe approximate creation time of this block (seconds from Unix Epoch)
4 bytesDifficulty TargetThe Proof-of-Work algorithm difficulty target for this block
4 bytesNonceA counter used for the Proof-of-Work algorithm

区块结构:

SizeFieldDescription
4 bytesBlock SizeThe size of the block, in bytes, following this field
80 bytesBlock HeaderSeveral fields form the block header
1–9 bytes (VarInt)Transaction CounterHow many transactions follow
VariableTransactionsThe transactions recorded in this block

块高

块高(block height)表示当前块在区块链中的位置,比如比特币的创世区块的区块高度就是是0,这个高度是由时间推移和新块产生而累加的。

加密货币

加密货币(crypto)是利于密码学基础确保交易安全及控制交易单位创造的交易媒介。常见的加密货币有比特币(第一个加密货币)、以太币(目前最火的币)等等,加密货币是去中心化的,他不由银行发行和验证,而是一个对等系统,可以使任何地方的任何人发起交易。

密码学基础

加密货币的原理主要应用了密码学基础中哈希算法和非对称加密。

如果大学课程有涉及都知道哈希其实就是一种散列算法,也就是将输入值打乱输出一系列散列值,散列值通常由短的字母数字组成。做过文件上传需求的都知道,上传文件前往往要计算文件的MD5值,这是为了保证文件的统一性,特别是在分片上传时,服务端如何把支离破碎的文件拼接起来,就是通过文件名、文件内容的哈希值对应其唯一性进行关联的。还有一个例子是我们 github 上如果要通过 ssh 拉取仓库代码(相比较 http 不需要输入账号密码就能确认身份)需要在设置里面配置 ssh 这个 ssh 是你本地生成的密钥对中的公钥,这个密钥对是通过 SHA 算法生成的,MD5SHA 都是哈希算法的典型代表。

由于哈希值是有可能被反推并且产生哈希碰撞的,所以在区块链应用中,哈希必须同时满足以下三条性质:

  1. 输入值必须足够大,输入值越大,理论上碰撞的概率就会越小。
  2. 不可逆,也就是没法从哈希结果反向推导或者输入的规律。
  3. 保证挖矿难度,除了暴力枚举,没有其他捷径,这也是为什么挖矿耗电的原因,因为矿机要24小时工作。

哈希碰撞

简单来说,哈希碰撞就是输入值不同,输出值相同。为什么会产生这种现象?

首先,这里补充一个概念,前面说了哈希算法是一种散列算法,把一串输入转成无规则的散列值,并且散列值往往是简短的,也就是说,输入值的可能性是无限的,但是散列表(一种 key - value 的映射关系表,为了解决查找效率)的范围是有限的,所以难免不同的输入产生相同的输出,这就产生了哈希碰撞。但是也有对应的解决方案,这里不做介绍。

那为什么区块链技术可以完全相信哈希算法?

2**256

这个号称加密世界里最强大的数字,2的256次方到底可不可靠?为什么说他是安全的?SHA-256 真的不用担心产生哈希碰撞吗?

相信我们大多数人都知道,电脑里的GPU 可以飞快地进行大量并行计算,因此要是你专门让GPU 反复计算密码哈希函数,一个性能很好的GPU 每秒也许能算出接近10 亿个哈希值,假如你拥有一堆这样的GPU,然后全部塞进电脑里,让你的电脑每秒能计算出40 亿个哈希值,那么最开始的40 亿,就代表了每台电脑每秒算出的哈希值数目,想像一下40 亿台这样满载GPU 的电脑_对比一下,虽然Google没有对外公布他们的伺服器数量,但有人估算大约有几百万台,而现实中Google的大部分伺服器算力都不如我们满载GPU 的电脑,不过我们假设Google把上百万个伺服器全部换成满载GPU 的电脑,那么40 亿台电脑大概就相当于1000 个这种「打了鸡血」的Google,为了更好地解释,我们暂时把这种算力成为「Thousand Google」。

现在,全世界人口总数大约有73 亿,接下来,我们假设有40 亿人人手都拥有一台这样的「Thousand Google」电脑。然后,再想像一下有40 亿个地球(作为对比,银河系检测到的恒星数量大约为1000-4000 亿颗,虽然不太确定,但估算大致就在这个范围),所以相当于银河系1% 的恒星会有一个地球,并且这个地球上超过一半的人口都拥有自己的「Thousand Google」电脑。

接着想像有40 亿个这样的银河系,我们把它叫做「亿万星系超级电脑」,每秒能猜「2 的160 次方」次。下面,40 亿秒大概是126.8 年,而它的40 亿倍就是5070 亿年,差不多是宇宙年龄的37 倍,所以就算你有_满载GPU 的40 亿台电脑+ 40 亿人手一台「Thousand Google」电脑 + 40 亿个像地球一样的行星 + 亿万星系超级电脑,再花上37 倍宇宙年龄的时间,也只有40 亿分之一的可能性得到密钥的正确答案。

顺便提一下,目前比特币的哈希算力:把所有矿工都加起来,每秒能猜测并检验500 亿亿个哈希值,只相当于之前提到的「Thousand Google」电脑算力的三分之一,不过矿工使用的是比GPU 算力强1000 倍左右的晶片,它叫做「专用积体电路(ASIC)」,这些硬体是为比特币挖矿量身定做的,但这种晶片什么都不会做,只会计算基于SHA256 算法的哈希值。但是在量子计算机真正普及之前,完全可以不用担心他的安全性。

可以结合这个网站来观察 SHA-256 算法下输入和输出值的变化。

在比特币网络中,就是应用了这种 SHA256 算法,有趣的是,比特币协议(的工作量证明)需要重复运行两遍 SHA-256 算法。请注意,这不是为了抵御生日攻击,毕竟在 hash(x) = hash(y) 的情况下,hash(hash(x)) = hash(hash(y)) 。双重 SHA-256 旨在抵御长度扩展攻击。

从本质上来说,所谓的长度扩展攻击,指的是如果恶意攻击者知道了某个哈希输入的长度,就可以在哈希值上添加一个秘密的字符串、欺骗哈希函数从其内部状态的一个特定部分开始计算。作为 SHA2 算法家族的一员,SHA256 也存在这一缺陷。因此,比特币采取执行两遍哈希计算的方式来解决这一缺陷。

非对称加密

交易时 私钥签名, 公钥验证。

随机生成私钥, 然后通过椭圆曲线乘法可以生成一系列公钥。

比特币不直接用公钥作为地址, 而是做了一系列变换:

A = RIPEMD160(SHA256(K))

A: 地址
K: 公钥

后续会再进行 base58 之类的编码,总之公钥和地址是一对一的,从公钥能够计算出地址,反之不行。

目前来说,你私钥丢了是找不回来的,因此,一定要备份好你的助记词或者秘钥串。

挖矿

简单来说就是盲猜 Nonce, 使得当前区块哈希 H(block header) <= target, 即前面必须有一定数目个0(例如 000000000000000000040b38097e0a61ef1ad31b184c908a738cfff013c094b2),其他节点可以根据nonce验证你算出来的值是否符合条件。

Nonce 值的作用

  • 用来挖矿,可以想象成是一个控制新的区块添加速度的开关,不能太快,也不能太慢,nonce 的范围调大一点,难度越大,出块速度就会下降。
  • 交易中的 Nonce 值 是指 from 账户发出交易的次数, 从0开始递增,同一账户的交易会被依次确认。有以下几个作用:

    • 确认交易顺序
    • 防止double spending
    • 撤销 pending 中的交易
    • 确定生成的合约地址

区块链数据的不可篡改性

Merkle tree 保存区块中的交易数据,和 binary tree 类似, 但是有两点不同:

  1. 使用哈希指针
  2. 只有叶节点存储交易信息, 中间节点存储左右子节点哈希的哈希

区块头包含很多内容,其中有当前区块体的哈希,还有上一个区块的哈希。这意味着,如果当前区块体的内容变了,或者上一个区块的哈希变了,一定会引起当前区块的哈希改变,因此,只要校验 Merkle Root Hash 就能检测出区块中交易是否有被篡改。

分叉

即使区块链是可靠的,现在还有一个问题没有解决:如果两个人同时向区块链写入数据,也就是说,同时有两个区块加入,因为它们都连着前一个区块,就形成了分叉。这时应该采纳哪一个区块呢?

现在的规则是,新节点总是采用最长的那条区块链。如果区块链有分叉,将看哪个分支在分叉点后面,先达到6个新区块(称为"六次确认")。按照10分钟一个区块计算,一小时就可以确认。

由于新区块的生成速度由计算能力决定,所以这条规则就是说,拥有大多数计算能力的那条分支,就是正宗的区块链。

共识机制

基于工作量证明 PoW

比特币网络节点之间通过用算力投票来争取记账权。也就是矿工同时基于当前最长链都在本地构建一个本地最新区块,谁先计算出符合要求的区块,相当于谁获得了当前区块的记账权。

假如多个节点同时计算出同一高度的区块, 则区块链会在短时间分叉, 每个节点会接收自己收到的第一个合法节点作为最长合法链,它也会基于这个区块来计算下一个区块,也就相当于投了这个区块一票,最终肯定会有一条成为最长合法链,剩下的链就会被淘汰。

挖矿奖励:挖矿消耗大量算力来保证区块链安全,所以每个区块产生都会奖励区块创造者一定量的比特币。最初为 50BTC,每经过 21W 个区块,奖励减半。

基于股权证明 Pos

ETH 的出块速度为十几秒,出块时间果断导致分叉为常态, 并且极易出现多分支状态,为了鼓励矿工在出现分叉后快速达成一致, ETH 引入了 uncle block 奖励机制:

  • 叔父区块定义为七代以内的有共同祖先的区块, 并且必须是分叉的第一个区块
  • 每个区块最多可包含两个叔父区块, 当前获取记账权的节点每提交一个叔父区块可以额外获得 1/32 出块奖励(出块奖励目前为 3ETH)的 ETH
  • 被提交的叔父区块会根据所处的代数获得 7/8 - 2/8 出块奖励的 ETH

与比特币一样,以太坊曾经也使用基于工作量证明共识协议(Pow),但是现在以太坊现在使用基于权益证明 (PoS) 的共识协议。

工作量证明是通过一定量的计算来验证交易并产生新的区块,与此不同的是,股权证明要求用户拥有一定数量的加密货币,可以理解成他们把自己拥有的数字货币来换取股权,一旦被验证他们打包有恶意交易,他们就会失去股权(加密货币)。

智能合约

智能合约是以太坊提出来的概念,可以理解为运行在以太坊区块链上的代码,由于区块链的不可篡改性,这种代码一旦你上链后就没法修改bug了,所以区块链行业代码审计业务成为了一些安全公司的核心的赚钱业务。

合约是一种以太坊账户,账户意味着有余额,可以成为交易的目标,但是他不受用户控制了,而且受已有的固定代码逻辑去执行,用户账户需要提交执行合约中定义的函数来与它进行交互。

部署合约也是发生一笔交易的过程,本质上是给0地址发送了一笔签名后的交易数据。

总结

这节概括了以太坊和比特币网络几个重要概念,掌握基础的理论和原理有助于加深对业务的理解,想深入了解区块链技术的还是建议参考网上资料。

关注公众号,回复web3,加入前端web3交流群~


MangoGoing
780 声望1.2k 粉丝

开源项目:详见个人详情