”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > WebA 简单演示的第一步

WebA 简单演示的第一步

发布于2024-11-07
浏览:344

Web3 肯定会继续存在。比特币、以太坊、Solana 等网络正在快速发展,所有应用程序都建立在它们之上。

如果您是 JavaScript 开发人员并想尝试 Web3,第一步就是安装 Metamask。从那里,您可以使用 Metamask 注入浏览器的 window.ethereum 对象上可用的 API 方法之一。

任何 Web3 项目通常都是从连接钱包开始的。在 Web3 中,钱包就像一个用户帐户,但与 Gmail、Instagram 或 TikTok 等中心化服务的帐户不同,钱包是去中心化网络本身的核心部分。 Metamask 充当代理,使其更容易与网络交互并执行创建钱包等操作。虽然还有其他创建钱包的方法,但 Metamask 是迄今为止最常见的方法。

考虑到这一点,让我们构建一个允许用户连接钱包的 Web 应用程序。

先决条件

您需要在浏览器中安装 Metamask 扩展程序,或者您可以在移动设备上下载他们的应用程序 - 这两个选项都可以。

图表

让我们看一下下图,它概述了 Web 应用程序的流程:

Your First Steps in WebA Simple Demo

逻辑

逻辑很简单,分为以下几个步骤:

  • 如果未安装 Metamask: 显示下载 Metamask 的链接。

这很简单——当安装 Metamask 时,它会注入 window.ethereum 对象。如果该对象不存在,我们可以假设 Metamask 尚未安装或启用。

  • 如果钱包未连接: 显示连接钱包的按钮。

如果window.ethereum可用,我们可以显示一个“连接”按钮,供用户链接他们的钱包。

  • 如果钱包已连接: 显示钱包地址。

window.ethereum提供的关键方法之一是request,可以使用它来请求帐户,如下所示:

   const accounts = await window.ethereum?.request({
     method: "eth_requestAccounts",
     params: [],
   });

   setAddress(accounts[0]);

这会提示用户访问钱包。如果他们授予权限,该方法将返回帐户数组。为了简单起见,我们将获取第一个帐户并显示其地址。

演示

如果您在未安装 Metamask 的情况下打开演示,您应该会看到如下内容:

Your First Steps in WebA Simple Demo

安装 Metamask 后,您应该会看到一个“连接”按钮。单击时,Metamask 将提示您选择要连接的帐户。查看以下 GIF 的视觉示例:

Your First Steps in WebA Simple Demo

注意最终状态如何显示钱包地址。尽管这个演示非常简单,但每个 Web3 应用程序都需要一个连接的钱包。有一些很棒的库,例如 RainbowKit 和 WAGMI,可以简化 Web3 集成。然而,在这个演示中,我使用简单的 Metamask API 方法来实现相同的结果。当然,还有许多边缘情况我尚未处理,例如如果用户拒绝访问或拥有多个帐户会发生什么 - 这只是可能出现的各种场景的几个示例。

代码

完整代码可以在GitHub上找到。

"use client";

import { MetaMaskInpageProvider } from "@metamask/providers";

import { useState, useEffect } from "react";

declare global {
  interface Window {
    ethereum?: MetaMaskInpageProvider;
  }
}

function Button(props: { connectWalletHandler: () => void; address: string }) {
  const styles = {
    display: "inline-block",
    padding: "20px 40px",
    border: "5px solid black",
    fontSize: 24,
    cursor: "pointer",
  };

  if (props.address) {
    const shortAddress = `${props.address.slice(0, 7)}...${props.address.slice(
      -5
    )}`;
    return 
Wallet: {shortAddress}
; } if (window.ethereum) { return (
Connect wallet
); } return ( Install Metamask ); } export default function Page() { const [clientSide, setClientSide] = useState(false); const [address, setAddress] = useState(""); const connectWalletHandler = async () => { const accounts = await window.ethereum?.request({ method: "eth_requestAccounts", params: [], }); if (!Array.isArray(accounts) || !accounts.length) { return; } setAddress(accounts[0]); }; useEffect(() => { setClientSide(true); }, []); if (!clientSide) { return >; } return (
); }

结论

这是一个非常基本的演示,大部分代码只是标准的 React。事实上,唯一与Web3相关的行是:

await window.ethereum?.request({
  method: "eth_requestAccounts",
  params: [],
});

Metamask 有替代品,这些钱包还注入一个类似于 window.ethereum 的对象,用于与其 API 交互。

您始终可以选择一个库,如前面提到的库,它可以处理 Web3 集成所需的大部分样板文件,并让您专注于业务和 UI 逻辑。

Web3 不会消失,而且很可能您最终需要将其包含在您的一个项目中。谁知道,您甚至可能成为加密货币爱好者!如果是这样的话,这就是您开始旅程的方式。

链接

  • 演示
  • 代码库
版本声明 本文转载于:https://dev.to/garciadiazjaime/your-first-steps-in-web3-a-simple-demo-5990?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何在无序集合中为元组实现通用哈希功能?
    如何在无序集合中为元组实现通用哈希功能?
    在未订购的集合中的元素要纠正此问题,一种方法是手动为特定元组类型定义哈希函数,例如: template template template 。 struct std :: hash { size_t operator()(std :: tuple const&tuple)const {...
    编程 发布于2025-05-22
  • 如何高效地在一个事务中插入数据到多个MySQL表?
    如何高效地在一个事务中插入数据到多个MySQL表?
    mySQL插入到多个表中,该数据可能会产生意外的结果。虽然似乎有多个查询可以解决问题,但将从用户表的自动信息ID与配置文件表的手动用户ID相关联提出了挑战。使用Transactions和last_insert_id() 插入用户(用户名,密码)值('test','test...
    编程 发布于2025-05-22
  • Go web应用何时关闭数据库连接?
    Go web应用何时关闭数据库连接?
    在GO Web Applications中管理数据库连接很少,考虑以下简化的web应用程序代码:出现的问题:何时应在DB连接上调用Close()方法?,该特定方案将自动关闭程序时,该程序将在EXITS EXITS EXITS出现时自动关闭。但是,其他考虑因素可能保证手动处理。选项1:隐式关闭终止数...
    编程 发布于2025-05-22
  • 如何在JavaScript对象中动态设置键?
    如何在JavaScript对象中动态设置键?
    在尝试为JavaScript对象创建动态键时,如何使用此Syntax jsObj['key' i] = 'example' 1;不工作。正确的方法采用方括号: jsobj ['key''i] ='example'1; 在JavaScript中,数组是一...
    编程 发布于2025-05-22
  • 如何使用Regex在PHP中有效地提取括号内的文本
    如何使用Regex在PHP中有效地提取括号内的文本
    php:在括号内提取文本在处理括号内的文本时,找到最有效的解决方案是必不可少的。一种方法是利用PHP的字符串操作函数,如下所示: 作为替代 $ text ='忽略除此之外的一切(text)'; preg_match('#((。 &&& [Regex使用模式来搜索特...
    编程 发布于2025-05-22
  • 如何在鼠标单击时编程选择DIV中的所有文本?
    如何在鼠标单击时编程选择DIV中的所有文本?
    在鼠标上选择div文本单击带有文本内容,用户如何使用单个鼠标单击单击div中的整个文本?这允许用户轻松拖放所选的文本或直接复制它。 在单个鼠标上单击的div元素中选择文本,您可以使用以下Javascript函数: function selecttext(canduterid){ if(do...
    编程 发布于2025-05-22
  • PHP与C++函数重载处理的区别
    PHP与C++函数重载处理的区别
    作为经验丰富的C开发人员脱离谜题,您可能会遇到功能超载的概念。这个概念虽然在C中普遍,但在PHP中构成了独特的挑战。让我们深入研究PHP功能过载的复杂性,并探索其提供的可能性。在PHP中理解php的方法在PHP中,函数超载的概念(如C等语言)不存在。函数签名仅由其名称定义,而与他们的参数列表无关。...
    编程 发布于2025-05-22
  • 如何解决AppEngine中“无法猜测文件类型,使用application/octet-stream...”错误?
    如何解决AppEngine中“无法猜测文件类型,使用application/octet-stream...”错误?
    appEngine静态文件mime type override ,静态文件处理程序有时可以覆盖正确的mime类型,在错误消息中导致错误消息:“无法猜测mimeType for for file for file for [File]。 application/application/octet...
    编程 发布于2025-05-22
  • 如何在GO编译器中自定义编译优化?
    如何在GO编译器中自定义编译优化?
    在GO编译器中自定义编译优化 GO中的默认编译过程遵循特定的优化策略。 However, users may need to adjust these optimizations for specific requirements.Optimization Control in Go Compi...
    编程 发布于2025-05-22
  • Python高效去除文本中HTML标签方法
    Python高效去除文本中HTML标签方法
    在Python中剥离HTML标签,以获取原始的文本表示Achieving Text-Only Extraction with Python's MLStripperTo streamline the stripping process, the Python standard librar...
    编程 发布于2025-05-22
  • 如何使用PHP从XML文件中有效地检索属性值?
    如何使用PHP从XML文件中有效地检索属性值?
    从php $xml = simplexml_load_file($file); foreach ($xml->Var[0]->attributes() as $attributeName => $attributeValue) { echo $attributeName,...
    编程 发布于2025-05-22
  • Java是否允许多种返回类型:仔细研究通用方法?
    Java是否允许多种返回类型:仔细研究通用方法?
    在Java中的多个返回类型:一种误解类型:在Java编程中揭示,在Java编程中,Peculiar方法签名可能会出现,可能会出现,使开发人员陷入困境,使开发人员陷入困境。 getResult(string s); ,其中foo是自定义类。该方法声明似乎拥有两种返回类型:列表和E。但这确实是如此吗...
    编程 发布于2025-05-22
  • 如何将来自三个MySQL表的数据组合到新表中?
    如何将来自三个MySQL表的数据组合到新表中?
    mysql:从三个表和列的新表创建新表 答案:为了实现这一目标,您可以利用一个3-way Join。 选择p。*,d.content作为年龄 来自人为p的人 加入d.person_id = p.id上的d的详细信息 加入T.Id = d.detail_id的分类法 其中t.taxonomy =...
    编程 发布于2025-05-22
  • 如何使用FormData()处理多个文件上传?
    如何使用FormData()处理多个文件上传?
    )处理多个文件输入时,通常需要处理多个文件上传时,通常是必要的。 The fd.append("fileToUpload[]", files[x]); method can be used for this purpose, allowing you to send multi...
    编程 发布于2025-05-22

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3