互联网世界,经过了:
现在已经在缓缓步入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 令牌,也可以认为是一个地址,这个令牌的格式是以 0x 开头的由 0-9a-fA-F 组成的一个字符串,可以理解为传统的key、id。
在区块链浏览器输入合法的Token地址后搜索,可以看到这个令牌对应的账户、币种、合约的情况和交易记录,所有数据均可查看。
但想操作某个账户,需要有创建该账户时返回的私钥才可以。
上面说的节点服务器,看上去只有记账的功能,那如何满足复杂的互联网操作?这里就需要用到智能合约了,这是应用区块链的重要工具。
智能合约(Smart Contract),是一段部署在区块链上的代码,一旦某个事件触发合约中的条款,代码就会自动执行。
其实它本质,个人认为就是一段有特定功能的程序而已,和普通页面的交互程序没什么大区别,只不过是智能合约不运行在页面,而是运行在链上。
数据同样也是存放在链上,这里说的链上,其实就是万千节点服务的硬盘中。
以太坊创始人维塔利克·布特林(Vitalik Buterin),在2018年发布推特也承认:
需要澄清的是,在这一点上,我非常后悔采用了“智能合约”这个术语。我应该把它们叫做更无聊和技术性的东西,也许类似于“持久脚本”。
当前互联网之所以可交互,不就是因为每个页面、程序、游戏的背后的服务器上运行着程序吗?
区块链中的智能合约,就起着传统互联网中的后台程序的作用。
每个人都可以开发一个智能合约,部署到支持智能合约的链上,这个合约会在所有节点服务器中运行,供万千大众就使用。
比如某个合约的作用类似一个博客的后台。
你可以调用合约中的方法,用起来就类似传统互联网的ajax接口,把文章通过合约传到链上(文章需要存到链上,需要交手续费)。
其他人浏览你的博客网站,再调用合约的方法(只读,不需要手续费),从链上下载文章展示给他们看。
用户想要评论,同样是调用合约的某个方法(评论内容需要上链)。
以上就是Web3.0的一个应用。
但这个和以前有什么不同?主要就是去中心化。
以前的文章、评论等,都存储在某个服务器中的数据库中,如果这个服务器被黑科搞了破坏,那这些就全丢失了。
但区块链不会了,它去中心化,没有中心。
上面说智能合约本质就是一段部署到区块链上的代码,Solidity 就是这段代码的开发语言。
Solidity 其语法与 JavaScript 类似,文档地址:https://docs.soliditylang.org/。
这里的d就是Decentralized(去中心化),DApp 就是去中心化的app,也就是以区块链为后台服务的应用。
DApp的代码是开源的,任何人都可以去查看它的原始代码,所以整个执行过程都是对所有人透明的,所有人都知道发生了什么。
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元。
ERC-20标准代币没有价值差异,它不再适用于需要唯一属性的某些资产(比如游戏道具)。
因为就算是同一件道具,比如现实生活中的同一种型号的匕首,单两把匕首的出厂编号不同,你的和我的就是不一样。
还有就是,这把匕首你有就是有,没有就是没有,不可分割,不可能说我有半把匕首。
所以ERC-721有了用武之地,符合该标准的每个代币都有一个唯一的代币ID,没有数量一说,不可分割,只能整个转移所属权。
NFT就是符合ERC-721的代币,可以称为数字财产,最近经常有一些电子版的名画被拍卖,其实拍卖的就是这幅名画的NFT的令牌地址的所属权。
上链指的是,某个操作需要被节点服务器进行记账,比如转账、修改内容等等,这些需要上链的写操作,需要付出一定的代价作为手续费才可执行,这个代价就是这条链的官方币种,比如最常见的ETH。
所以交易完成,用户需要支付的最终手续费为:Gas * GasPrice。
GasPrice设置的越高,在区块链看来,记录这笔交易的性价比就越高,就越容易被矿工记账,所以如果想让自己的操作快点完成,可以把 GasPrice 设置的高一些。
GasLimit只是个限额,如果矿工的工作量达到了用户设置的 GasLimit,但记账还未完成,那么整个操作将会失败,手续费也会被扣除,将报错提示:out of gas。
一个人可以申请无数的账户,每个账户都有一个地址和一个私钥,进行操作时也比较麻烦,所以方便用户进行操作的钱包就出现了。
钱包可以是一个手机软件、浏览器插件,比如小狐狸 MetaMask就是一个浏览器插件。
用户可以通过钱包,设定好对应的**链(网络)**后,在这个网络上申请账户,也可以把自己现有的账户登记到钱包中,在钱包中可以查看账户余额、账户间转账。
因为Web3.0还是需要网页来操作,比如在网页中拍NFT,则需要以下步骤:
注意,上面确认付款那一步,本质是转账,需要上链,需要使用用户的私钥进行签名,上面小狐狸的确认付款界面,就是让用户看一下交易消息,让用户确认是否要给这一笔交易签名,因为钱包存储着账户的私钥,所以这里只要用户点了确认,后面就自动完成了。
所以,钱包大大的方便了用户。
其实是用户把自己的账户托管给了钱包,我们只要相信这个钱包就行了。
同一条链上,可以有千千万万个节点服务器,想要和这条链交互,我们可以连接任意一个节点服务器,和它进行交互,基于同步记账的原则,所有节点服务器都会同步,也就相当于和链交互了。
节点服务器启动时,可以配置是否放开访问连接,这个访问连接可以是一个支持 ajax
的 HTTP 接口地址,也可以是一个 WebSocket 连接地址,也可以通过 IPC 文件进行本地进程间通信,就看如何配置的了,这个地址对外统称为 RPC。
通常前端开发时,拿到某个节点服务器的RPC后,就可以使用 HTTP 请求或者 WebSocket 的形式,按照固定的规则进行交互了,这里我们常用的是 HTTP 的方式。
其实我们使用小狐狸等钱包连接各个网络,就是添加以下配置:
以上配置一般是连接节点服务器时,节点服务器都会提供的一整套的信息。
大多数钱包,包括小狐狸,都会默认放置一些比较流行的链的网络备选,可以一键添加。