当前位置: 首页 > Web前端 > HTML

web3从入门到实战——理论

时间:2023-03-28 19:54:28 HTML

中心化网络帮助数十亿人融入互联网,并在其上打造了稳定可靠的基础设施。同时,少数中心化巨头几乎垄断了互联网,甚至可以为所欲为。Web3是解决这一难题的方法。与被科技巨头垄断的传统互联网不同,Web3是去中心化的,由所有用户共同构建、运营和拥有。Web3赋予个人而不是公司权力……——来自以太坊官网文档前言根据学习路线,我会不定期分享自己在区块链领域的学习心得和笔记。欢迎指正交流~学习路线区块链理论部分:北大老师肖震《区块链技术与应用》公开课以太坊浏览器:etherscan合约实践:openzeppelinetherscan增强插件:MetaDock交易浏览器:PhalconDApp开源项目:UniswapNFT市场:Opensea发展历程使用一张图粗略回顾web发展的三个主要方面时代:web1时代(1990年到2004年):Internet站点主要是门户网站,多用于获取信息,当时的网站信息主要是文本。web2时代(2004年至今):axios的出现让网站及时交互。大多数网站都是用js框架开发的,不仅仅是为了获取信息。前端工程师岗位也由此兴起,大部分公司开始关注用户体验。web3时代:通过区块链、加密货币和不可替代的代币,以所有权的形式将权力还给用户。区块链(blockchain)是由区块使用哈希指针组成的链表。区块(block):累积一定数量的交易后,会产生一个结算,将刚刚累积的交易信息使用高级密码学计算,打包成一个交易区块。链:链会根据区块的结算时间,依次将区块一个接一个地连接起来,形成一条链,不断延伸链。创世区块:第一个区块,区块链的头部,是硬编码的。对于web3前端从业者来说,图中的每个区块都可以看做是一台服务器,保存着当前区块打包的交易数据。在以太坊中,合约也是部署在这样的区块中。通过特殊交易(接收方为0地址)打包到区块中。后面提到的DApp(去中心化应用)和web2应用有着本质的区别:DApp从我们前端应用通过RPC访问这些block中的数据,而之前的项目都是通过http请求从我们这里获取中心化数据。来自服务器的数据。每个区块由两部分组成:区块头(记录当前区块的特征值)和区块体(实际数据),其中区块头包含当前区块的若干特征值:生成时间区块体哈希前一个块的哈希随机数...块头结构:SizeFieldDescription4bytesVersionAversionnumbertotracksoftware/protocolupgrades32bytesPreviousBlockHashAreferencetothehashoftheprevious(parent)blockinthechain32bytesMerkleRootAhashoftherootofthemerkletree这个块的交易的4字节时间戳这个块的大致创建时间(从UnixEpoch开始的秒数)4字节DifficultyTarget这个块的工作量证明算法难度目标4字节Nonce用于工作量证明算法块结构的计数器:SizeFieldDescription4字节BlockSize的大小块,以字节为单位,在这个字段之后80字节块头几个字段形成块头1–9字节(VarInt)TransactionCounter有多少笔交易跟随VariableTransactions记录在这个区块中的交易区块高度(blockheight)在区块链中的位置,比如比特币的创世区块的区块高度为0,这个高度是随着时间的流逝和生成而累积的新块。加密货币加密货币(crypto)是一种交易媒介,有利于以密码学为基础保证交易安全和控制交易单位的创建。常见的加密货币有比特币(第一种加密货币)、以太币(目前最火的货币)等。交易。基于密码学的加密原理主要应用了密码学基础上的散列算法和非对称加密。如果你接触过大学课程,你就会知道哈希实际上是一种哈希算法,它是将输入值打乱并输出一系列哈希值。散列值通常由短字母数字组成。做过文件上传需求的都知道,文件的MD5值往往是在上传文件之前计算出来的。这是为了保证文件的统一性,尤其是在分片上传的时候,服务器如何将分片的文件拼接在一起,是通过文件名和文件内容的哈希值来关联其唯一性的。再比如,如果我们想在github上通过ssh拉取仓库代码(相比http,不需要输入账号密码来确认身份),就需要在settings中配置ssh。此ssh是您本地生成的密钥对中的公钥,这个密钥对是由SHA算法生成的,MD5和SHA都是哈希算法的典型代表。由于哈希值很可能被颠倒而造成哈希碰撞,在区块链应用中,哈希值必须同时满足以下三个属性:输入值必须足够大,输入值越大,理论概率为碰撞会更小。不可逆,即不能从哈希结果反向推导出或输入的规律。要保证挖矿难度,除了暴力枚举没有别的捷径,这也是挖矿耗电的原因,因为矿机要24小时不间断工作。HashCollision简单的说,hashcollision就是当输入值不同而输出值相同时。为什么会出现这种现象?首先,这里要补充一个概念。前面提到过,哈希算法是将一串输入转化为随机哈希值的哈希算法,而哈希值往往很短,即输入值的可能性性质是无限的,但其范围哈希表(一种键值映射表,为了解决搜索效率)是有限的,所以不同的输入必然会产生相同的输出,这就产生了哈希冲突。但也有相应的解决方案,这里不再介绍。那为什么区块链技术可以完全信任哈希算法呢?2**256被称为加密世界中最强大的数字。2的256次方可靠吗?为什么说他安全?SHA-256真的不用担心哈希冲突吗?我相信我们大多数人都知道计算机中的GPU可以非常快速地进行大量并行计算,所以如果你专门让GPU重复计算密码哈希函数,一个好的GPU可能可以计算接近10亿个哈希每秒的值,如果你有一堆这样的GPU,然后把它们都放到电脑里,让你的电脑每秒计算40亿个哈希值,那么前40亿就是每台电脑计算哈希值每秒哈希值的数量,想象一下40亿台满载GPU的计算机。相比之下,尽管谷歌没有透露其服务器的数量,但有人估计有数百万台。在现实中,谷歌的大部分服务器的计算能力都不如我们满载GPU的电脑,但如果我们假设谷歌将其数百万台服务器全部换成满载GPU的电脑,那么40亿台电脑大致相当于1000个这样的“鸡血”谷歌,为了更好的解释,我们暂称这种算力为“千谷歌”。现在,世界总人口约为73亿。接下来,我们假设有40亿人拥有这样一台“千谷歌”电脑。那么,假设有40亿颗地球(作为对比,银河系探测到的恒星数量大约是100-4000亿颗,虽然不确定,但估计大致在这个范围内),所以相当于银河系中1%的恒星会有一个地球,这个地球上一半以上的人口都会拥有自己的“千谷歌”电脑。然后想象有40亿个这样的星系。我们称它为“亿万星系超级计算机”,每秒可以猜测“2的160次方”次。下面,40亿秒大约是126.8年,它的40亿次是5070亿年,几乎是宇宙年龄的37倍,所以即使你有_40亿台满载GPU的计算机+40亿人“千谷歌”计算机+40亿颗类地行星+亿万星系超级计算机,再花费37倍宇宙年龄,得到正确答案的概率只有40亿分之一。对了,比特币现在的算力:把所有矿工加起来,每秒可以猜测和验证500亿个哈希值,只相当于前面说的“千谷歌”计算机算力的三倍.然而,矿工使用的芯片比GPU强大约1,000倍。它们被称为“专用集成电路(ASIC)”。这些硬件是为比特币挖矿量身定做的,但是这个芯片什么也不会做,只是根据SHA256算法计算哈希值。不过在量子计算机真正普及之前,完全不用担心他的安全。这个网站可以结合观察SHA-256算法下输入输出值的变化。在比特币网络中,应用的就是这种SHA256算法。有趣的是,比特币协议(工作量证明)需要运行两次SHA-256算法。请注意,这并不是为了防止生日攻击,毕竟hash(hash(x))=hash(hash(y))wherehash(x)=hash(y)。双SHA-256旨在抵抗长度扩展攻击。本质上,所谓的长度扩展攻击是指如果恶意攻击者知道一个哈希输入的长度,他可以在哈希值中添加一个秘密字符串,欺骗哈希函数从其内部状态的特定部分开始计算。SHA256作为SHA2算法家族的一员,也存在这个缺陷。因此,比特币通过进行两次哈希计算来解决这个缺陷。非对称加密交易过程中的私钥签名和公钥验证。私钥是随机生成的,然后通过椭圆曲线乘法可以生成一系列公钥。比特币并没有直接使用公钥作为地址,而是做了一系列的转换:A=RIPEMD160(SHA256(K))A:地址K:公钥后面会用base58编码。简而言之,公钥和地址是一对一的,地址可以从公钥计算出来,反之亦然。目前,如果您丢失了私钥,您将无法找回它。因此,一定要备份助记词或钥匙串。简单来说,挖矿就是盲目猜测Nonce,使得当前区块哈希H(blockheader)<=target,即前面一定有一定数量的0(比如000000000000000000040b38097e0a61ef1ad31b184c908a738cfff013c094b2)??,其他节点可以验证你计算的值是否基于nonce满足条件。nonce值的作用是用来挖矿的。可以想象成一个开关,控制添加新块的速度。它不能太快或太慢。nonce的范围调大了一点。难度越大,出块速度越慢。.交易中的Nonce值是指from账户发出的交易数量,从0开始递增,同一个账户的交易会依次确认。它具有以下功能:确认交易顺序,防止双花撤销未决交易,确定生成的合约地址,防止区块链数据被篡改。Merkle树以块的形式保存交易数据,类似于二叉树,但有两点不同:使用哈希指针,只有叶子节点存储交易信息,中间节点存储左右子节点的哈希值。区块头包含很多内容,包括当前区块体的哈希值和前一个区块的哈希值。这意味着如果当前块体的内容发生变化,或者前一个块的哈希值发生变化,那么肯定会导致当前块的哈希值发生变化。因此,区块只能通过检查MerkleRootHash来检测交易是否被篡改。Fork即使区块链是可靠的,还有一个问题没有解决:如果两个人同时向区块链写入数据,即同时添加两个区块,因为它们都连接到前一个区块。块,形成叉子。此时应该采用哪个块?目前的规则是新节点总是采用最长的区块链。如果区块链出现分叉,它会看分叉点后面是哪个分支,先达到6个新区块(称为“六确认”)。按照10分钟一个区块计算,一个小时就可以确认。由于新区块的生成速度是由算力决定的,所以这个规则意味着算力最多的分支才是真正的区块链。共识机制基于工作量证明PoW比特币网络节点通过算力投票来争夺记账权。也就是说,矿工同时根据当前最长链构建一个本地最新区块。谁先计算出符合要求的区块,就相当于谁获得了当前区块的记账权。如果多个节点同时计算出相同高度的区块,区块链会在短时间内分叉,每个节点都会收到自己收到的第一个合法节点作为最长的合法链,也会根据这个区域的一个block用于计算下一个区块,相当于为这个区块投票。最终,其中一条链肯定会成为最长的合法链,剩下的链都会被淘汰。挖矿奖励:挖矿消耗大量的算力以保证区块链的安全,因此每个区块都会奖励区块创建者一定数量的比特币。初始50BTC,每21W个区块,奖励减半。基于权益证明,PosETH的出块速度在十几秒。决定性的出块时间导致分叉正常,容易出现多分支状态。为了鼓励矿工在分叉后迅速达成共识,ETH引入了叔块奖励机制:叔块定义为七代内有共同祖先的块,且必须是分叉的第一个块。每个块最多可以包含两个叔块。当前获得记账权的节点提交一个叔块,可以额外获得出块奖励的1/32ETH(出块奖励目前为3ETH)。提交的叔块将根据代数获得7/8-2/8的ETH和bits的区块奖励。与比特币一样,以太坊过去使用基于工作量证明(Pow)的共识协议,但现在以太坊使用基于权益证明(PoS)的共识协议。工作量证明是通过一定的计算量来验证交易并产生新的区块。不同的是,权益证明需要用户拥有一定数量的加密货币,可以理解为用自己的数字货币换取权益。一旦证实他们打包了恶意交易,他们就失去了股权(加密货币)。智能合约智能合约是以太坊提出的一个概念,可以理解为运行在以太坊区块链上的代码。由于区块链不可逆修改,此代码一旦上链,就无法修改bug。因此,区块链行业的代码审计业务成为了一些安全公司的核心赚钱业务。合约是一种以太坊账户。账户意味着它有余额,可以作为交易的目标,但它不受用户控制,由现有的固定代码逻辑执行。用户账户需要提交合约中定义的函数来执行才能与之交互。部署合约也是一个交易的过程,本质上是将一个已签名的交易数据发送到地址0。小结本节总结了以太坊和比特币网络的几个重要概念。掌握基本理论和原理,有助于加深对业务的理解。如果想深入了解区块链技术,建议参考网上资料。关注公众号,回复web3,加入前端web3交流群~