分布式应用
在本章中,我们将探讨分布式应用或DApps的世界。从以太坊的早期开始,创始人的愿景远比“智能合约”更广阔:不亚于重新创建网络并创建一个新的DApp世界,称为web3恰如其分。 智能合约是分布式应用程序的控制逻辑和支付功能的一种方式。 Web3 DApps是关于分布式应用程序的其他所有方面:存储,消息传递,命名等(参见Web3:使用智能合约和P2P技术的分布式Web)
虽然“分布式应用程序”是对未来的大胆愿景,但“DApp”一词通常适用于任何具有Web前端的智能合约。其中一些所谓的DApps是高度集中的应用程序(CApps?)。小心虚假的DApps! 在本章中,我们将开发和部署一个样本DApp:一个拍卖平台。您可以在code/auction_dapp下的图书库中找到源代码。我们将查看拍卖应用程序的每个方面,并了解我们如何尽可能地分散应用程序。首先,让我们仔细研究一下DApps的定义特征和优势。
什么是DApp?
DApp是一个大部分或完全分散的应用程序。 考虑一个应用程序能分散的所有可能的方面:后端软件(应用程序逻辑),前端软件,数据存储,消息通信,名称解析。
这些中的每一个都可以在某种程度上集中或稍微分散。例如,可以将前端开发为在中央服务器上运行的Web应用程序,或者作为在您的设备上运行的移动应用程序。后端和存储可以位于私有服务器和专有数据库上,也可以使用智能合约和P2P存储。 创建的DApp有很多典型集中式架构无法提供的优点: 弹性:由于业务逻辑由智能合约控制,因此DApp后端将在区块链平台上完全分发和管理。与部署在集中式服务器上的应用程序不同,DApp将没有停机时间,只要平台仍在运行,它就会继续可用。 透明度:DApp的链上特性允许每个人检查代码并更加确定其功能。与DApp的任何交互都将永久存储在区块链中。 审查阻力:只要用户可以访问以太坊节点(必要时运行一个),用户将始终能够与DApp交互而不受任何集中控制的干扰。在网络上部署代码后,任何服务提供商,甚至智能合约的所有者都无法更改代码。
在今天的以太坊生态系统中,很少有真正分散的应用程序 - 大多数仍然依赖于集中服务和服务器来完成其部分操作。在未来,我们希望任何DApp的每个部分都可以以完全分散的方式运行。
后端(智能合约)
在DApp中,智能合约用于存储业务逻辑(程序代码)和应用程序的相关状态。您可以认为在常规应用程序中替换服务器端(也称为“后端”)组件的智能合约。当然,这是一种过于简单化的做法。其中一个主要区别是智能合约中执行的任何计算都非常昂贵,因此应尽可能保持最小化。因此,确定应用程序的哪些方面需要可信、分散的执行平台非常重要。 以太坊智能合约允许您构建架构,其中智能合约网络在彼此之间调用和传递数据,随时读取和写入自己的状态变量,其复杂性仅区块 gas limit的限制。部署智能合约后,未来许多其他开发人员都可以使用您的业务逻辑。 智能合约架构设计的一个主要考虑因素是部署后无法更改智能合约的代码。如果使用可访问的 SELFDESTRUCT 操作码对其进行编程,则可以将其删除,但除完全删除外,不能以任何方式更改代码。 智能合约架构设计的第二个主要考虑因素是DApp大小。一个非常庞大的单片智能合约可能会花费大量的gas来部署和使用。因此,某些应用程序可能会选择进行离线计算和外部数据源。但请记住,让DApp的核心业务逻辑依赖于外部数据(例如,来自中央服务器)意味着您的用户必须信任这些外部资源。
前端(Web用户界面)
与DApp的业务逻辑不同,DApp需要开发人员理解EVM和新语言(如Solidity),DApp的客户端接口可以使用标准Web技术(HTML,CSS,JavaScript等)。这允许传统的Web开发人员使用熟悉的工具,库和框架。与以太坊的交互,例如签名消息,发送交易和管理密钥,通常通过网络浏览器,通过MetaMask等扩展进行(参见[intro_chapter])。 虽然也可以创建移动DApp,但目前很少有资源可以帮助创建移动DApp前端,这主要是因为缺少可以作为具有密钥管理功能的轻客户端的移动客户端。 前端通常通过web3.js JavaScript库链接到以太坊,该库与前端资源捆绑在一起,并由Web服务器提供给浏览器。
数据存储
由于高昂的gas成本和目前较低的区块gas limit,智能合约不太适合存储或处理大量数据。因此,大多数DApps利用离线数据存储服务,这意味着它们将数据存储平台上的庞大数据存储在以太坊链中。该数据存储平台可以是集中的(例如,典型的云数据库),或者数据可以分散,存储在诸如IPFS的P2P平台或者以太坊自己的Swarm平台上。 分散式P2P存储非常适合存储和分发大型静态资产,如图像,视频和应用程序前端Web界面(HTML,CSS,JavaScript等)的资源。我们接下来会看几个选项。 星际文件系统(IPFS)是一种分散的内容可寻址存储系统,它在P2P网络中的对等体之间分配存储的对象。 “内容可寻址”意味着对每条内容(文件)进行散列并使用散列来标识该文件。然后,您可以通过其哈希请求从任何IPFS节点检索任何文件。 IPFS旨在取代HTTP作为交付Web应用程序的首选协议。这些文件不是在单个服务器上存储Web应用程序,而是存储在IPFS上,可以从任何IPFS节点检索。 有关IPFS的更多信息,请访问https://ipfs.io。 Swarm是另一种内容可寻址的P2P存储系统,类似于IPFS。 Swarm由以太坊基金会创建,作为Go-Ethereum工具套件的一部分。与IPFS一样,它允许您存储由Swarm节点传播和复制的文件。您可以通过哈希引用任何Swarm文件来访问它。 Swarm允许您从分散的P2P系统访问网站,而不是中央Web服务器。 Swarm的主页本身存储在Swarm上,可以在Swarm节点或网关上访问:https://swarm-gateways.net/bzz:/theswarm.eth/。
分散的消息通信协议
任何应用程序的另一个主要组件是进程间通信。这意味着能够在应用程序之间,应用程序的不同实例之间或应用程序的用户之间交换消息。传统上,这是通过依赖中央服务器来实现的。但是,基于服务器的协议有各种分散的替代方案,通过P2P网络提供消息传递。最值得注意的DApps P2P消息传递协议是Whisper,它是以太坊基金会Go-Ethereum工具套件的一部分。 可以分散的应用程序的最后一方面是名称解析。 我们将在本章后面仔细研究以太坊的名称服务;现在,让我们深入研究一个例子。
基本DApp示例:拍卖DApp
在本节中,我们将开始构建一个示例DApp,以探索各种分散工具。我们的DApp将实施分散式拍卖。 拍卖DApp允许用户注册“契约”token,该token代表一些独特的资产,例如房屋,汽车,商标等。一旦token被注册,token的所有权将转移到拍卖DApp,允许它上市销售。 Auction DApp列出了每个注册的token,允许其他用户进行出价。在每次拍卖期间,用户可以加入专门为该拍卖创建的聊天室。拍卖完成后,契约token的所有权将转移给拍卖的获胜者。 整个拍卖过程可以在Auction DApp中看到:一个简单的拍卖DApp示例。 拍卖DApp的主要组成部分是: 实施ERC721不可替代“契约”token的智能合约(DeedRepository); 实施拍卖(AuctionRepository)以出售契约的智能合约; 使用Vue / Vuetify JavaScript框架的Web前端; web3.js库连接到以太坊链(通过MetaMask或其他客户端); 一个Swarm客户端,用于存储图像等资源; 一个Whisper客户端,为所有参与者创建每个拍卖聊天室。
图2.拍卖DApp:一个简单的拍卖DApp示例 您可以在图书库中找到拍卖DApp的源代码。
拍卖DApp:后端智能合约
我们的Auction DApp示例由两个智能合约支持,我们需要在以太坊区块链上部署它们以支持应用程序:AuctionRepository和DeedRepository。 让我们首先看看DeedRepository中显示的DeedRepository:一个用于拍卖的ERC721契约令牌。该合同是与ERC721兼容的不可互换的令牌(参见[erc721])。
示例1. DeedRepository.sol:用于拍卖的ERC721契约令牌
如您所见,DeedRepository契约是ERC721兼容令牌的直接实现。 我们的拍卖DApp使用DeedRepository合同为每次拍卖发放和跟踪令牌。拍卖本身由AuctionRepository合同编排。这个合同太长了,不能完全包含在这里,但AuctionRepository.sol:主要的Auction DApp智能合约显示了合同和数据结构的主要定义。整个合同可以在本书的GitHub存储库中找到。
示例2. AuctionRepository.sol:主要的Auction DApp智能合约
AuctionRepository合约使用以下功能管理所有拍卖: 您可以使用书籍存储库中的松露将这些合同部署到您选择的以太坊区块链中(例如,Ropsten)。
DApp治理
如果你仔细阅读Auction DApp的两个智能合约,你会注意到一些重要的事情:没有特殊的帐户或角色对DApp有特殊的权限。每个拍卖都有一个具有一些特殊功能的所有者,但Auction DApp本身没有特权用户。 这是分散DApp治理并在部署后放弃任何控制的有意选择。相比之下,一些DApp具有一个或多个具有特殊功能的特权帐户,例如终止DApp合同,覆盖或更改其配置或“否决”某些操作的能力。通常,这些治理功能在DApp中引入,以避免由于错误而可能出现的未知问题。 治理问题是一个特别难以解决的问题,因为它代表了一把双刃剑。一方面,特权账户是危险的;如果受到损害,他们可以破坏DApp的安全性。另一方面,没有任何特权帐户,如果发现错误,则没有恢复选项。我们已经看到这些风险在以太坊DApps中都有所体现。在DAO([real_world_example_the_dao]和[ethereum_fork_history])的情况下,有一些特权帐户称为“策展人”,但他们的能力非常有限。这些帐户无法覆盖DAO攻击者撤回资金。在最近的一个案例中,分散的交易所Bancor经历了大规模的盗窃,因为特权管理账户遭到了破坏。事实证明,Bancor没有像最初假设的那样分散。 在构建DApp时,您必须决定是否要使智能合约真正独立,启动它们然后无法控制,或者创建特权帐户并冒险受到攻击。这两种选择都存在风险,但从长远来看,真正的DApps无法对特权帐户进行专门访问 - 这种权限不是分散的。
拍卖DApp:前端用户界面
一旦部署了Auction DApp的合同,您就可以使用自己喜欢的JavaScript控制台和web3.js或其他web3库与它们进行交互。但是,大多数用户需要易于使用的界面。我们的Auction DApp用户界面是使用Google的Vue2 / Vuetify JavaScript框架构建的。 您可以在本书的存储库的code / auction_dapp / frontend文件夹中找到用户界面代码。该目录具有以下结构和内容: 部署合同后,编辑frontend / src / config.js中的前端配置,并在部署时输入DeedRepository和AuctionRepository合同的地址。前端应用程序还需要访问提供JSON-RPC和WebSockets接口的以太坊节点。配置完前端后,在本地计算机上使用Web服务器启动它: Auction DApp前端将启动,可通过http:// localhost:8080上的任何Web浏览器访问。 如果一切顺利,您应该会看到Auction DApp用户界面中显示的屏幕,其中显示了在Web浏览器中运行的Auction DApp。
图3. Auction DApp用户界面
进一步下放拍卖DApp 我们的DApp已经非常分散,但我们可以改进。 AuctionRepository合同独立于任何监督,对任何人开放。一旦部署,它就无法停止,也不能控制任何拍卖。每次拍卖都有一个单独的聊天室,允许任何人在没有审查或识别的情况下就拍卖进行沟通。各种拍卖资产(例如描述和相关图像)存储在Swarm上,使得它们难以进行审查或阻止。 任何人都可以通过手动构建事务或在本地计算机上运行Vue前端来与DApp交互。 DApp代码本身是开源的,并在公共存储库上协作开发。 我们可以做两件事来使这个DApp分散和弹性:将所有应用程序代码存储在Swarm或IPFS上。 使用以太坊名称服务通过引用名称访问DApp。
我们将在下一节中探讨第一个选项,我们将深入研究以太坊名称服务(ENS)中的第二个选项。
在Swarm上存储拍卖DApp
我们在本章前面介绍了Swarm in Swarm。我们的拍卖DApp已经使用Swarm存储每次拍卖的图标图像。这是一种比尝试在以太坊上存储数据更有效的解决方案,这是昂贵的。与将这些图像存储在Web服务器或文件服务器等集中式服务中相比,它也更具弹性。 但我们可以更进一步。我们可以将DApp本身的整个前端存储在Swarm中,并直接从Swarm节点运行它,而不是运行Web服务器。
准备Swarm
首先,您需要安装Swarm并初始化Swarm节点。 Swarm是以太坊基金会Go-Ethereum工具套件的一部分。请参阅[go_ethereum_geth]中安装Go-Ethereum的说明,或安装Swarm二进制版本,按照Swarm文档中的说明进行操作。 一旦安装了Swarm,就可以通过使用version命令运行它来检查它是否正常工作: 要开始运行Swarm,您必须告诉它如何连接到Geth实例,以访问JSON-RPC API。按照“入门指南”中的说明开始使用。 当你启动Swarm时,你应该看到这样的东西: 您可以通过连接到本地Swarm网关Web界面来确认您的Swarm节点是否正常运行:http:// localhost:8500。 您应该看到类似于localhost上的Swarm网关中的屏幕,并且能够查询任何Swarm哈希或ENS名称。
图4. localhost上的Swarm网关
将文件上传到Swarm 一旦你的本地Swarm节点和网关运行,你就可以上传到Swarm,只需参考文件哈希就可以在任何Swarm节点上访问这些文件。 让我们通过上传文件来测试: Swarm已上传README.md文件并返回一个哈希,您可以使用该哈希从任何Swarm节点访问该文件。例如,您可以使用公共Swarm网关。 虽然上传一个文件相对简单,但上传整个DApp前端会有点复杂。这是因为各种DApp资源(HTML,CSS,JavaScript,库等)都嵌入了彼此的引用。通常,Web服务器将URL转换为本地文件并提供正确的资源。我们可以通过打包我们的DApp来实现Swarm的相同功能。
在拍卖DApp中,有一个用于打包所有资源的脚本: 这个命令的结果将是一个新目录,代码/ auction_dapp / frontend / dist,它包含整个Auction DApp前端,打包在一起: 现在,您可以使用up命令和—recursive选项将整个DApp上传到Swarm。在这里,我们还告诉Swarm index.html是加载此DApp的默认路径: 现在,我们的整个Auction DApp都托管在Swarm上,并可通过Swarm URL访问:BZZ:// ab164cf37dc10647e43a233486cdeffa8334b026e32a480dd9cbd020c12d4581 我们在分散DApp方面取得了一些进展,但我们使用起来更加困难。像这样的URL比像auction_dapp.com这样漂亮的名字更不方便用户使用。为了获得权力下放,我们是否被迫牺牲可用性?不必要。在下一节中,我们将研究以太坊的名称服务,它允许我们使用易于阅读的名称,但仍然保留了我们应用程序的分散性。
以太坊名称服务(ENS)
您可以设计世界上最好的智能合约,但如果您没有为用户提供良好的界面,他们将无法访问它。 在传统的互联网上,域名系统(DNS)允许我们在浏览器中使用人类可读的名称,同时将这些名称解析为IP地址或幕后的其他标识符。在以太坊区块链上,以太坊命名系统(ENS)以分散的方式解决了同样的问题。 例如,以太坊基金会捐赠地址为0xfB6916095ca1df60  bB79Ce92cE3Ea74c37c5d359;在支持ENS的钱包中,它只是以太坊.eth。 ENS不仅仅是一份智能合约;它是DApp的基础,提供分散的名称服务。此外,ENS由许多DApps支持,用于注册,管理和注册名称的拍卖。 ENS演示了DApps如何协同工作:它是为其他DApp服务的DApp,由DApps生态系统支持,嵌入在其他DApp中,等等。
在本节中,我们将了解ENS的工作原理。我们将演示如何设置自己的名称并将其链接到钱包或以太坊地址,如何将ENS嵌入到另一个DApp中,以及如何使用ENS命名DApp资源以使其更易于使用。
以太坊名称服务的历史
名称注册是区块链的第一个非货币应用程序,由Namecoin开创。以太坊白皮书给出了一个两行的Namecoin注册系统作为其示例应用程序之一。 Geth和C ++以太网客户端的早期版本有一个内置的namereg合约(不再使用),并且提供了许多用于名称服务的提议和ERC,但只有当Nick Johnson在2016年开始为以太坊基金会工作时才在他的支持下,该项目开始了对注册商的认真工作。 ENS于2017年5月4日星球大战日发布(在3月15日Pi日试图推出之后失败)。
ENS规范
ENS主要在三个以太坊改进提案中指定:EIP-137,其规定了ENS的基本功能; EIP-162,描述了.eth根的拍卖系统;和EIP-181,它规定了地址的反向登记。 ENS遵循“三明治”设计理念:底部是一个非常简单的层,其次是更复杂但可替换的代码层,顶层非常简单,可以将所有资金保存在不同的帐户中。
底层:名称所有者和解析器
ENS操作“节点”而不是人类可读的名称:使用“Namehash”算法将人类可读的名称转换为节点。 ENS的基础层是ERC137定义的一个非常简单的合同(少于50行代码),它只允许节点的所有者设置有关其名称的信息并创建子节点(ENS等效于DNS子域)。 基础层上的唯一功能是使节点所有者能够设置有关其自身节点的信息(特别是解析器,生存时间或转移所有权)以及创建新子节点的所有者。
Namehash算法
Namehash是一种递归算法,可以将任何名称转换为标识名称的哈希。 “递归”意味着我们通过解决同一类型的较小问题的子问题来解决问题,然后使用子问题的解来解决原始问题。 Namehash以递归方式散列名称的组件,为任何有效的输入域生成唯一的固定长度字符串(或“节点”)。例如,subdomain.example.eth的Namehash节点是keccak('<example.eth>'node)+ keccak('<subdomain>')。我们必须解决的子问题是计算example.eth的节点,即keccak('<。eth>'节点)+ keccak('<example>')。首先,我们必须计算eth的节点,即keccak(<root node>)+ keccak('<eth>')。 根节点就是我们称之为递归的“基本情况”,我们显然无法递归地定义它,或者算法永远不会终止!根节点定义为`0x0000000000000000000000000000000000000000000000000000000000000000` (32 zero bytes). 把这些都放在一起,subdomain.example.eth的节点因此是keccak(keccak(0xcc … 0 + keccak('eth'))+ keccak('example'))+ keccak('subdomain')) 。 通用化,我们可以按如下方式定义Namehash函数(根节点的基本情况,或空名称,后跟递归步骤):
在Python中,这变为: 因此,mastering-ethereum.eth将按如下方式处理: 当然,子域本身可以有子域:subdomain.example.eth之后可以有sub.subdomain.example.eth,然后是sub.sub.subdomain.example.eth,依此类推。为了避免昂贵的重新计算,由于Namehash仅依赖于名称本身,因此可以预先计算给定名称的节点并将其插入到合同中,从而无需进行字符串操作并允许立即查找ENS记录,而不管其中的组件数量是多少。原始名称。
如何选择有效的名称
名称由一系列点分隔标签组成。虽然允许使用大写和小写字母,但所有标签都应遵循UTS#46规范化过程,在对其进行散列之前对其进行大小写折叠,因此具有不同大小但拼写相同的名称最终将使用相同的Namehash。 您可以使用任何长度的标签和域,但为了与传统DNS兼容,建议使用以下规则: 标签每个不应超过64个字符。 完整的ENS名称不应超过255个字符。 标签不应以连字符开头或结尾,也不应以数字开头。
根节点所有权
这种分层系统的结果之一是它依赖于根节点的所有者,他们能够创建顶级域(TLD)。虽然最终的目标是为新TLD采用分散的决策流程,但在撰写本文时,根节点由7个4的多重控制控制,由不同国家的人们持有(构建为7的反映) DNS系统的关键人员)。因此,7个关键持有人中至少有4个人中的大多数都需要进行任何变更。 目前,这些关键人物的目的和目标是与社区达成共识: 在评估系统后,将.eth TLD的临时所有权迁移并升级为更长久的合同。 如果社群同意需要,则允许添加新TLD。 在同意,测试和实施此类系统时,将根multisig的所有权迁移到更分散的合同。 作为处理顶级注册表中的任何错误或漏洞的最后手段。
解析器
基本的ENS合同无法向名称添加元数据;这就是所谓的“解析合同”的工作。这些是用户创建的合同,可以回答有关名称的问题,例如Swarm地址与应用程序关联的内容,接收应用程序付款的地址(以太币或代币),或应用程序的哈希值(验证)它的完整性)。
中间层:.eth节点 在撰写本文时,唯一可以在智能合约中注册的顶级域名是.eth。
注意
目前正在努力使传统的DNS域名所有者能够获得ENS所有权。虽然理论上这可能适用于.com,但到目前为止,唯一实现此目的的域是.xyz,并且仅在Ropsten testnet上。 .eth域名通过拍卖系统分发。没有保留列表或优先级,获取名称的唯一方法是使用系统。拍卖系统是一段复杂的代码(超过500行); ENS中的大部分早期开发工作(和错误!)都在系统的这一部分。然而,它也是可替换和可升级的,没有资金的风险 - 更多的是后来。
Vickrey拍卖
名称通过修改后的Vickrey拍卖分发。在传统的Vickrey拍卖中,每个投标人都提交密封投标,并且所有投标人同时被公开,此时最高出价者赢得拍卖,但只支付第二高的出价。因此,竞标者被激励不要向他们出价低于名称的真实价值,因为竞标他们的真实价值会增加他们赢得的机会,但不会影响他们最终支付的价格。 在区块链上,需要进行一些更改: 为确保投标人不提交投标,他们无意支付,他们必须事先锁定等于或高于其投标价值,以保证投标有效。 由于您无法隐藏区块链上的机密信息,因此投标人必须至少执行两项交易(提交揭示流程),以隐藏其出价的原始值和名称。 由于您无法在分散系统中同时显示所有出价,因此投标人必须自行展示自己的出价;如果他们不这样做,他们就会丧失锁定的资金。如果没有这种没收,人们可以做出很多出价,并选择只披露一两个,将密封拍卖变成传统的增加价格拍卖。
因此,拍卖分为四个步骤:
-
开始拍卖。这是广播注册名称的意图所必需的。这将创建所有拍卖截止日期。这些名称是经过哈希处理的,因此只有在字典中具有该名称的人才能知道哪个拍卖被打开了。这允许一些隐私,这在您创建新项目并且不想共享其详细信息时非常有用。您可以同时打开多个虚拟拍卖,因此如果有人关注您,他们就不能简单地对您打开的所有拍卖进行出价。
-
密封投标。您必须在投标截止日期之前执行此操作,方法是将一定数量的以太币与秘密消息的哈希值相关联(其中包括名称的哈希值,实际的出价金额和盐值)。您可以锁定比您实际出价更多的以太,以掩盖您的真实估值。
-
显示出价。在显示期间,您必须进行一次显示出价的交易,然后计算最高出价和第二高出价,并将以太送回不成功的出价人。每次出价都会重新计算当前的赢家;因此,在揭示截止日期到期之前设置的最后一个成为总冠军。
-
之后清理。如果您是赢家,则可以最终确定竞价,以便取消您的出价与第二高出价之间的差额。如果您忘记透露,您可以进行延迟披露并收回一些出价。
顶层:契约
ENS的最高层是另一个超级简单的合同,只有一个目的:持有资金。 当您赢得一个名字时,资金实际上并没有被发送到任何地方,而是在您想要保留名称的期间(至少一年)被锁定。这有点像保证回购:如果所有者不再需要该名称,他们可以将其卖回系统并恢复他们的以太(因此持有该名称的成本是做出回报大于零的事情的机会成本) )。 当然,单一合同持有数百万美元的以太币已被证明是非常危险的,因此ENS为每个新名称创建契约。契约合约非常简单(大约50行代码),它只允许将资金转回单个账户(契约所有者)并由单个实体(注册商合同)调用。这种方法大大减少了攻击面,因为错误可能会使资金面临风险。
注册名称
正如我们在Vickrey拍卖会上看到的那样,在ENS中注册名称是一个分为四个步骤的过程。首先我们对任何可用的名称进行出价,然后我们会在48小时后显示我们的出价以确保名称。 ENS注册时间表是显示注册时间表的图表。 让我们注册我们的名字! 我们将使用几个可用的用户友好界面中的一个来搜索可用的名称,对名称ethereumbook.eth进行出价,显示出价并保护名称。 ENS有许多基于Web的界面,允许我们与ENS DApp进行交互。对于这个例子,我们将使用MyCrypto接口和MetaMask作为我们的钱包。 图5.注册的ENS时间表
首先,我们需要确保我们想要的名称可用。在写这本书时,我们真的想注册名称mastering.eth,但是,在MyCrypto.com上搜索ENS名称显示它已经被采用了!由于ENS注册仅持续一年,因此将来可能可以保护该名称。在此期间,让我们搜索ethereumbook.eth(在MyCrypto.com上搜索ENS名称)。 图6.在MyCrypto.com上搜索ENS名称 太棒了!这个名字可用。为了注册它,我们需要继续开始拍卖ENS名称。让我们解锁MetaMask并开始为ethereumbook.eth拍卖。 图7.开始ENS名称的拍卖 让我们出价。为此,我们需要按照放置ENS名称的出价中的步骤进行操作。 图8.为ENS名称设置出价
警告
如Vickrey拍卖中所述,您必须在拍卖完成后48小时内公布您的出价,否则您将失去投标中的资金。我们忘记这样做并且自己减掉0.01 ETH吗?你打赌我们做到了。 截取屏幕截图,保存您的密码(作为出价的备份),并在日历中添加提醒以显示日期和时间,这样您就不会忘记并丢失资金。