📖阅读本文,你将
- 获取一个
demo
仓库和演示地址 - 比较粗浅草率地理解
web3
中主流的私钥、公钥、地址、签名等概念。 - 简单写一个 批量创建账户 的
demo
。
1. 为什么有了私钥,就有了一切
在 web3
领域,如果一个人获得了你的 私钥,那么实际上,它就拥有了你在这个钱包里的一切资产。
因为,在 web3
领域里,其他的一切身份证明都是基于 私钥
产生的。(当然,这里是把"助记词"也当做私钥的一种)
总体来说,通常步骤如下:
- 生成一个私钥
- 私钥 生成 公钥
- 公钥 生成 地址
但具体到某个链上,私钥到钱包地址的过程,是存在差异的。
以【以太坊】为例,通常步骤如下:
但是 BTC
和 SOLANA
在具体的生成细节上和以太坊有差异。
就不具体展开了。
但无论那种链,从私钥可以生成公钥、地址这一过程,都是一样的。
2、私钥与签名
私钥除了生成钱包地址,另一个重要作用是签名。
签名是用来证明你是你,而不是别人。
传统的签名过程,往往是签名者持有私钥、验证者持有公钥,然后签名者用自己的私钥对信息进行签名,验证者用公钥解密签名,如果解密内容与原信息一致,则验证通过。
如图:【常规的签名过程】
但 web3
领域里,签名过程与传统的签名过程不同。
以 以太坊
为例,它的签名过程分为如下几部:
- 私钥生成公钥,公钥生成钱包地址。(本文第一节已详细论述)
- 验证者把签名信息发送给签名者,签名者用自己的私钥对(签名信息 + 随机数
nonce
)进行签名,并把签名结果和随机数nonce
发送给验证者。 - 验证者得到签名后,使用
初始内容
+签名结果
+nonce
反推出若干个可能的公钥。 - 验证以上公钥生成的地址,是否与签名者的地址一致。
如图:
3、批量创建账户
3.1 创建私钥的 API
上面说过,私钥是一个随机字符串,但不同链的私钥长度并不一定一致,此处我们先以 以太坊
为例,介绍如何快捷创建一个私钥。
众所周知,wagmi
是对 viem
的 hooks
封装。其天然 peerDependency
依赖 viem
。
因此,在 wagmi
项目里,我们可以直接引入 viem
。(因为你必然依赖了它)
因此,你可以使用如下 API
创建私钥:
js
import { generatePrivateKey } from 'viem/accounts'
const pk = generatePrivateKey()
3.2 从私钥到地址(账户信息)的 API
js
import {
privateKeyToAccount } from 'viem/accounts'
const account = privateKeyToAccount(pk)
这部分到了写代码的部分,反而是最简单的,因为 viem
已经封装好了。
但真正需要我们关注的,是 私钥
、公钥
、地址
、签名
之间的关系。
在 demo
中,我实现了以下效果:
4、demo地址和源码
demo: wagmi-demos.vercel.app/03-batch-cr...
关于我
我是春哥,一个前端工程师。
目前正在学习 web3
领域。
如果你有任何问题,欢迎留言。