
教程:创建由以太坊支持的 Web3 聊天
在本文中,我们将学习如何将以太坊智能合约连接到React应用程序,并使用户能够与之交互。
先决条件
-
要在浏览器中安装MetaMask扩展
-
一个代码编辑器
-
关于以下主题的一些知识:以太坊,MetaMask, React, TypeScript
在以太坊主网上工作要花真金白银!
在本教程中,我假设的是你的MetaMask设置为使用Rinkeby。Rinkeby是一个复制主网的测试网络,允许我们免费部署和使用智能合约。
项目
我们将为这个基于区块链的聊天建立一个界面,如下所示:
-
左边的侧边栏包含一个按钮,用于连接到聊天或指示连接用户的地址。
-
右侧的聊天框,显示消息和输入栏。
在本篇文章中,我们不会关注如何让UI更漂亮,我们的目标是关注如何用最直接的方式与智能合约交互。
我已尽力使本教程易于理解,但如果有些东西还是不甚清晰,也不用灰心,你会在本文的最后找到一个包含已完成项目的 GitHub 存储库的链接。
智能合约
首先,我们要连接到前端的智能合约,如下所示:
event 、emit 这些东西是什么?
event 用于通知外部用户区块链上发生的事情。
在我们的例子中,“外部用户”是我们的前端应用程序,它将监听发送到智能合约的新消息,因此我们可以立即在我们的UI中显示它们。
前端
我准备了一个样板,这样你就可以马上开始编码了。
以下是启动项目的Github链接:
https://github.com/thmsgbrt/web3-chat-powered-by-ethereum-starter
一旦你克隆了项目,使用npm install安装依赖项,并用npm start启动了它,那么花几分钟检查几个文件以了解应用是如何构造的,也是有必要的。这是非常基本的React,就不在此赘述了。
以下是我们的行动计划:
A-允许用户通过MetaMask连接到聊天
B-在我们的前端实例化智能合约
C-从我们的智能合约中获取消息并显示它们
D-允许用户在聊天中发布消息
E-收听新信息
A – 允许用户通过MetaMask连接到聊天
要做到这一点,我们首先需要确保MetaMask扩展安装在了浏览器上。
让我们创建一个Hook来实现这一点:
解释:
MetaMask在window.ethereum注入了一个全局API。该API允许网站请求用户的以太坊账户,从用户连接的区块链读取数据,并建议用户签署消息和交易。
现在我们已经准备好了Hook,转向Sidebar.tsx,这样我们就可以利用它:
以现在,我们有一种方法来检测是否安装了MetaMask,如果没有安装MetaMask,我们可以警告用户,他们需要在浏览器上安装MetaMask。
接下来,让我们为“Connect With MetaMask”按钮添加一个onClick处理程序:
现在,当用户单击 Connect With MetaMask 时,MetaMask 扩展程序将提示一个模式并询问要使用哪个帐户:
MetaMask 要求我们连接到我们的聊天
现在已连接!
侧边栏现在显示你的以太坊地址!
B – 在我们的前端实例化智能合约
为了能够获取信息并使用户能够发送消息,我们需要有一种方法与我们的智能合约进行通信。
我们要使用ethers库。
ethers是一个库,可以帮助我们的前端与智能合约进行对话。ethers通过提供商(在我们的例子中是MetaMask)连接到以太坊节点,它可以帮我们做很多事情。
让我们创建另一个Hook,它将允许我们在ethers的帮助下与我们的智能合约交互:
让我们来分解一下:
-
我们先检查一下window.ethereum 是否存在并从中获取了 Web3 Provider。
-
如果已经定义了accountis,这意味着用户点击了“Connect With MetaMask”按钮,webThreeProvider.getSigner()会返回给我们他们的地址。
-
最后,返回一个带有新的ether . contract()的合约实例。
实例化我们的智能合约
前往App.tsx,在那里我们可以使用我们创建的hook:
你是否注意到了,我们这里有一个错误,需要去做两件事情来解决问题:
-
contractAddress不是合约地址。
-
./contract/BlockchainChat-artifact.json是空的。
合约地址
这个地址告诉我们在哪里找到区块链上的区块链聊天智能合约。
你可以使用我为大家部署到 Rinkeby 的以下地址之一:
-
0x56cD072f27f06a58175aEe579be55601E82D8fcD
-
0xD99f113cAd1fe2eeebe0E7383415B586704DB5a3
-
0x23CAEEA0Bb03E6298C2eAaa76fBffa403c20984f
选择其中任何一个,它们都是指向已部署的区块链Chat智能合约的地址。
合约的ABI
我们的Hook期望一个来自BlockchainChatArtifact的ABI。这是两个新概念…
当你编译一个智能合约时,你会得到所谓的工件。
在Remix中(一个用于创建、编译、测试和部署智能合约的IDE),一旦你的智能合约已经编译完成,你将在contracts/artifacts下找到工件。
这个工件包含库的链接、字节码、部署的字节码、gas估计、方法标识符和ABI。它用于将库地址链接到文件。
现在,什么是“ABI”:
ABI代表应用程序二进制接口。ethers需要我们的BlockchainChat智能合约的ABI,以便知道我们的智能合约可以做什么(方法、事件、错误等),并为我们的前端提供与它交互的一种方式。
如果你没有自己部署智能合约,仍然可以通过复制./contract/ blockchainchat – artifacts .json中的以下工件来继续本文。
指向工件的Gist链接:
https://gist.github.com/thmsgbrt/1db36bc688d6984070badb14652ed65c
应用程序现在应该没有错误了!
C – 从我们的智能合约中获取消息并显示它们
现在我们已经在前端实例化了智能合约,我们终于可以获取消息了。打开Chat.tsx
并添加以下getMessages
函数:
Chat.tsx
通过它的 props接收chatContract
实例,我们可以用它来调用chatContract.getMessages()
。通过接收到的消息,我们填充messages
状态变量。
如果你的聊天智能合约发布了消息,它们应该在聊天框中可见。否则,让我们继续允许用户发送消息。以下是目前为止你应该看到的:
D -允许用户在聊天中发布消息
在Chat.tsx
中,添加以下sendMessage
函数来发布消息:
让我们继续,在textarea中输入一条消息并发送它!这应该会提示MetaMask,要求验证交易,继续:
我们UI中的“send message”按钮有不同的状态。它的内容根据交易状态而变化:
-
“WAIT”表示交易需要用户批准。
-
“SENDING”表示交易正在被验证。
要查看刚刚发布的消息,请重新加载页面。它就应该会被添加。
但是在用户体验方面,必须重新加载页面以查看是否有新消息发布并不是非常友好的。
E – 收听新信息
回到我们的智能合约。正如你所看到的,当用户发布一条消息时,会触发一个事件:
我们可以通过添加以下setupMessageListener函数来监听这个事件:
接着,发送一条新消息,这一次,就应该不必重新加载页面来查看刚刚发布的消息。如果另一个用户发送消息,这显然也是有效的。
最终项目
恭喜完成了本教程的学习。正如上面所承诺的,这里有一个最终项目的链接:
https://github.com/thmsgbrt/web3-chat-powered-by-ethereum-finished-project
Source:https://betterprogramming.pub/create-a-web3-chat-powered-by-ethereum-6886824fad7
比推快讯
更多 >>- Bitget 链上交易(Onchain)本周涨幅榜 Top 3:GOR、CSTAR、USDUC
- 不丹的比特币持有量现已达 13 亿美元,占其 GDP 的近 40%
- 美国 5 月核心 PCE 物价指数今晚公布,机构普遍预期值为+2.6%
- 上市公司 Belgravia Hartford 获 100 万美元募资以通过 OTC 购买比特币
- 港股证券板块午后走弱,国泰君安国际、胜利证券跌超 10%
- 分析:美股期货创历史新高,或推动 BTC 突破阻力位创下新高
- 去中心化证明者网络 Succinct 宣布进入 Prover Network 测试网最终阶段
- 以太坊基金会转移 1000 枚 ETH
- 分析:比特币双顶形态值得警惕,但全面崩盘可能性不大
- Ark Invest 昨日减持价值 1250 万美元 Coinbase 股票
- 昨日美国比特币现货 ETF 净流入 2.267 亿美元
- BitMEX 已上线 SAHARA/USDT 永续合约,最高支持 50 倍杠杆
- 彭博社:广发证券(香港)推出以离岸人民币为支撑且计息的代币化证券
- Binance Alpha SAHARA 第二阶段空投已开放领取
- 道富环球:稳定币将给美国国债带来巨大增量需求
- 某聪明钱今晨清仓比特币 40 倍多单,加仓 SOL 20 倍多单
- Vitalik 发布街道涂鸦图并配文:去他的比特币,这是我们的战争
- 俄罗斯央行:数字卢布将于 2026 年 9 月推出
- Avalon Labs 披露其参与美国加密政策倡导进展
- NexVault 推出 Solana Gas Tank 离线代付功能,Beta 版本面向多个群体开放
- 数据:某巨鲸清仓 WBTC 套现约 351 万美元,获利 6.8 万美元
- 某鲸鱼以均价 36.08 美元买入 165,366 枚 HYPE
- Bithumb 新增 Maple Finance(SYRUP)韩元交易对
- BR 24H 交易量超 39 亿美元,占币安 Alpha 交易量的 54.9%
- Resolv 团队:过去 24 小时已以 0.15 美元价格回购 160 万枚 RESOLV
- 波场 TRON Eco 生态项目亮相 2025 伊斯坦布尔区块链周
- RootData:AI 将于一周后解锁价值约 189 万美元的代币
- 1confirmation 创始人:Coinbase 市值低于 1000 亿美元的日子已屈指可数
- 韩国民主党议员提出将数字资产纳入 ETF 基础资产法案
- Believe 推出 100 万美元规模基金,以激励社区建设者
- 某地址 4 小时前从 Binance 提取价值 154 万美元 AAVE 和 105 万美元 FET
- 比特币矿企 Bit Digital 筹集 1.5 亿美元拟购买 ETH 并退出挖矿行业
- 波场 TRON 主网 4.8.0 版本升级提案正式通过,将兼容以太坊 Cancun 升级
- 美股昨日加密储备概念股普跌,仅 COIN 和 CRCL 维持强势
- 中金:微信支付和支付宝的平台数字货币类似人民币稳定币
- Project Hunt:模块化数据访问层 Lava Network 为过去 7 天被 Top 人物取关最多的项目
- A 股证券板块持续走强,天风证券涨停
- 模块化借贷协议 TownSquare 宣布完成建设者轮融资,Typhon Ventures、Bixin Ventures 等参投
- SiloFinance 攻击者向 TornadoCash 转移 225.1 枚 ETH
- 比特币“中本聪时代”矿工在 2025 年仅售出 150 枚比特币
- A 股数字货币概念股持续走高,恒宝股份涨停
- 某鲸鱼从币安提出 5180 枚 ETH 存入 Aave V3,价值 1257 万美元
- 加密交易所 XeggeX 正在关闭并申请破产,或受此前黑客攻击等问题影响
- Glue 创始人指控 Across 团队操纵 DAO 投票,从财库中窃取 2300 万美元
- Bitcoin Treasury Corporation 于多伦多上市并完成首笔 292.8 枚 BTC 的购买,累计募资 1.25 亿美元
- 迪拜 RWA 初创企业 Byzanlink 完成 100 万美元私募融资
- 德银:美国“美丽大法案”将大力推动美元稳定币并向美联储施压降息
- 灰度更新 Q3 Top 20 资产名单:新增 AVAX 和 MORPHO 并移除 LDO 和 OP
- 自动化比特币财务解决方案 Castle 完成 100 万美元 Pre-Seed 轮融资,Boost VC 领投
- Binance 新一期 Alpha(SAHARA)空投数据:61%账户已卖出,单号收益降至 87 美元
比推专栏
更多 >>观点
比推热门文章
- 上市公司 Belgravia Hartford 获 100 万美元募资以通过 OTC 购买比特币
- 港股证券板块午后走弱,国泰君安国际、胜利证券跌超 10%
- 分析:美股期货创历史新高,或推动 BTC 突破阻力位创下新高
- 去中心化证明者网络 Succinct 宣布进入 Prover Network 测试网最终阶段
- 以太坊基金会转移 1000 枚 ETH
- 分析:比特币双顶形态值得警惕,但全面崩盘可能性不大
- Ark Invest 昨日减持价值 1250 万美元 Coinbase 股票
- 昨日美国比特币现货 ETF 净流入 2.267 亿美元
- BitMEX 已上线 SAHARA/USDT 永续合约,最高支持 50 倍杠杆
- 彭博社:广发证券(香港)推出以离岸人民币为支撑且计息的代币化证券