# 使用Moralis開發Web3.0程式-入門篇(使用Next.js) ###### tags: `開發者路徑` ###### 兌心科技 Insight Software : 使用Moralis開發Web3.0程式-入門篇(使用Next.js) # ![](https://i.imgur.com/Jmew3Wk.png) 在前文(Web3.0技術簡介)中提到,可以使用Relay平台來做為RPC節點的提供者來與區塊鏈溝通,可以節省很多開發的時間,它們之中除了提供許多進階的API之外,也提供很多對於 DApp開發者很方便的後台功能,像是Moralis號稱Web3.0中的Firebase,有身份驗證、數據庫、Web3 傳輸等功能,如你所想,Moralis 可以更輕鬆地完成大多數這些複雜的事情。 本文將會用一個簡單的Next.js範例,首先連結MetaMask錢包,並介紹如何利用Moralis取得錢包的資訊,並將虛擬貨幣由一個錢包轉移到另一個錢包。 Next.js 是一個基於 React 的框架,它同時支援 SSR (Server Side Rendering) 與 SSG (Static Side Generation) 兩種方法,不需要很多的設定就可以讓網站同時有這兩種功能。使用 Next.js是因為我們不需要設置重複的東西,比如從頭開始路由,而Next.js 為我們提供了一個內置的路由器。 想要完成本文的範例,最好具有下列知識基礎: (1)React.js網頁程式開發 (2) MetaMask錢包的使用 (3)區塊鏈相關的知識 接下來我們一步步來完成這個範例吧 建一個Moralis Server 進入 Moralis.io 並創建一個新帳戶,如果您已經有一個,請登錄。 登錄後,您將看到如下儀表板: 點下Create a new Server 以建立新的Server: 在本文中使用Eth Testnet (Rosten) 所以選擇後,點選 Add Instance 在建立的Server項目點選 View Details 可以看到下列資訊 記下Server URL, Application ID的資訊,它們將會在我們的專案中被使用到 建立Next.js APP 使用以下指令創建一個新的 Next.js 應用程序: npx create-next-app my-project --example with-tailwindcss 上面指令將設置 Next.js 並設置 Tailwind CSS 以便我們進行一些最小的樣式設置,但在本文不會介紹太多樣式的問題 創建應用程序後,進入到項目目錄並使用以下命令安裝此項目所需的依賴包: npm install moralis react-moralis @walletconnect/web3-provider 這將安裝moralis 核心庫以及react-moralis,會提供我們方便使用Morails功能。 @walletconnect/web3-provider 是用以連接MetaMask以外的錢包,但本文僅使用到MetaMask,僅是用來消除Moralis包的警告。 設定Moralis環境變數 在專案的目錄下建立.env,並將之前的資訊填入 MORALIS_SERVER_URL=(server url) MORALIS_PUBLIC_APP_ID=(application id) 接著我們打開專案中pages目錄下的_app.tsx 改成下面的內容 import { MoralisProvider } from "react-moralis"; import "../styles/globals.css"; function MyApp({ Component, pageProps }) { return ( <MoralisProvider appId={process.env.MORALIS_APP_ID} serverUrl={process.env.MORALIS_SERVER_URL} > <Component {...pageProps} /> </MoralisProvider> ); } export default MyApp; 透過將MoralisProvider包覆在專案的入口點, 我們可以將包含在其中的子組件都得到Moralis的功能支持。修改完之後 ,可以執行下列指令來執行專案: npm run dev 執行成功之後,可以透過http://localhost:3000來訪問網頁,下一步我們將建立一個連接的按鍵,可以透過Moralis本身提供的函式來連接MetaMask錢包。 連接MetaMask錢包 我們將Pages目錄的index.tsx修改內容如下: import type { NextPage } from 'next' import { useEffect, useState } from "react"; import { useRouter } from "next/router"; import {useMoralis} from 'react-moralis' import Head from 'next/head' import Image from 'next/image' const Home: NextPage = () => { const { isAuthenticated, authenticate } = useMoralis(); const router = useRouter(); useEffect(() => { if (isAuthenticated) router.replace("/dashboard"); }, [isAuthenticated]); return ( <div className="h-screen w-screen flex items-center justify-center"> <Head> <title>Moralis IO tutorial</title> <meta name="description" content="A basic tutorial of Moralis IO" /> <link rel="icon" href="/favicon.ico" /> </Head> <button className="px-7 py-4 text-xl rounded-xl bg-yellow-300 animate-pulse" onClick={() => authenticate({ signingMessage: "Authorize linking of your wallet" }) } > Connect to MetaMask </button> </div> ); } export default Home 其中可以看到 透過這行 import { useRouter } from “next/router”,我們使用Next.js的router功能,當MetamMsk設權成功時,變數isAuthenticated為true,則會導向/dashboard頁面(稍後會建立) 而透過這行 import {useMoralis} from ‘react-moralis’,我們可以使用react-moralis的功能,我們會用到authenticate連接錢包及isAuthenticated來確認驗證狀態,在按下按鍵時透過authenticate()我們可以透過web3去驗證使用者是否有運行中的web3Provider (像是MetaMask). 我們在呼叫時傳入了signingMessage,這樣我們就可以在使用MetamMsk 進行身份驗證時顯示一條消息。 現在,如果您點擊使用 MetaMask 登錄,應該會看到 MetaMask 彈出並請求授權,如下所示: 點下“簽署”後,您將使用錢包登錄,你將看到 404 錯誤頁面,因為我們尚未創建儀表板(/dashboard)。 (更多的react-moralis用法參考這邊) 列出錢包中的代幣資訊及交易 在Pages資料夾下建立dashboard資料夾,並建立index.jsx,內容如下: import Head from "next/head"; import { useRouter } from "next/router"; import { useEffect,useState} from "react"; import Moralis from "moralis"; import { useMoralis,useWeb3Transfer,useMoralisWeb3Api } from "react-moralis"; function Index() { const { isAuthenticated, logout ,enableWeb3} = useMoralis(); const router = useRouter(); const [balance,setBalance] = useState(0); useEffect(() => { if (!isAuthenticated) router.replace("/"); }, [isAuthenticated]); return ( <div className="h-screen w-screen flex flex-col items-center justify-center"> <Head> <title>Moralis Tutorial - Dashboard</title> </Head> <CompoentBalance/> <CompoentTransfer/> <div class="h-100 w-1/4"> <button onClick={logout} className="px-7 py-4 text-xl rounded-xl bg-blue-300"> Logout </button> </div> </div> ); } export default Index; 其中 <CompoentBalance/>中,按下按鈕會取得連接帳戶的balance並顯示,程式如下: const CompoentBalance =()=>{ const Web3Api = useMoralisWeb3Api() const getBalance = async () => { try { let result = await Web3Api.account.getNativeBalance({ chain:"ropsten" }) setBalance(Moralis.Units.FromWei(result.balance)) console.log(result) } catch (err) { console.error(err); } }; return <div class="h-1/5 w-1/4"> <button className="px-7 py-4 mb-5 text-xl rounded-xl bg-blue-300" onClick={() =>getBalance()}> Refetch Balance </button> <pre>{"BALANCE:"+balance+"ETH"}</pre> < /div> }; 這裡我們透過Moralis提供的hook(useMoralisWeb3Api)來使用Web3 API,透過Web3Api.account.getNativeBalance ,參數使用 chain:”ropsten” 可以取得使用者帳戶在ropten testnet的balance,結果如下: 其中 <CompoentTransfer/>中, 按下按鍵後會轉出0.1ETH給帳戶擁有者 const CompoentTransfer =()=>{ const {fetch, error, isFetching} = useWeb3Transfer({ amount: Moralis.Units.ETH(0.1), receiver: "0x0000000000000000000000000000000000000000", type: "native", }); const sendEth = async () => { try { await enableWeb3(); await fetch() alert("Transfer of funds succeeded!"); } catch (err) { alert("Something went wrong"); } }; return <div class="h-100 w-1/4"> <button onClick={sendEth} className="px-7 py-4 mb-5 text-xl rounded-xl bg-blue-300"> Send 0.1 ETH to owner </button> < /div> }; 這裡使用useWeb3Transfer這個webhook,可以交易各種不同的代幣(ETH,BTC…),Moralis.Units.ETH(0.1)代ETH數量為0.1, 將receiver取代為你要收到ETH的另一個錢包,另外別忘了要先呼叫enableWeb3()來啟用Web3的功能,按下按鍵後,MetaMask會收到一個0.1 ETH的request,如下圖: 點下”確認”之後,過一陣子,可以重新取得Balace就可以發現ETH已經被轉出去了 最後按下”Logout”,這邊會將isAuthenticated設為false, 根據useEffect裡的設定,將會回到登入頁面(也就是Pages資料夾下的index.jsx) 97 # ###### About Insight Software ###### 兌心科技的專業橫跨多個領域,雲端架構、遊戲製作、區塊鏈技術、去中心化金融、醫療資訊和物聯網服務等,致力於成為企業Web2.0到Web3.0的領航員,提供**雲服務、線路、區塊鏈技術、金庫**等解決方案。 # ### 聯絡方式 兌心聯絡信箱 : service@insight-software.com ### 社群 [Website](https://www.insight-software.com/) [Medium](https://medium.com/insight-software) [Youtube](https://www.youtube.com/@insight-software) [Telegram](https://t.me/Insight_software) [Twitter](https://twitter.com/insightcapital_) [Instagram](https://www.instagram.com/insight.capital/) ![](https://i.imgur.com/MRSPRzH.png)