# 给 Web 2.0 从业者的 Web3 新手入门指南 (一) **Published by:** [麦田里的狗](https://paragraph.com/@bttb/) **Published on:** 2022-01-13 **URL:** https://paragraph.com/@bttb/web-2-0-web3 ## Content 2022 年,我们可以从信息流、聊天群中看到许多标题中带有数字货币币价、挖矿、NFT、元宇宙等概念的新闻。出于一些不可描述的原因,我必须开始从事这方面的研究。在链上经历了热闹的数月后,我准备总结下我了解到的信息,帮助大家快速入门。 本文适合谁阅读: 对 Web 2.0 有充分体验,尤其适合拥有开发经验的读者; 对 ETH 的了解停留在「这是一个涨了很多的虚拟货币」; 不知道「矿工」除了浪费电,到底产生了什么「价值」。 本文尽可能向大家介绍一些 Web 2.0 与 Web3 世界里的概念差异。另外,在介绍过程中,我无法避免会提及一些「币圈项目」,但均不应该被视为投资建议。 区块链上的「阿里云」:Ethereum 在 Web 2.0,所有的服务都是运行在服务器上的,然后通过 Web 前端或手机端 App 的形式让用户参与其中。由于流量的大爆发,也促进了许多开源软件的发布和流行:Nginx 可以让一台配置不是那么好的服务器可以承载更多的并发访问;Redis 提升了一些高频访问信息的调用速度而不必让系统受限于数据库的瓶颈;从豆瓣开始带头使用的 Python 编程语言现在的市场份额已经远超曾经「世界上最好的编程语言」PHP…… 如果说这些开源软件扩展了 Web 2.0 的纵向能力,阿里云(代指云服务)则是一种横向创新:它让任何一个开发者都可以在 5 分钟内花几百人民币就架设好一台服务器,一键安装上述软件,部署一个「Hello World」的网页并推广给全球用户。 Web 2.0 的第二阶段是移动互联网的到来。在这个时期,越来越少的项目会做一个功能完备的网站,服务器仅提供 API 给 iOS 或 Android 上的 App,具体的展示逻辑由 App 自己来完成,也就是「C/S 架构」的再次复兴。 在 Web3 的世界,上面描述的架构是什么样? 在这里我们必须要提到本文的第一个,也是目前世界上最重要的区块链项目:Ethereum 以太坊。 **以太坊是一个由全世界 N 台电脑组成的「操作系统」+「数据库」。**这里的「N 台电脑」,背后就是让游戏玩家深恶痛绝的「矿工」。以太坊的协议保证了数以千计的节点能够井然有序地运行,并组成一个以太坊虚拟机(Ethereum Virtural Machine,简称 EVM),虚拟机上运行着大家写的「App」(在以太坊世界里,「App」实际上叫做「智能合约」Smart contract)。 简单展开一下以太坊协议是如何保证秩序的: 以太坊虚拟机给大家要运行的程序里的每个操作(OPCODE)都定义了明确的价格,单位为 gas: 做一次加法(ADD)需要 3 gas; 做一次除法(DIV)需要 5 gas; 做一次逻辑判断(AND)需要 3 gas…… 执行程序的人在已知自己程序耗费了多少 gas 的情况下,需要再给 gas 一个报价,单位为 Gwei。Gwei 是以太坊上货币 ETH 的最小单位,1 Gwei = 0.000000001 eth。 🌰 一辆车要行使 100 公里,需要加 x 升汽油,每升汽油的价格是 y,因此行驶 100 公里总成本是 x * y。如果汽油这个时候紧缺,按市场经济的逻辑,报价越高的人越有机会加到汽油。 这里有一笔著名的转账,转账金额为 10 万美金,也许是因为填错了,手续费给出了价值 2,247 万美金的 ETH(随后矿工返还了部分 ETH,最终这笔转账的手续费是 84 万美金)。 随后,本次程序的执行需求会被封装成一笔交易(Transaction),被分发到所有以太坊矿工节点,大家根据目前正在排队的 N 笔交易中,取 gas price 最高的来优先执行(没错,就是百度竞价排名的逻辑)。 执行过程的体现,叫做「打包出块」。这里暂时不展开聊挖矿相关的逻辑,你仅需要知道,打包时程序才会被运行、记录和反馈。 TxStreet.com 非常生动形象地用公车排队的例子展示了「打包出块」的过程: 假设区块链上已经有一个「计算器」App,而你希望知道 1+1 的结果。此时你应该: 发起一笔交易,调用「计算器」App 运行计算公式「1+1」,并付给矿工一些钱; 如果你给的钱足够多,你的交易很快就会被矿工打包。否则你的交易就会在 Mempool 里排队,直到你愿意给的 gas price 排在队列前列; 在交易被打包后,你终于可以在交易详情里看到果:1+1=2。 与在阿里云上直接编程序获得 1+1=2 这个结论不同的是,在区块链上运行的计算将被永远记录下来,所有人都可以看到。因此,计算器这种应用实在太大材小用了,大家应该拿它来做什么,是接下来我们要讨论的事情。 💡 想要详细了解关于 Gas Fee 的逻辑,可以去 Google EIP-1559、MEV 两个关键词。 Ethereum 上的「Q 币」 拥有了这样一台电脑 + 数据库后,最先兴奋起来的是闲着没事儿的开发者。2015 年 11 月 19 日,来自德国的开发者 Fabian Vogelsteller 在 Ethereum 的 Github 项目里正式发起了第 20 号提案。提案大致的意思是,只要你写一个 App(智能合约)实现了以下方法(相当于编程里的 Interface),并花一些 Gas 将这个智能合约部署到链上后,你就拥有了自己的虚拟货币(又称为代币,也就是 Token)! // 告诉别人这个币叫什么名字,如「Q 币」 function name() public view returns (string) // 告诉别人此币种的英文代号,如「QCOIN」 function symbol() public view returns (string) // 告诉别人此币种的精度,目前人民币在我们生活中最小精度是分,也就是 0.01 元,对应的精度就是 2 function decimals() public view returns (uint8) // 告诉别人本币种的总发行量 function totalSupply() public view returns (uint256) // 证明某个人的钱包里拥有多少本币种 function balanceOf(address _owner) public view returns (uint256 balance) // 实现方法让本币种从合约执行用户转移 x 个币给 B 用户 function transfer(address _to, uint256 _value) public returns (bool success) // 实现方法从 A 用户转移 x 个币到 B 用户 function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) // 实现方法让合约执行用户可以允许 B 用户从自己的余额中调用本币种,授信额度为 x function approve(address _spender, uint256 _value) public returns (bool success) // 实现方法让用户可查询到已经授权了谁以多少的额度 function allowance(address _owner, address _spender) public view returns (uint256 remaining) 于是我可以通过这个规范发行自己的「Q 币」,并实现以下特点: 代号:QCOIN 总发行量:100 亿 初始分配:99% 交给程序控制,1% 直接打给创始团队(也就是我会得到 1 个亿 QCOIN) 获得方式:通过充值(抵押) 1 个 USDT(区块链上的美元)给程序,可以获得 6 个 QCOIN 消费方式:可以在创始团队发行的 App 里购买 QQ 秀 和腾讯 QQ 所发行的 Q 币或者任意 Web 2.0 项目里的积分相比,Token 的特点是:它可以流转于所有 ETH 上的 App 之间(想象一下,若要实现可以在抖音中使用 Q 币进行打赏,背后需要多少开发量?),而且总量等信息清楚写在合约内,开源展示给所有人,即使作为发行方在后期也无法修改 App 里定义好的常量。 DODO 提供了一个很简单创建自己的 Token 的工具,收费 0.02 ETH,加上运行合约的 Gas Fee,总共需要花费约 0.08 ETH。 这种合约被称为 ERC20 式合约。在 2017 前后的「ICO 浪潮」里,许多项目方基于 ERC20 发行自己的代币,利用人性的贪婪,不仅让许多人遭受财产损失,也让真正优秀的项目没能得到应有的关注。 但从技术本质出发,它们只是运行在以太坊虚拟机上的一个 App 而已。 💡 想要了解更多关于 Token 的设计思路,可以去 Google Tokenomics 这个关键词。 区块链上的 RSS 与 API? RSS 是一个非常能体现 Web 2.0 精神的信息接口形式。Web 2.0 初期几乎所有博客都提供了 RSS 的输出,大家通过 Google Reader 等 RSS 聚合器获取世界上正在发生的新鲜事。 而在基于 Ethereum 的 Web3,这种开放性被提升到前所未有的高度: 所有的智能合约运行过程都会产生信息记录(Transaction); 所有智能合约都可以被所有人调用(但智能合约中可以明确规定只有某个用户 ID 才可以调用某个具体逻辑); 所有人都可以获得所有区块链上的历史信息。 这就意味着:任何可以连接到 ETH 任意一个节点的人,都可以看到 Ethereum 世界上所有的人在做、做过的所有的事。 像 Dune.xyz、thegraph.com 等服务,就对链上的全量数据做了聚合,包装成大家比较喜闻乐见的数据呈现形式。在 Dune.xyz 里,我可以用一条 SQL 查询过去 365 天链上去中心化交易所以美元计价的交易金额:1,029,118,775,599.5564。 SELECT SUM(usd_amount) FROM dex."trades" WHERE block_time >= now() - interval '365 days' AND category = 'DEX'; 在 Etherscan 上,我们可以看到每一笔交易、每一个合约、每一个用户的具体形态,也可以看到类似于 Ethereum 用户总量和用户增速、日活数据等信息。 例如:OpenSea 作为区块链上最大的 NFT 交易平台(类比于 Web 2.0 世界的淘宝),它在链上的合约地址是 0x7be8076f4ea4a4ad08075c2508e481d6c946d12b,我们只需要订阅这个地址相关的 transaction,就可以知道谁在什么时间买了什么 NFT。我们也可以通过导出这个合约的所有历史交易,来分析 OpenSea 的用户增速等平台方信息。 不需要给 Web3 App 开发 API 功能,Web3 本身自带 API。 如何注册成为 Web3 用户 在 Ethereum 的世界里,你的身份是由加密算法生成的一对公钥和私钥。生成公钥私钥的过程完全不必联网,通过脚本就可以完成。为了方便,你也可以到 Vanity-ETH 网站来亲自体验一下这个过程。其中公钥就是大家最常提起的钱包地址,私钥是用来签名交易的密码。 对比一下 Web3 与 Web 2.0 的「登录」逻辑区别: 通常,用户在登录 Web 2.0 应用时需要提供 E-mail + 密码或手机号 + 验证码的组合来向服务器证明自己的身份。为了提升安全性,许多服务都增加了「多因子验证」的流程,即:登录时除了密码,还需要提供 E-mail 验证码或 OTP 验证码。登录成功后,服务器颁发一个 Token 给客户端,客户端可以用此凭证来读取、发布信息。 Web 2.0 的账户与你的个人身份是强绑定关系。强绑定的一个极端是你的银行账户:即使你忘记了取款密码,也可以通过携带身份证到银行柜台申请恢复。 但在 Web3,唯一能够证明你拥有一个公钥的方法就是私钥。如果你不慎丢失了私钥,会有两种结果:1. 别人可以瞬间转走你的全部资产;2. 你可以看到钱包里的资产,却再也无法使用它们(这里有一个因忘记密码丢了 7,002 个 BTC 即 3 亿美金的惨剧)。 因此在 Web3 的 App 中,用户是万万不可将私钥上传到云端的。某些服务为了确认你是钱包主人的身份,登录验证的过程就变成了签名验证的过程: 服务端生成一串随机数字 (nonce),作为暗号给到用户; 用户使用非对称加密算法,使用私钥对暗号进行签名,生成一串临时密码传给服务端; 由于非对称加密算法的特性,服务端可以通过公钥来验证客户端推过来的临时密码是否确实包含之前的暗号,若包含则验证通过。 为了让这个过程体验更好 + 更安全,Metamask 推出了 Chrome 扩展,是现在最流行的密钥管理工具(记得管理好助记词)。 💡 可以去 https://metamask.io 下载 Chrome 扩展,然后打开 https://opensea.io 体验一下 Web3 App 的登录流程 本期就先聊以上几个主题,下一期可能可能会介绍 NFT(ERC-721)、预言机(Oracle)以及去中心化金融(DeFi)等话题。如果你有任何想说的话,请通过邮件 0-delta.blender@icloud.com 联系我。 另外,给大家准备了课外读物:《精通以太坊——实现数字合约》中文版,强烈推荐有编程能力的同学仔细阅读 + 亲手试试。 GN. ## Publication Information - [麦田里的狗](https://paragraph.com/@bttb/): Publication homepage - [All Posts](https://paragraph.com/@bttb/): More posts from this publication - [RSS Feed](https://api.paragraph.com/blogs/rss/@bttb): Subscribe to updates - [Twitter](https://twitter.com/Chenvii): Follow on Twitter