mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
1067 字
3 分钟
一个对于EOA的EVM钱包登陆界面
2026-06-08
2026-06-09

下文只代表笔者当前的认识#

最近做了一个主要是前端的EOA wallet登陆的界面,也算是接触blockChain开发的开始吧,正好也可以说是接触了EVM的实际是怎么操作的。 ::github{repo=”dreaifeHebi/web3WalletLogin”}

一次wallet login#

虽然说是一次,但是实际上需要钱包确认的交互是两次——一次来自页面发起的获取钱包地址的确认,一次来自服务器端通过带上认证message/调用域名/nonce啥的符合协议结构(目前用的结构是模仿EIP-4361,不过实际个人感觉这里更偏向与UI/可追溯的设计,实际nonce应该就可以保证请求的混淆了)等message发给钱包要求验证。 为什么要先获得钱包地址才能发起验证?大概是因为本身浏览器和钱包两者都是不信任的,所以如果认为中间交互直接给出的数据都是不可信的,那么只有经由钱包确认的地址才是信任的,然后才能进行到下一步的钱包验证。

我控制了这个钱包!#

你的钱包地址是什么?#

这里其实是一个浏览器和钱包间的交互,用来确认需要选择哪个钱包地址来授权提供给网站。 这里项目实际用的是wagmi的connect来请求钱包交互的。

// wagmi config
export const wagmiConfig = createConfig({
...,
connectors: [injected({ shimDisconnect: true })],
...
});
// get wagmi injected connector
const injectedConnector = useMemo(
() => connectors.find((connector) => connector.id === "injected") ?? connectors[0],
[connectors]
);
// connect wallet
connect({ connector: injectedConnector });
// auto get wallet connect info
const { address, chainId, isConnected } = useAccount();

这里也是通过wagmi的useAccount来自动获取到钱包确认后更新的信息的。

那么你说的这个钱包是你的吗?#

我需要你认证这个信息#

那么既然知道需要认证的地址,那么就可以准备一个标准协议SIWE(Sign-In with Ethereum)登陆签名message。一个大概这样格式的message:

localhost:3000 wants you to sign in with your Ethereum account:
0xYourWalletAddress
Sign in to web3walletLogin with this wallet.
URI: http://localhost:3000
Version: 1
Chain ID: 1
Nonce: <server-issued nonce>
Issued At: <generated timestamp>

然后是对这个message进行一个EIP-191的标准化,来进行和其他签名和其他普通交易的区分: "\x19Ethereum Signed Message:\n" + len(message) + message 这里实现上是来自wagmi的signMessageAsync来进行的对钱包的实际认证请求。

const { signMessageAsync, isPending: isSigning } = useSignMessage();
// make a siwe message
const siweMessage = new SiweMessage({
domain: window.location.host,
address,
statement: "Sign in to web3walletLogin with this wallet.",
uri: siteOrigin,
version: "1",
chainId,
nonce
});
const preparedMessage = siweMessage.prepareMessage();
// send sign request to wallet
const signature = await signMessageAsync({ message: preparedMessage });

这个是只有我私钥才能制作的认证#

当这个message来到钱包请求认证的时候,钱包要确保自己的签名可以验证自己对之前提供的地址的控制权,这时就需要钱包通过自己的私钥来对刚刚发来的信息hash进行加密,同时又能保证这个签名是可以被只知道钱包地址和请求message的网站验证的。这里需要的自然就是一系列的数学变换来保证的这个验证方法的合理性了,当然这里只是先使用的wagmi的算法来对返回的sign进行验证(

// use the message (the client send) and sign(the wallet back)
const verifyResponse = await fetch("/api/auth/verify", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({ message: preparedMessage, signature })
});
// sign message verify
const siwe = new SiweMessage(body.message);
const result = await siwe.verify({
signature: body.signature,
domain: expectedDomain,
nonce: siwe.nonce
});
// the fail result
if (!result.success) {
return NextResponse.json({ error: "invalid signature" }, { status: 401 });
}

至于实际的验算? 那就要看到EOA钱包签名用的secp256k1曲线了,对于一个EOA钱包而言,大概是这样的:

  • EOA 私钥:一个 256-bit 左右的随机数 d
  • 公钥:椭圆曲线点 Q = d * G
  • 地址:keccak256(publicKey) 的后 20 字节
  • 签名:ECDSA over secp256k1

不过我其实也没太懂这一块的实际计算(,不过大概知道这里的无法通过签名和message hash得到的公钥Q来逆向到私钥d,是因为相当于要解一个工作量约2128`2^{128}`级别(secp256k1为256bit级别的曲线)的Q=dG`Q = d * G`椭圆曲线离散对数问题就行了。 这样上面最终通过返回的sign(r+s+v`r + s + v`)和自己发送的message hash来recover出来一个公钥计算出的地址,当这个地址可以和之前的提供地址一致的时候,也就证明了这个钱包有对这个地址的控制权。

结语#

作为一次blockChain实际开发的开始,差不多就这样吧。有一说一,在看实际私钥签名和签名恢复实现的时候有点当初学acm的感觉了( 不过感觉作为一个门户项目倒是正好,把自己学习blockChain的兴趣提起来了。

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

一个对于EOA的EVM钱包登陆界面
https://dreaife.tokyo/evm-wallet-login/
作者
dreaife
发布于
2026-06-08
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

相关文章 智能推荐
1
关于一次EOA钱包的签名验证及其相关内容
WEB3 本篇文章深入解析了以太坊 EOA 钱包一次签名验证的完整流程与背后数学原理。首先回顾了 secp256k1 曲线的有限域 Fₚ、椭圆曲线点群 E(Fₚ) 以及基点 G 与其阶 n 的基本概念,详细说明了点加法、点倍加和标量乘法的模 p 与模 n 计算方式。随后,文章通过实际的 SIWE(Sign‑In with Ethereum)场景,逐步展示了钱包在收到签名请求后如何生成 r/s/v 三元组,包括哈希计算、随机数 k 的生成、R 点的求取以及 r、s、v 的具体公式。接着,服务端如何利用已知的 r、s、v、消息哈希 e 和基点 G 逆向求解公钥 Q 的公式 Q = r⁻¹(sR − eG) 进行验证,并通过 keccak‑256 取后 20 字节得到钱包地址,实现无私钥泄露的所有权确认。文章还指出了 p 与 n 的区别、椭圆曲线离散对数问题的计算难度(约 2¹²⁸)以及当前量子计算对该安全性的潜在影响。整体内容为开发者提供了从理论到实现的完整参考,适合作为博客 SEO 摘要,提升相关关键词(如 “EOA 钱包签名验证”“secp256k1”“ECDSA”“SIWE”)的搜索可见性。
2
关于EOA钱包在链上的基础操作
WEB3 快速掌握Web3钱包在链上的核心操作。内容涵盖EOA与HD钱包的创建原理、助记词生成与BIP派生流程,深入剖析SIWE和EIP-712链上验证,以及交易构造、签名、广播的完整周期,助你理清钱包底层逻辑。
3
区块链认识
WEB3 区块链是一种由时间顺序链接的区块组成的结构,具有去中心化、不可篡改性、透明性和安全性等核心特性。其工作原理包括交易生成、验证、打包和添加到链上。应用场景涵盖加密货币、供应链管理、金融服务等。面临的挑战包括扩展性、能耗问题和用户教育。区块链的底层逻辑基于分布式账本和共识机制,确保数据的安全与一致性。
4
交易记录
market 最近的交易经历显示出较高的胜率,尤其是在2月3日的做空中实现了显著盈利。尽管有错误判断导致部分收益损失,但整体收益仍为正。当前市场震荡,短期内可能面临二次测试,需谨慎应对。交易策略主要基于K线和交易量,仓位分配为80%低杠杆大趋势交易,10%高杠杆高频交易,剩余资金用于链上操作。为避免情绪化交易,建议在不明判断时选择空仓,稳定现金流后再进行高风险操作。
5
本人在x的一些关于市场认识的总结
market 从复杂系统与博弈论出发,梳理市场运行、情绪反身性与货币价值共识的内在逻辑,帮助读者穿透短期波动,建立对市场预期与通胀传导的深层认知。

目录