」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > WebA 簡單示範的第一步

WebA 簡單示範的第一步

發佈於2024-11-07
瀏覽:783

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]刪除
最新教學 更多>
  • Android如何向PHP服務器發送POST數據?
    Android如何向PHP服務器發送POST數據?
    在android apache httpclient(已棄用) httpclient httpclient = new defaulthttpclient(); httppost httppost = new httppost(“ http://www.yoursite.com/script.p...
    程式設計 發佈於2025-04-07
  • 如何在JavaScript對像中動態設置鍵?
    如何在JavaScript對像中動態設置鍵?
    在嘗試為JavaScript對象創建動態鍵時,如何使用此Syntax jsObj['key' i] = 'example' 1;不工作。正確的方法採用方括號: jsobj ['key''i] ='example'1; 在JavaScript中,數組是一...
    程式設計 發佈於2025-04-07
  • 如何將來自三個MySQL表的數據組合到新表中?
    如何將來自三個MySQL表的數據組合到新表中?
    mysql:從三個表和列的新表創建新表 答案:為了實現這一目標,您可以利用一個3-way Join。 選擇p。 *,d.content作為年齡 來自人為p的人 加入d.person_id = p.id上的d的詳細信息 加入T.Id = d.detail_id的分類法 其中t.taxonomy ...
    程式設計 發佈於2025-04-07
  • 如何在php中使用捲髮發送原始帖子請求?
    如何在php中使用捲髮發送原始帖子請求?
    如何使用php 創建請求來發送原始帖子請求,開始使用curl_init()開始初始化curl session。然後,配置以下選項: curlopt_url:請求 [要發送的原始數據指定內容類型,為原始的帖子請求指定身體的內容類型很重要。在這種情況下,它是文本/平原。要執行此操作,請使用包含以下標頭...
    程式設計 發佈於2025-04-07
  • 如何從Python中的字符串中刪除表情符號:固定常見錯誤的初學者指南?
    如何從Python中的字符串中刪除表情符號:固定常見錯誤的初學者指南?
    從python import codecs import codecs import codecs 導入 text = codecs.decode('這狗\ u0001f602'.encode('utf-8'),'utf-8') 印刷(文字)#帶有...
    程式設計 發佈於2025-04-07
  • 為什麼PYTZ最初顯示出意外的時區偏移?
    為什麼PYTZ最初顯示出意外的時區偏移?
    與pytz 最初從pytz獲得特定的偏移。例如,亞洲/hong_kong最初顯示一個七個小時37分鐘的偏移: 差異源利用本地化將時區分配給日期,使用了適當的時區名稱和偏移量。但是,直接使用DateTime構造器分配時區不允許進行正確的調整。 example pytz.timezone(&#...
    程式設計 發佈於2025-04-07
  • 如何使用Java.net.urlConnection和Multipart/form-data編碼使用其他參數上傳文件?
    如何使用Java.net.urlConnection和Multipart/form-data編碼使用其他參數上傳文件?
    使用http request 上傳文件上傳到http server,同時也提交其他參數,java.net.net.urlconnection and Multipart/form-data Encoding是普遍的。 Here's a breakdown of the process:Mu...
    程式設計 發佈於2025-04-07
  • 您如何在Laravel Blade模板中定義變量?
    您如何在Laravel Blade模板中定義變量?
    在Laravel Blade模板中使用Elegance 在blade模板中如何分配變量對於存儲以後使用的數據至關重要。在使用“ {{}}”分配變量的同時,它可能並不總是最優雅的解決方案。 幸運的是,Blade通過@php Directive提供了更優雅的方法: $ old_section =...
    程式設計 發佈於2025-04-07
  • 如何使用Python有效地以相反順序讀取大型文件?
    如何使用Python有效地以相反順序讀取大型文件?
    在python 反向行讀取器生成器 == ord('\ n'): 緩衝區=緩衝區[:-1] 剩餘_size- = buf_size lines = buffer.split('\ n'....
    程式設計 發佈於2025-04-07
  • 為什麼PHP的DateTime :: Modify('+1個月')會產生意外的結果?
    為什麼PHP的DateTime :: Modify('+1個月')會產生意外的結果?
    使用php dateTime修改月份:發現預期的行為在使用PHP的DateTime類時,添加或減去幾個月可能並不總是會產生預期的結果。正如文檔所警告的那樣,“當心”這些操作的“不像看起來那樣直觀。 考慮文檔中給出的示例:這是內部發生的事情: 現在在3月3日添加另一個月,因為2月在2001年只有2...
    程式設計 發佈於2025-04-07
  • 如何為PostgreSQL中的每個唯一標識符有效地檢索最後一行?
    如何為PostgreSQL中的每個唯一標識符有效地檢索最後一行?
    postgresql:為每個唯一標識符提取最後一行,在Postgresql中,您可能需要遇到與在數據庫中的每個不同標識相關的信息中提取信息的情況。考慮以下數據:[ 1 2014-02-01 kjkj 在數據集中的每個唯一ID中檢索最後一行的信息,您可以在操作員上使用Postgres的有效效率: ...
    程式設計 發佈於2025-04-07
  • 如何使用不同數量列的聯合數據庫表?
    如何使用不同數量列的聯合數據庫表?
    合併列數不同的表 當嘗試合併列數不同的數據庫表時,可能會遇到挑戰。一種直接的方法是在列數較少的表中,為缺失的列追加空值。 例如,考慮兩個表,表 A 和表 B,其中表 A 的列數多於表 B。為了合併這些表,同時處理表 B 中缺失的列,請按照以下步驟操作: 確定表 B 中缺失的列,並將它們添加到表的...
    程式設計 發佈於2025-04-07
  • 如何使用Depimal.parse()中的指數表示法中的數字?
    如何使用Depimal.parse()中的指數表示法中的數字?
    在嘗試使用Decimal.parse(“ 1.2345e-02”中的指數符號表示法表示的字符串時,您可能會遇到錯誤。這是因為默認解析方法無法識別指數符號。 成功解析這樣的字符串,您需要明確指定它代表浮點數。您可以使用numbersTyles.Float樣式進行此操作,如下所示:[&& && && ...
    程式設計 發佈於2025-04-07
  • PHP陣列鍵值異常:了解07和08的好奇情況
    PHP陣列鍵值異常:了解07和08的好奇情況
    PHP數組鍵值問題,使用07&08 在給定數月的數組中,鍵值07和08呈現令人困惑的行為時,就會出現一個不尋常的問題。運行print_r($月)返回意外結果:鍵“ 07”丟失,而鍵“ 08”分配給了9月的值。 此問題源於PHP對領先零的解釋。當一個數字帶有0(例如07或08)的前綴時,PHP將...
    程式設計 發佈於2025-04-07
  • 如何將MySQL數據庫添加到Visual Studio 2012中的數據源對話框中?
    如何將MySQL數據庫添加到Visual Studio 2012中的數據源對話框中?
    在Visual Studio 2012 儘管已安裝了MySQL Connector v.6.5.4,但無法將MySQL數據庫添加到實體框架的“ DataSource對話框”中。為了解決這一問題,至關重要的是要了解MySQL連接器v.6.5.5及以後的6.6.x版本將提供MySQL的官方Visual...
    程式設計 發佈於2025-04-07

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3