Web3Auth là một cơ sở hạ tầng ví được cắm vào dApp hoặc ví. Nó hoạt động như một cơ sở hạ tầng xác thực có thể cắm được vào ví và ứng dụng web3. Với trải nghiệm người dùng tuyệt vời của Web3Auth, cả tiền chính thống và tiền mã hóa có thể được đưa vào hoạt động trong vài phút.
Là một cơ sở hạ tầng ví, nó cung cấp hỗ trợ vượt trội cho tất cả các thông tin đăng nhập xã hội, nền tảng web và di động, ví và các phương pháp quản lý quan trọng khác. Đến cuối hướng dẫn này, bạn sẽ tích hợp được Web3Auth vào ứng dụng web phi tập trung của bạn được xây dựng trên Mạng lưới Klaytn. Để tích hợp Web3Auth vào các nền tảng khác (Android, iOS, React Native, Flutter, & Unity), vui lòng tham khảo chỉ dẫn này guide.
Điều kiện tiên quyết
Một dự án react đang hoạt động (bằng cách thực hiện npx create-react-app project-name)
Để sử dụng Web3Auth trong dApp, trước tiên bạn phải cài đặt các thư viện và SDK được yêu cầu. Do đó, bạn sẽ cần thiết lập Ethers.js và SDK web của Web3Auth. Bạn có thể sử dụng Web3Auth cùng với ethers.js hoặc thư viện web3.js để liên lạc với chuỗi khối Klaytn. Chúng tôi sẽ sử dụng Ethers.js trong suốt hướng dẫn này.
Sau khi cài đặt thành công các thư viện cần thiết, tiếp theo là khởi tạo phiên bản Web3Auth, đặt phiên bản nhà cung cấp Web3Auth trong Hook useState() và cả hàm init() trong useEffect().
import { Web3Auth } from"@web3auth/modal";import { ContractFactory, ethers } from"ethers";import { useState, useEffect } from"react";functionApp() {const [web3auth,setWeb3auth] =useState(null);const [provider,setProvider] =useState(null);useEffect(() => {constinit=async () => {try {constweb3auth=newWeb3Auth({ clientId:"YOUR_WEB3AUTH_CLIENT_ID",// get it from Web3Auth Dashboard web3AuthNetwork:"cyan", chainConfig: { chainNamespace:"eip155",// modify if mainnet => “0x2019” chainId:"0x3e9",// hex of 1001, Klaytn Baobab testnet. rpcTarget:"https://public-en-baobab.klaytn.net",// modify if mainnet displayName:"Klaytn Testnet",// modify if mainnet blockExplorer:"https://baobab.scope.klaytn.com/",// modify if mainnet ticker:"KLAY", tickerName:"KLAY", }, })setWeb3auth(web3auth);awaitweb3auth.initModal();setProvider(web3auth.provider); } catch (error) {console.error(error); } };init();}, []);
Kết nối ví
Bên trong chức năng ứng dụng của bạn trong tệp app.js của bạn, hãy gọi Phương thức Kết nối () trên phiên bản Web3Auth để bắt đầu kết nối ví của bạn.
Trong hướng dẫn này, chúng tôi sẽ sử dụng chức năng sử dụng: truncateAddress(). Hàm truncateaddress () có một địa chỉ hợp lệ và trả về một định dạng dễ đọc hơn của địa chỉ được truyền vào. Các bước sau đây cho thấy cách thiết lập và sử dụng chức năng sử dụng trong dự án của bạn.
Bước 1: Tạo một tiệp utils.js trong thư mục gốc src.
Đã kết nối ví của bạn thành công bằng cách gọi phương pháp Connect() trên phiên bản Web3Auth, bạn có thể nhận tài khoản người dùng và số dư của nó bằng cách sử dụng đối tượng nhà cung cấp và người ký.
const [web3auth,setWeb3auth] =useState(null);const [provider,setProvider] =useState(null);const [address,setAddress] =useState("");const [balance,setBalance] =useState("");constconnectWallet=async() => {if (!web3auth) {console.log("web3auth not initialized yet");return; }constweb3authProvider=awaitweb3auth.connect();setProvider(web3authProvider);// this guide uses ethers version 6.3.0.constethersProvider=newethers.BrowserProvider(web3authProvider);// for ethers version below 6.3.0.// const provider = new ethers.providers.Web3Provider(web3authProvider);constethersProvider=newethers.BrowserProvider(web3authProvider);constsigner=awaitethersProvider.getSigner();// Get user's Ethereum public addressconstaddress=signer.address;// Get user's balance in etherconstbalance=ethers.formatEther(awaitethersProvider.getBalance(address) // balance is in wei );setAddress(address);setBalance(balance);return ( <divclassName="App"> <buttononClick={connectWallet}>Connect Wallet</button> <div>Wallet Address: ${truncateAddress(address)} Balance: ${balance}</div> </div> );}
Ngắt kết nối ví
Ngắt kết nối với ví đạt được bằng cách sử dụng phương pháp logout() trên phiên bản Web3Auth. Ngoài ra, một thực tế tốt là làm mới trạng thái để xóa bất kỳ dữ liệu kết nối được lưu trữ trước đó.
functionApp() {constdisconnect=async () => {if (!web3auth) {console.log("web3auth not initialized yet");return; }awaitweb3auth.logout();refreshState();}// refresh stateconstrefreshState= () => {setAddress();setBalance();// make sure to add every other useState modifier function declared here.}return ( <divclassName="App"> <buttononClick={disconnect}>Disconnect</button> </div> );}
Chuỗi chuyển đổi
Để chuyển chuỗi bằng cách sử dụng Web3Auth, trước tiên bạn phải thêm cấu hình chuỗi mong muốn vào bộ điều hợp được kết nối bằng cách gọi phương pháp addChain(), sau đó tiến hành gọi phương pháp switchChain().
Một tính năng độc đáo của Web3Auth là đăng nhập xã hội. Khi đăng nhập người dùng bằng các nền tảng xã hội của họ, phiên bản Web3Auth trả về một số thông tin về người dùng đã đăng nhập. Nhận được thông tin người dùng đã đăng nhập đơn giản như gọi phương pháp getUserInfo() trên phiên bản Web3Auth.
// add to the existing useState hook.const [userData,setUserData] =useState({});constgetUserInfo=async () => {if (!web3auth) {console.log("web3auth not initialized yet");return; }constuser=awaitweb3auth.getUserInfo();setUserData(user);};return ( <divclassName="App"> <buttononClick={getUserInfo}>Get User Info</button> <div> { userData ?`User Email: ${userData.email}, User Name: ${userData.name}`:""} </div> </div> );
Đăng nhập tin nhắn
Sau khi khởi tạo đối tượng nhà cung cấp và người ký, người dùng có thể ký một chuỗi tùy ý.
// add to the existing useState hook.const [signedMessage,setSignedMessage] =useState("");constsignMessage=async(e) => {e.preventDefault();if (!provider) {console.log("provider not initialized yet");return; }// this guide uses ethers version 6.3.0.constethersProvider=newethers.BrowserProvider(provider);// for ethers version below 6.3.0.// const provider = new ethers.providers.Web3Provider(provider);constsigner=awaitethersProvider.getSigner();constoriginalMessage=e.target.message.value;constresult=awaitsigner.signMessage(originalMessage);setSignedMessage(result) }return ( <divclassName="App"> <formonSubmit={signMessage}> <inputtype="text"name="message"placeholder="Set message"required/> <inputtype="submit"value="Sign Message"/> </form> <div>SignedMessage: ${signedMessage}</div> </div> );
Gửi giao dịch bản địa
Bạn có thể thực hiện các giao dịch gốc, như gửi Klay từ người dùng này sang người dùng khác.
// add to the existing useState hook.const [txHash,setTxHash] =useState();constsendKlay=async () => {if (!provider) {console.log("provider not initialized yet");return; }constdestination="paste recipient address";// this guide uses ethers version 6.3.0.constethersProvider=newethers.BrowserProvider(provider);// for ethers version below 6.3.0.// const provider = new ethers.providers.Web3Provider(provider);constsigner=awaitethersProvider.getSigner();// Submit transaction to the blockchain and wait for it to be minedconsttx=awaitsigner.sendTransaction({ to: destination, value:ethers.parseEther("0.1"), maxPriorityFeePerGas:"5000000000",// Max priority fee per gas maxFeePerGas:"6000000000000",// Max fee per gas })constreceipt=awaittx.wait();setTxHash(receipt.hash)}return ( <divclassName="App"> <buttononClick={sendKlay}>Send Klay</button> <div>Send-Klay Tx Hash : {txHash ? <a href={`https://baobab.scope.klaytn.com/tx/${txHash}`} target="_blank">Klaytnscope</a> : ' ' } </div>
</div>);
Làm việc với một hợp đồng thông minh
Triển khai một hợp đồng
Bạn có thể triển khai một hợp đồng thông minh với giao diện nhị phân ứng dụng (ABI) và mã byte hợp đồng của nó.
// add to the existing useState hook.const [contractAddress,setContractAddress] =useState(null);constdeployContract=async () => {if (!provider) {console.log("provider not initialized yet");return; }// this guide uses ethers version 6.3.0.constethersProvider=newethers.BrowserProvider(provider);// for ethers version below 6.3.0.// const provider = new ethers.providers.Web3Provider(provider);constsigner=awaitethersProvider.getSigner();// paste your contractABIconstcontractABI= [ {"inputs": [ {"internalType":"uint256","name":"_initNum","type":"uint256" } ],"stateMutability":"nonpayable","type":"constructor" }, {"inputs": [],"name":"retrieve","outputs": [ {"internalType":"uint256","name":"","type":"uint256" } ],"stateMutability":"view","type":"function" }, {"inputs": [ {"internalType":"uint256","name":"num","type":"uint256" } ],"name":"store","outputs": [],"stateMutability":"nonpayable","type":"function" } ]// Paste your contract byte code const contractBytecode = '608060405234801561001057600080fd5b506040516102063803806102068339818101604052810190610032919061007a565b80600081905550506100a7565b600080fd5b6000819050919050565b61005781610044565b811461006257600080fd5b50565b6000815190506100748161004e565b92915050565b6000602082840312156100905761008f61003f565b5b600061009e84828501610065565b91505092915050565b610150806100b66000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80632e64cec11461003b5780636057361d14610059575b600080fd5b610043610075565b60405161005091906100a1565b60405180910390f35b610073600480360381019061006e91906100ed565b61007e565b005b60008054905090565b8060008190555050565b6000819050919050565b61009b81610088565b82525050565b60006020820190506100b66000830184610092565b92915050565b600080fd5b6100ca81610088565b81146100d557600080fd5b50565b6000813590506100e7816100c1565b92915050565b600060208284031215610103576101026100bc565b5b6000610111848285016100d8565b9150509291505056fea26469706673582212200370e757ac1c15a024febfa9bf6999504ac6616672ad66bd654e87765f74813e64736f6c63430008120033'
constcontractFactory=newContractFactory(contractABI, contractBytecode, signer);constcontract=awaitcontractFactory.deploy(400);// get contract addresssetContractAddress(contract.target)}return ( <divclassName="App"> <buttononClick={deployContract}>Deploy Contract</button> <div>Contract Address: {contractAddress ? contractAddress :''} </div> </div> );
Với nhà cung cấp Web3Auth và đối tượng người ký, bạn có thể thực hiện các tương tác hợp đồng như viết và đọc từ hợp đồng thông minh được triển khai trên chuỗi khối.
Viết cho một hợp đồng
// add to existing useState hookconst [contractTx,setContractTx] =useState();constwriteToContract=async (e) => {e.preventDefault();if (!provider) {console.log("provider not initialized yet");return; }// this guide uses ethers version 6.3.0.constethersProvider=newethers.BrowserProvider(provider);// for ethers version below 6.3.0.// const provider = new ethers.providers.Web3Provider(provider);constsigner=awaitethersProvider.getSigner();// Paste your contractABIconstcontractABI= [ {"inputs": [ {"internalType":"uint256","name":"_initNum","type":"uint256" } ],"stateMutability":"nonpayable","type":"constructor" }, {"inputs": [],"name":"retrieve","outputs": [ {"internalType":"uint256","name":"","type":"uint256" } ],"stateMutability":"view","type":"function" }, {"inputs": [ {"internalType":"uint256","name":"num","type":"uint256" } ],"name":"store","outputs": [],"stateMutability":"nonpayable","type":"function" } ]// Paste your contract addressconstcontractAddress="0x3b01E4025B428fFad9481a500BAc36396719092C";constcontract=newethers.Contract(contractAddress, contractABI, signer);constvalue=e.target.store_value.value;// Send a transaction to smart contract to update the valueconsttx=awaitcontract.store(value);// Wait for the transaction to finishconstreceipt=awaittx.wait();constresult=receipt.hash;setContractTx(result) }return ( <divclassName="App"> <formonSubmit={writeToContract}> <inputname="store_value"placeholder="Set contract value"required/> <inputtype="submit"value="Store"/> </form> <div>Write-to-contract Tx Hash: ${contractTx}</div> </div>);
Đọc từ một hợp đồng
// add to existing useState hookconst [contractMessage,setContractMessage] =useState();constreadFromContract=async () => {if (!provider) {console.log("provider not initialized yet");return; }// this guide uses ethers version 6.3.0.constethersProvider=newethers.BrowserProvider(provider);// for ethers version below 6.3.0.// const provider = new ethers.providers.Web3Provider(provider);// paste your contract ABIconstcontractABI= [ {"inputs": [ {"internalType":"uint256","name":"_initNum","type":"uint256" } ],"stateMutability":"nonpayable","type":"constructor" }, {"inputs": [],"name":"retrieve","outputs": [ {"internalType":"uint256","name":"","type":"uint256" } ],"stateMutability":"view","type":"function" }, {"inputs": [ {"internalType":"uint256","name":"num","type":"uint256" } ],"name":"store","outputs": [],"stateMutability":"nonpayable","type":"function" } ]// paste your contract addressconstcontractAddress="0x3b01E4025B428fFad9481a500BAc36396719092C"; constcontract=newethers.Contract(contractAddress, contractABI, ethersProvider)// Reading a message from the smart contractconstcontractMessage=awaitcontract.retrieve();setContractMessage(contractMessage.toString()) }return ( <buttononClick={readFromContract}>Read From Contract</button> <div>Read-from-contract Message: ${contractMessage}</div> )
Khắc phục sự cố
Lỗi mô-đun lõi nút polyfill
THAY ĐỔI ĐỘTPHÁ: webpack<5 được sử dụng để bao gồm polyfills cho node.js lõi node.js theo mặc định.
Lỗi này xảy ra khi bạn sử dụng webpack phiên bản 5. Trong phiên bản này, NodeJS polyfills không còn được hỗ trợ theo mặc định. Để giải quyết vấn đề này, hãy tham khảo hướng dẫn.
Bước tiếp theo
Để biết thêm các hướng dẫn chuyên sâu trên Web3Auth, vui lòng tham khảo Web3Auth Docs và Kho lưu trữ Web3Auth Github. Ngoài ra, bạn có thể tìm thấy việc triển khai đầy đủ mã trong hướng dẫn này trên GitHub.