编程崽

登录

一叶在编程苦海沉沦的扁舟之上,我是那只激情自射的崽

以太坊区块链和Web3.0

以太坊区块链和Web3.0

互联网世界,经过了:

  • Web1.0:用户只是被动接受内容,比如浏览新闻、文章,没有互动体验。
  • Web2.0:用户可以和网页交互了,注册登录、发布内容、评论、进行网络游戏等等。

现在已经在缓缓步入Web3.0的时代。

Web3.0在用户使用上,可能并没有太大区别,但内在逻辑已经发生改变。

Web1.0和Web2.0的所有数据,包括注册的账户、评论等等,都存放在页面站点的服务器的数据库里面,一旦这个数据库被破坏、篡改,那么存在其内的数据都会受影响,如果没有备份,将再也无法恢复原版数据。

而Web3.0的运行原理,和前面两个已经有个重大区别,简单的说,Web3.0的所有数据,是存放在无数台服务器中的(截止2020年12月6日,全球共有、有8,823台),即使想进行破坏、篡改,也只能影响这一台服务器的数据,其他所有服务器对比数据后,能立即发现这台服务器的数据不正常,坏数据将立刻被清理。

因为无法同时对几千台服务器发动攻击,所以可以认为,这无数台服务器中的数据是无法被删除、篡改的。

也就是说,我在Web3.0发布一篇文章,再也不用担心因网站关停而丢失文章,因为数据是存在节点服务器中的。

以太坊官网:https://ethereum.org/zh/

Web3.0的技术基础,是建立在区块链这一新事物之上的。

区块链逻辑的第一次应用,是作为比特币运行机制的底层技术出现的,所以这里需要从比特币开始。

简短历史

1998,一位名叫魏岱(音)的密码学家发明了b币,这是一个“匿名、分布式电子现金系统”。

2008年,中本聪(Satoshi Nakamoto)在一份鲜为人知的密码学邮件列表上发表了比特币白皮书。白皮书提出了一种新的金融体系,取代了银行和第三方支付处理机构的角色:

“纯粹的点对点电子现金将允许在线支付直接从一方发送到另一方,而无需通过金融机构。”

2009年1月3日,中本聪在一台普通的电脑上开采了比特币的创世区块,比特币就此诞生,延续到现在。

节点服务器

首先,大家都使用银行,农行、建行等等,但每个银行的信息不互通,我在农行存了一百块,只有农行的服务器有记录,在其他银行都查不到,这种模式称为中心化存储。

但比特币就不一样了,它没有独属的服务器,它基于无数个节点服务器,任何一台联网的电脑,安上对应的软件、注册后,就可以成为一个节点服务器。

当我在比特币世界有了一个Token 令牌地址,所有的节点服务器都会通过网络互相同步,都在自己的服务器的硬盘上进行记录,当我给另一个地址转账10个比特币,同样会被同步记录。

这么看来,存储用的硬盘实在是有点浪费了,因为这么多服务器都在记一样的东西,但大家为什么要记这些交易呢?

区块、手续费和奖励

因为每隔十分钟,这十分钟的交易数据就会打包成一个区块,每个服务器自己打包自己的,然后比特币系统会发布一道类似数学计算的难题,需要大量算力来计算的数学题,所有的服务器都会拼尽自己的CPU的算力去计算。

当A服务器计算出结果,就发送给其他所有服务器去校验,当超过半数的服务器都校验通过同意答案是对的,那么A服务器就会把它打包的区块,同步给其他所有的服务器,而其他服务器打包的区块,则全部作废。

这相当于,只要这个服务器的算力获胜,那么过去十分钟的账,就是它说了算!

这里有个小bug了,如果A服务器在记账时它乱记,明明m给n转了10个比特币,但它偏偏记成n给m转了100个比特币,而最后A服务器的算力有获胜了,那m不就赚大发了吗?

确实会这样,但这里有个前提,就是A服务器计算数学题的结果,需要超过半数服务器的算力都认可。

但万一,A开了很多服务器来配合,都认同它的结果,那它最后不就仍然可以瞒天过海了?

这种情况是存在的,这就是比特币的半数攻击,又称51%攻击,但这个实施的可能性太小了,节点服务器越多,想达成半数攻击就越难,因为需要这边的算力,需要超过其他所有节点服务器的算力总和。

上面说到m给n转账,实际这个操作,是需要额外交一笔手续费的,所有需要节点服务器记账的操作都需要交,手续费是可以m在转账时自己设置的,这么多人操作,谁给的手续费高,节点服务器就会优先处理谁的订单。

所谓的处理,就是优先放进当前十分钟的区块队列里。

一个区块,也是有体积限制的,可能也就多少KB,当量满了,即使十分钟没到,这个区块也不在接受订单,那多多余的订单就只能等着了,等这个区块打包完,排到下一个区块里。

这会导致某个操作可能会等很久,比较费时。

而那些类似读取余额的读取操作,则是不需要交手续费,直接从节点服务器读取就行。

当某服务器算力获胜时,这n多笔订单的手续费,外加一份比特币系统基于的奖励,都会转到服务器指定的某个账户地址。

这个手续费和奖励,就是节点服务器们记账、打包、计算数学题的动力

这些节点服务器还有个俗家名字,叫做矿工,这可不就和挖矿一样么,运转自己的算力吭哧吭哧挖矿,运气好就获胜,挖到币。

其实现在的节点服务器也不是单打独斗,毕竟一个普通电脑,好几年的算力可能还比不上超级计算机一天的算力,所以现在挖矿有一种按算力贡献分奖金的模式,这个就没有研究了。

区块链

上面所说的区块,每一个区块都具有唯一的Hash值,后一个区块通过记录前一个区块的Hash值,来表明父子关系,所有区块首尾相连,这就是区块链

综上所述

比特币的记账模式和银行的那种记账方式是完全不一样的,他是分散记账,被称作去中心化,任何一个节点服务器突然掉线、被攻击、被篡改等等,只要没有达到半数攻击的规模,都不影响数据。

以太坊

上面所说的,都是比特币世界的基础,当前正在使用区块链虽然脱胎于此,但已经有了新的变化。

这个变化就是由以太坊重新设计、开发、创立的。

以太坊被开发成一个开源的、有智能合约功能的公共区块链平台。

以太坊的主推币为以太币(ETH),是市值第二高的加密货币,在以太坊网络起到官方币的作用。

以太坊的区块、区块链和网络

以太坊中,区块和区块链的概念和比特币相同,只不过比特币是十分钟出一个区块,而以太坊是十几秒,所以以太坊的上链操作会快一些。

每条区块链的第一个区块,一个让这条区块链从无到有的区块,它没有父区块,这个区块的名字就叫创世区块(Genesis Block)通常创世区块不是由矿工挖掘出来的,而是预先生成好并将创世区块的Hash写进了钱包软件的代码中。

每个区块都包含交易数据,区块链浏览器就是链上数据可视化的主要窗口,它可以用来查看出块信息、账户信息、交易信息等等,实际落地后,区块链浏览器就是一个网站,可以搜索、查询各个地址之间的交易、账单、余额等等。

对了,区块链上的所有数据都是公开的,包括某账户的余额信息等等,前提是需要知道账户地址。

也正是因为公开,才能保证数据不被某些不良机构控制。

工作在同一条区块链上的全部节点服务器,我们称之为一个网络,可以理解为一个链就是一个网络。

通常一种区块链只有一个主网络,比如比特币,莱特币,以太坊,都只有一个主网络

出于测试和学习的目的,便会有一小部分节点,使用与主网络不同的创世区块,开启一条全新的区块链,并在上面挖矿和测试,这就是测试网络

区块链又分为多种类型:

  • 公链:人人可参与,数据公开、人人可读可写,完全去中心化。
  • 私链:权利掌握在少数人手里。
  • 联盟链:部分去中心化,其参与者是被提前筛选出来或者直接指定的,数据库的读取权限可能是公开的,也可能像写入权限一样只限于系统的参与者。
  • 侧链:从严格上来说,其本身并不是区块链,可以理解为区块链的一种扩展协议,侧链就像是一条条通路,将不同的区块链互相连接在一起,以实现区块链的扩展。

Token 令牌

以太坊世界的账户、币种、合约等等,对应的都是一个Token 令牌,也可以认为是一个地址,这个令牌的格式是以 0x 开头的由 0-9a-fA-F 组成的一个字符串,可以理解为传统的key、id。

在区块链浏览器输入合法的Token地址后搜索,可以看到这个令牌对应的账户、币种、合约的情况和交易记录,所有数据均可查看。

但想操作某个账户,需要有创建该账户时返回的私钥才可以。

智能合约和Web3.0

上面说的节点服务器,看上去只有记账的功能,那如何满足复杂的互联网操作?这里就需要用到智能合约了,这是应用区块链的重要工具。

智能合约(Smart Contract),是一段部署在区块链上的代码,一旦某个事件触发合约中的条款,代码就会自动执行。

其实它本质,个人认为就是一段有特定功能的程序而已,和普通页面的交互程序没什么大区别,只不过是智能合约不运行在页面,而是运行在链上。

数据同样也是存放在链上,这里说的链上,其实就是万千节点服务的硬盘中。

以太坊创始人维塔利克·布特林(Vitalik Buterin),在2018年发布推特也承认:

需要澄清的是,在这一点上,我非常后悔采用了“智能合约”这个术语。我应该把它们叫做更无聊和技术性的东西,也许类似于“持久脚本”。

当前互联网之所以可交互,不就是因为每个页面、程序、游戏的背后的服务器上运行着程序吗?

区块链中的智能合约,就起着传统互联网中的后台程序的作用。

每个人都可以开发一个智能合约,部署到支持智能合约的链上,这个合约会在所有节点服务器中运行,供万千大众就使用。

比如某个合约的作用类似一个博客的后台。

你可以调用合约中的方法,用起来就类似传统互联网的ajax接口,把文章通过合约传到链上(文章需要存到链上,需要交手续费)。

其他人浏览你的博客网站,再调用合约的方法(只读,不需要手续费),从链上下载文章展示给他们看。

用户想要评论,同样是调用合约的某个方法(评论内容需要上链)。

以上就是Web3.0的一个应用。

但这个和以前有什么不同?主要就是去中心化。

以前的文章、评论等,都存储在某个服务器中的数据库中,如果这个服务器被黑科搞了破坏,那这些就全丢失了。

但区块链不会了,它去中心化,没有中心。

智能合约和 Solidity

上面说智能合约本质就是一段部署到区块链上的代码,Solidity 就是这段代码的开发语言

Solidity 其语法与 JavaScript 类似,文档地址:https://docs.soliditylang.org/

DApp

这里的d就是Decentralized(去中心化),DApp 就是去中心化的app,也就是以区块链为后台服务的应用。

DApp的代码是开源的,任何人都可以去查看它的原始代码,所以整个执行过程都是对所有人透明的,所有人都知道发生了什么。

Crypto代币、ERC-20标准和单位 wei

Crypto(Cryptocurrency)就是加密货币,是一种去中心化的数字货币,也就是常说的代币,就是转账时被转移的东西,相当于现实世界中的钱。

ERC-20是最著名的标准,ERC-20标准无差异,符合此标准的代币可以互换,这相当于说,按照ERC-20标准,你有100个ETH,我有0个ETH,我们其实都有ETH,只不过数量不同而已。

ERC-20标准规定,代币应具有名称、符号、总供给量和转账、汇款等功能。此标准的优点是,只要代币符合ERC-20标准,它就可以与以太坊钱包兼容。换句话说,您可以将此代币添加到您的以太坊钱包中,并通过您的钱包将其发送给其他人。

ERC-20就相当于现实生活中的钱。

每个代币都是有单位的,比如说,人民币一般的最小单位是(有更小的,这里就认为是分),但我们平时对外沟通时,用的都是这个单位。

代币也一样,所有代币的最小单位是 wei ,而对WETH这个代币来说,1WETH = 10^18 wei(10的18次方个wei),那么WETH这个代币的精度是18,wei 也是以太坊世界沟通的标准单位,就因为它是最小单位。

其实我们直接在以太坊中查询自己的余额,返回的单位都是 wei,但展示的时候都已经按照对应币种的精度进行处理了,就像你给我转了1块2角钱,实际是转了120分,但我们不管在哪里查看交易记录,看到的都是转了1.2元

NFT、ERC-721标准

ERC-20标准代币没有价值差异,它不再适用于需要唯一属性的某些资产(比如游戏道具)。

因为就算是同一件道具,比如现实生活中的同一种型号的匕首,单两把匕首的出厂编号不同,你的和我的就是不一样。

还有就是,这把匕首你有就是有,没有就是没有,不可分割,不可能说我有半把匕首。

所以ERC-721有了用武之地,符合该标准的每个代币都有一个唯一的代币ID,没有数量一说,不可分割,只能整个转移所属权。

NFT就是符合ERC-721的代币,可以称为数字财产,最近经常有一些电子版的名画被拍卖,其实拍卖的就是这幅名画的NFT的令牌地址的所属权。

手续费Gas、GasPrice和GasLimit

上链指的是,某个操作需要被节点服务器进行记账,比如转账、修改内容等等,这些需要上链的写操作,需要付出一定的代价作为手续费才可执行,这个代价就是这条链的官方币种,比如最常见的ETH

  • Gas:存在于以太坊虚拟机内部,作为矿工记录用户这一笔交易时,需要进行的工作量的计数。
  • GasLimit:用户发起上链交易时,设置的允许的Gas的最高限额。
  • GasPrice:用户愿意为每个 Gas 支付的价格,一般单位为 Gwei ,1ETH = 1,000,000,000 Gwei。

所以交易完成,用户需要支付的最终手续费为:Gas * GasPrice。

GasPrice设置的越高,在区块链看来,记录这笔交易的性价比就越高,就越容易被矿工记账,所以如果想让自己的操作快点完成,可以把 GasPrice 设置的高一些。

GasLimit只是个限额,如果矿工的工作量达到了用户设置的 GasLimit,但记账还未完成,那么整个操作将会失败,手续费也会被扣除,将报错提示:out of gas

钱包和小狐狸MetaMask

一个人可以申请无数的账户,每个账户都有一个地址和一个私钥,进行操作时也比较麻烦,所以方便用户进行操作的钱包就出现了。

钱包可以是一个手机软件、浏览器插件,比如小狐狸 MetaMask就是一个浏览器插件。

用户可以通过钱包,设定好对应的**链(网络)**后,在这个网络上申请账户,也可以把自己现有的账户登记到钱包中,在钱包中可以查看账户余额、账户间转账。

因为Web3.0还是需要网页来操作,比如在网页中拍NFT,则需要以下步骤:

  • 用户提前登录好小狐狸、切换到正确的网络、确保有账户,且账户下有币,也就是有钱。
  • 用户点击网页中的「连接钱包」按钮,这个按钮必然存在,除非这个网站不打算和用户进行交互。
  • 点击后,小狐狸插件自动弹出,询问是否连接此网站,并询问使用哪个账户连接,用户选好后选择连接。
  • 网页和小狐狸连接好了,用户点击出价按钮,网页进行判断处理后,会自动给用户设置好合适的手续费和出价金额,然后调用小狐狸的方法,弹出小狐狸,让用户确认付款。
  • 用户可以在弹出的界面中修改手续费,也可以直接点确认,然后等区块链打包后,付款完成,出价成功。

注意,上面确认付款那一步,本质是转账,需要上链,需要使用用户的私钥进行签名,上面小狐狸的确认付款界面,就是让用户看一下交易消息,让用户确认是否要给这一笔交易签名,因为钱包存储着账户的私钥,所以这里只要用户点了确认,后面就自动完成了。

所以,钱包大大的方便了用户。

其实是用户把自己的账户托管给了钱包,我们只要相信这个钱包就行了。

节点服务器的RPC

同一条链上,可以有千千万万个节点服务器,想要和这条链交互,我们可以连接任意一个节点服务器,和它进行交互,基于同步记账的原则,所有节点服务器都会同步,也就相当于和链交互了。

节点服务器启动时,可以配置是否放开访问连接,这个访问连接可以是一个支持 ajaxHTTP 接口地址,也可以是一个 WebSocket 连接地址,也可以通过 IPC 文件进行本地进程间通信,就看如何配置的了,这个地址对外统称为 RPC

通常前端开发时,拿到某个节点服务器的RPC后,就可以使用 HTTP 请求或者 WebSocket 的形式,按照固定的规则进行交互了,这里我们常用的是 HTTP 的方式。

其实我们使用小狐狸等钱包连接各个网络,就是添加以下配置:

  • 网络名称:自定义给自己看的网络名称。
  • RPC URL:就是上面说的RPC。
  • 链ID:这个网络对应的这条区块链的唯一id。
  • 货币符号:这个网络的主要代币,获取余额、扣除手续时使用的就是这个币。
  • 区块浏览器 URL(可选):上面说过,就是这条链的区块链浏览器,用来共用户跳转查看信息用的。

以上配置一般是连接节点服务器时,节点服务器都会提供的一整套的信息。

大多数钱包,包括小狐狸,都会默认放置一些比较流行的链的网络备选,可以一键添加。