序言
Web 3.0 的基本概念是由镜像坊联手创办人 Gavin Wood 在 2014 年提出的,指如前所述计算机程序链的去虚拟化新浪网自然生态系,它代表了新一代互联网黄金时代。目前 Web 3.0 仍处在起跑期,但是发展非常十分迅速,其去虚拟化、抗审核等特征使人们更难建设两个对外开放的互联网自然生态。
责任编辑林美珠对 Web3.0 的下层计算机程序链做个单纯如是说,然后再如是说 Web3.0 的总体构架,最后透过两个单纯的范例来如是说 Web3.0 合作开发常见的许多控制技术。责任编辑只是两个慢板,让大家对 Web3.0 无须孤单,该文提及的许多控制技术钟爱的老师能再另行深入细致介绍。
计算机程序链概要
计算机程序链构架
计算机程序链是两个去虚拟化的分布式系统账单,能在位数世界中进行价值的表示和迁移。计算机程序链的构架自上而下分成五层,分别是统计数据层、应用层、一致意见层、鞭策层、合同层和应用层。
计算机程序链是透过计算机程序(block)储存统计数据,每一统计数据结点之间都包涵大部份统计数据,即分布式系统账单。每个计算机程序都主要包括了计算机程序的大小不一、计算机程序头、计算机程序所包涵的买卖数目及部分或大部份的上周新买卖。统计数据层主要是化解这些统计数据以怎样的方式女团在一起,逐步形成两个有象征意义的计算机程序。
计算机程序链的统计计算机程序中主要包括三种基元操作符,它均是不容盗用优点的统计计算机程序基础。两个是逐步形成“计算机程序+链”(block+chain)的线状统计计算机程序,另两个是基元操作符逐步形成的德国总理树(如下表所示图右图)。线状统计计算机程序使对某一计算机程序内的统计数据的修正很难被辨认出;德国总理树的结构起类似于作用,使对其中的任何人买卖统计数据的修正很难被辨认出。
能在https://www.blockchain.com/explorer上查看比特币的计算机程序链买卖统计数据,能在https://cn.etherscan.com/上查看镜像坊的计算机程序链买卖统计数据。
应用层计算机程序链使用的是去虚拟化的互联网构架,没有虚拟化服务器,依靠用户点对点交换信息,主要主要包括 P2P 组网机制、统计数据传播和验证机制。正是由于结点的 P2P 优点,统计数据传输是分散在各个结点之间进行的,部分结点或互联网遭到破坏对其他部分影响很小。
结点指的是计算机程序链客户端软件(比如比特币客户端、镜像坊客户端),一般分成全结点和轻结点,全结点包涵了大部份计算机程序链的区块统计数据,轻结点仅主要包括与自己相关的统计数据。
一致意见层的功能是让高度分散的结点在 P2P 互联网中,针对计算机程序统计数据的有效性达成一致意见,决定了谁能将新的计算机程序添加到主链中(挖矿机制)。
工作量证明一致意见机制(PoW),矿工需要将互联网中未确认的买卖按德国总理树组装成候选计算机程序,在候选计算机程序的头部有两个 32 位的随机数区域,矿工需要反复调整随机数并计算,目标是让整个计算机程序的基元值小于两个“目标值”,谁先完成这个目标谁就有权力将买卖记录到计算机程序链分布式系统账单中并获得一定的奖励。
挖矿的过程比拼的就是各个矿工结点的算力,能变相认为谁的算力高谁的工作量就高,就有权力记账和获得奖励。比特币使用的是 PoW 机制;镜像坊开始使用的是 PoW 机制,后来改成了 PoS 机制,原因是该机制买卖速度更快、资源消耗更低。
这种挖矿计算是非对称的,挖矿可能需要经过许多次基元计算,而要验证的确找到有效的随机数,只需要一次计算就能,因此其他节点能够很快验证买卖是否已经被记入账单。
鞭策层鞭策层的功能主要是提供许多鞭策措施,鼓励结点参与记账,保证整个互联网的安全运行。透过一致意见机制胜出取得记账权的结点能获得一定的奖励。
目前比特币的鞭策措施是新计算机程序当比特币数目达到 2100 万枚的上限后(2140 年),鞭策就全靠买卖的手续费了。镜像坊买卖是靠 gas 手续费来鞭策矿工。
合同层合同层封装了各类脚本、算法和智能合同,使计算机程序链具有可编程能力。例如,比特币的脚本[1]中就规定了比特币的买卖方式和过程中的种种细节,不过这种脚本使用不够便捷且不是图灵完备的。镜像坊提出了智能合同的化解方案,提供了一种图灵完备的高级编程语言来编写智能合同,并使智能合同能够运行在分布式系统的镜像坊虚拟机 EVM 上。
智能合同就是储存在计算机程序链上的一段代码,它能被计算机程序链上的买卖所触发,触发后,这段代码能从计算机程序链上读取统计数据或者向计算机程序链上写入统计数据。计算机程序链系统(比特币、镜像坊)能认为是两个分布式系统状态机,透过买卖触发合同(脚本、智能合同)运行来改变状态机的状态。
应用层应用层封装了计算机程序链的各种应用场景,具体应用可参见90+ #Ethereum Apps You Can Use Right Now[2]。
以下为一笔比特币转账买卖的过程:
镜像坊概要
因为我们将要在镜像坊上合作开发两个 Web3.0 demo 应用,所以先单纯如是说一下镜像坊的许多基本基本概念。
账户和钱包
镜像坊账户分成外部账户和合同账户。外部账户是拥有私钥的账户,拥有私钥意味着控制对镜像币或合同的访问。合同账户具有地址但是没有私钥,合同账户具有智能合同代码,而外部账户不具有。智能合同代码是在合同账户创建时由镜像坊区块链记录的软件程序,由 EVM 执行。
钱包是用来管理镜像坊账户的软件应用程序 ,它控制对镜像币的访问、管理私钥和地址、跟踪账户的余额、创建并签名买卖。能说,镜像坊钱包是通往镜像坊世界的大门。两个针对镜像坊钱包的常见误解是认为钱包中包涵镜像币或者代币。实际上,钱包中只保存了密钥。镜像币和其他各种代币都保存在镜像坊计算机程序链上。
当创建两个镜像坊外部账户的时候,会用非对称加密算法生成一对公钥与私钥,并保存在钱包里,而地址是公钥的基元值。买卖的签名和验证过程如下表所示(椭圆曲线位数签名算法):
Sig=Fsig(Fkeccak256(m) , k)
其中:
k 是用于签名的私钥m 是经过 RLP 编码的买卖统计数据包Fkeccak256 是 Keccak-256 基元函数Fsig 是签名算法Sig 是输出的位数签名函数 Fsig 生成了两个签名,这个签名包涵两部分内容,通常称为 r 和 s:Sig=(r, s)
签名验证算法的输入主要包括买卖统计数据包(其实是买卖的基元值的一部分)、签名方的公钥和签名(r 和 s 值),如果针对消息和公钥的签名验证成功,算法会返回 true。
镜像币和 gas
镜像坊的货币单位称为 ether,也常使用 ETH 表示,例如 1 ether 或者 1 ETH。镜像币能被拆分成更小的单元,最小单元称为 wei,1 ether = 10^18 wei。镜像币的面额和单位名称如下表所示右图:
镜像坊交易过程使用的是 gas 来支付手续费。gas 并不是镜像币,它是一种独立的虚拟货币,跟镜像币之间存在汇率关系。gas 独立于镜像币,是为了在镜像币价格大幅度波动的情况下,仍旧保护系统的灵活性,保证 gas 的价值相对稳定。
gas 的另两个作用是控制买卖对资源的使用。买卖统计数据会包涵 gasPrice(买卖发起方愿意支付的 gas 价格)和 gasLimit(买卖发起方愿意为这个买卖支付的最大 gas 数目)两个参数,而每一条智能合同代码语句的运行都会消耗对应的 gas,当运行过程中累计的 gas 消耗超过了 gasLimit,合同就会终止执行,买卖失败。
失败的买卖仍旧会被作为一次失败的尝试而记录在案,执行所花费的 gas 将从发起账户中被扣除,除此之外,它不会对合同或者账户状态产生任何人其他影响。
客户端
Geth 是官方提供的 go 语言实现的镜像坊客户端。客户端能以全功能结点的方式运行,也可以以远程调用的方式运行。全功能结点会下载全部的计算机程序统计数据,对系统的互联网和储存有较高的要求。
从远程调用镜像坊的客户端不在本地保存计算机程序链统计数据,也不参与计算机程序和买卖验证,这样的客户端提供钱包功能,也能创建并广播买卖。镜像坊客户端会对外提供 API(例如 web3.js API、JSON-RPC API)来访问镜像坊互联网。
智能合同
智能合同是运行在镜像坊的虚拟机上的计算机程序,一旦部署之后,智能合同的代码就不能被更改,但是能删除。把合同注册到计算机程序链上需要透过两个特殊的买卖,这个买卖的目标地址是 0x0000000000000000000000000000000000000000,也被称为零地址。
当买卖目标是合同地址时,它会导致该合同在 EVM 中运行,使用买卖和买卖的统计数据作为其输入。由于合同账户没有私钥,因此无法启动买卖。只有外部账户才能启动买卖,但合同能透过调用其他合同,构建复杂的执行路径来对交易做出反应。智能合同永远不会“自动运行”,或者“在后台运行”。
常见的镜像坊智能合同编程语言为 solidity。
token/代币/通证
token、代币、通证指的都是同一种东西。计算机程序链上的代币是指如前所述区块链的一种抽象资产,能被持有并且用来代表资产、现金或访问权限。
代币与镜像币不同,因为镜像坊协议本身跟代币完全没有任何人关联。发送镜像币是镜像坊平台的内在动作,但发送或拥有代币并不是镜像坊协议中定义的内容。镜像坊账户的镜像币余额在协议级别处理,而镜像坊账户的代币余额在智能合同级别处理。要在镜像坊上创建新代币,你必须创建两个新的智能合同。部署后,智能合同将处理大部份内容,主要包括大部份权,迁移和访问权限。
代币有可替代性代币和不容替代性代币,标准分别是ERC20[3]和ERC721[4],目前市面上比较火爆的 NFT 就是一种不容替代性代币。
Web3.0 概要
从信息互联网到价值互联网
1989 年,Tim Bernes-Lee 撰写了一篇题为“Information Management: A Proposal”的论文,其中他将“互联网”一词描述为两个由超文本链接相互连接而成的信息系统互联网,这就是 Web 1.0。
Web 1.0 发生在 1990 至 2004 年间,Netscape、谷歌、Yahoo、Amazon、eBay、Java 和 AOL 等公司凭借其浏览器和搜索引擎主导了互联网,这些平台是 Web 1.0 黄金时代的内容创造者,而上面的绝大多数用户是内容的消费者。
随着社交媒体平台的出现,Web 2.0 时期开始于 2004 年。在 Web 2.0 黄金时代,用户能够上传自己的文本、图片和视频等内容到平台上,无须是内容的被动接受者,而是能创造内容并与其他人进行交流。
在 Web 2.0 黄金时代,人们变成各种应用程序的用户,并在这些产品上创造大量的内容,这些统计数据被两个虚拟化的平台所掌控。
Web 3.术逐步形成的“谁创造,谁拥有”的关系价值。
镜像坊官网[5]对 Web 3.0 主要特征的总结如下表所示:
Web3 is decentralized:instead of large swathes of the internet controlled and owned by centralized entities, ownership gets distributed amongst its builders and users.Web3 is permissionless :everyone has equal access to participate in Web3, and no one gets excluded.Web3 has native payments:it uses cryptocurrency for spending and sending money online instead of relying on the outdated infrastructure of banks and payment processors.Web3 is trustless :it operates using incentives and economic mechanisms instead of relying on trusted third-parties.Web 2.0 与 Web 3.0 合作开发范式对比
Web 2.0 合作开发范式:
需要合作开发登录、注册功能,让用户绑定邮箱、绑定手机,需要搭建统计数据库来储存用户注册信息以及用户交互统计数据使用前端代码语言(JavaScript, HTML, CSS)来合作开发页面逻辑,需要搭建两个服务器来部署前端页面使用后端代码语言(像 Node.js, Java, Go 等)来合作开发业务逻辑,并需要搭建两个服务器来部署后端服务,并需要运维服务大部份代码、统计数据都部署在虚拟化的服务器上,大部份控制权归合作开发者Web 3.0 合作开发范式:
不需要用户绑定邮箱,绑定手机,能直接透过钱包登录,也不需要储存用户信息能不需要搭建前端服务器,用户可透过 IPFS 或 arweave 储存前端页面,并进行访问不需要搭建后端服务器,后端逻辑是用智能合同编写的,运行在 EVM 上的不需要搭建统计数据库,历史统计数据与统计数据库操作透过 TheGraph 来实现实战:去虚拟化的 HPC 代币买卖系统
下面我们将如前所述镜像坊合作开发一种遵循ERC20[6]标准的可替代性代币,叫做 HPC,并提供两个单纯的页面进行 HPC 代币的买卖。
安装客户端&生成账户
根据官网https://geth.ethereum.org/docs/指导安装geth客户端并生成两个测试账号。
Mac 下安装 gethbrew tap ethereum/ethereum brew install ethereum 安装完 geth 后会同时提供两个钱包工具 Clef,可用于账号管理和进行买卖签名mkdir -p geth-config/keystore clef newaccount –keystore geth-config/keystore # 运行两次,创建两个测试账户 clef newaccount –keystore geth-config/keystore创建完账户后能看到geth-config/keystore目录下多了两个账号的配置文件,后续也能利用这两个文件将账户导入其他钱包
合作开发智能合同(类比服务端代码)
使用solidity[7]语言进行合作开发,根据ERC20[8]标准智能合同需要实现以下接口,同时在代码中设定智能合同的拥有者能调用 mint 函数进行挖矿产生代币,完整项目代码参见https://github.com/watchsky/hpc_eth_coin/tree/master/contractspragma solidity ^0.5.2; interface IERC20 { function transfer(address to, uint256 value) external returns (bool); function approve(address spender, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool); function totalSupply() external view returns (uint256); function balanceOf(address who) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); }安装 solidity 编译器,Mac 系统使用 brew 安装brew install solidity 编译合同solc –bin –abi HippoCoin.sol # 在代码目录下执行查看买卖记录https://goerli.etherscan.io/address/0x74fe09b3ba8adea31f6448f4c742e9148a262d9b
代币详情https://goerli.etherscan.io/token/0x74fe09b3ba8adea31f6448f4c742e9148a262d9b
合作开发前端页面
因为需要透过页面来进行 HPC 代币的买卖,因此需要使用两个 web 钱包来进行买卖的签名和发送。这里我们使用MetaMask[9]钱包,它支持透过浏览器插件[10]的方式运行。为了测试,我们将前面创建的两个账户(0xee45cE18A60C2Df0B092185Ca4C0B483018FB07B 和 0xEC30B4dAec9B113E5009a2259e7A4f201aE1D709)导入 MetaMask,如下表所示图右图请求连接钱包:
export constrequestMetamaskAccount =async () => { if (!ethereum) { return; } const accounts = await ethereum.request({ method: “eth_accounts” }); if (accounts.length === 0) { currentAccount = null; } else if (accounts[0] !== currentAccount) { currentAccount = accounts[0]; } return currentAccount; };发送买卖:
consttoAddress = document.getElementById(“toAddress”).value.trim(); const amount = document.getElementById(“amount”).value.trim(); const contractAddress = 0x74FE09B3bA8AdEa31f6448f4c742e9148A262d9b; const abiInterface = new utils.Interface(abi); const functionData = abiInterface.encodeFunctionData(“transfer”, [ toAddress, parseInt(amount), ]);const transactionParameters = { nonce: “0x00”, // ignored by MetaMask gasPrice: “0x94810dee”, // customizable by user during MetaMask confirmation. gas: “0x8a82”, // customizable by user during MetaMask confirmation. to: contractAddress, // Required except during contract publications. from: account, // must match users active address. value: “0x00”, // Only required to send ether to the recipient from the initiating external account. data: functionData, chainId: “0x5”, // Used to prevent transaction reuse across blockchains. Auto-filled by MetaMask. }; const txHash = awaitethereum.request({ method:“eth_sendTransaction”, params: [transactionParameters], }); 对静态资源使用 webpack 打包构建,然后透过 ipfs 将页面资源部署到去虚拟化的互联网中为了让大家对 Web3.0 常见的许多下层控制技术有所介绍,责任编辑的案例没有使用任何人框架来合作开发,但实际合作开发中我们能利用许多工具来帮助合作开发提效,例如Home – Truffle Suite[11]、Embark into the Ether. | Embark[12]、Fleek: Build on the New Internet[13]、Remix – Ethereum IDE[14]。