Skip to content

Commit 7e10f76

Browse files
committed
Add study notes for 2025-08-20
1 parent 6e69bac commit 7e10f76

1 file changed

Lines changed: 163 additions & 0 deletions

File tree

xmhhmx.md

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,169 @@ timezone: UTC+8
1515
## Notes
1616

1717
<!-- Content_START -->
18+
# 2025-08-20
19+
20+
## 账户系统
21+
22+
### 简介
23+
24+
**密码**
25+
26+
密码的使用场景:
27+
28+
1. 作为转账的支付密码
29+
1. 用keystore导入钱包的时候需要输入
30+
31+
**私钥**
32+
33+
私钥由64位长度的十六进制的字符组成,比
34+
如:0×A4356E49C88C8B7AB370AF7D5C0C54F0261AAA006F6BDE09CD4745CF54E0115A,一个账户只有一个私钥且不能修改。
35+
36+
通常一个钱包中私钥和公钥是成对出现的,有了私钥,我们就可以通过一定的算法生成公钥,再通过公钥经过一定
37+
的算法生成地址,这一过程都是不可逆的。私钥一定要妥善保管,若被泄漏别人可以通过私钥解锁账号转出你的该
38+
账号的数字货币。
39+
40+
**公钥**
41+
42+
公钥(PublicKey)是和私钥成对出现的,和私钥一起组成一个密钥对,保存在钱包中。公钥由私钥生成,但是无法通过公钥倒推得到私钥。公钥能够通过一系列算法运算得到钱包的地址,因此可以作为拥有这个钱包地址的凭证。
43+
44+
**Keystore**
45+
46+
Keystore常见于以太坊钱包,它是将私钥以加密的方式保存为一份JSON文件,这份JSON文件就是keystore,所
47+
以它就是加密后的私钥。Keystore必须配合钱包密码才能导入并使用该账号。当黑客盗取Keystore后,在没有密码情况下,有可能通过暴力破解Keystore密码解开Keystore,所以建议使用者在设置密码时稍微复杂些,比如带上特殊字符,至少8位以上,并安全存储。
48+
49+
**助记词 Mnemonic**
50+
51+
私钥是64位长度的十六进制的字符,不利于记录且容易记错,所以用算法将一串随机数转化为了一串12~24个容易记住的单词,方便保存记录。注意:
52+
53+
1. 助记词是私钥的另一种表现形式
54+
1. 助记词=私钥,这是不正确的说法,通过助记词可以获取相关联的多个私钥,但是通过其中一个私钥是不能获
55+
取助记词的,因此助记词私钥。
56+
57+
**BIP**
58+
59+
要弄清楚助记词与私钥的关系,得清楚BlP协议,是 Bitcoin Improvement Proposals的缩 写,意思是Bitcoin
60+
的改进建议,用于提出Bitcoin的新功能或改进措施。BIP协议衍生了很多的版本,主要有BIP32、BIP39、BIP44。
61+
62+
**BIP32**
63+
64+
BIP32是HD钱包的核心提案,通过种子来生成主私钥,然后派生海量的子私钥和地址,种子是一串很长的随机数。
65+
66+
**BIP39**
67+
68+
由于种子是一串很长的随机数,不利于记录,所以我们用算法将种子转化为一串12~24个的单词,方便保存记录,
69+
这就是BIP39,它扩展了HD钱包种子的生成算法。
70+
71+
**BIP44**
72+
73+
BIP44是在BIP32和BIP43的基础上增加多币种,提出的层次结构非常全面,它允许处理多个币种,多个帐户,每
74+
个帐户有数百万个地址
75+
76+
在BIP32路径中定义以下5个级别:
77+
78+
```
79+
m/purpse'/coin_type'/account'/change/address_index
80+
```
81+
82+
- purpose:在BIP43之后建议将常数设置为44'。表示根据BIP44规范使用该节点的子树
83+
- Coin_type:币种,代表一个主节点(种子)可用于无限数量的独立加密币,如比特币,Litecoin或Namecoin。此级别为每个加密币创建一个单独的子树,避免重用已经在其它链上存在的地址。开发人员可以为他们的项目注册未使用的号码
84+
- Account:账户,此级别为了设置独立的用户身份可以将所有币种放在一个的帐户中,从0开始按顺序递增
85+
- Change:常量0用于外部链,常量1用于内部链,外部链用于钱包在外部用于接收和付款。内部链用于在钱包
86+
外部不可见的地址,如返回交易变更
87+
- Address_index:地址索引,按顺序递增的方式从索引o开始编号
88+
89+
BIP44的规则使得HD钱包非常强大,用户只需要保存一个种子,就能控制所有币种,所有账户的钱包,因此由BIP39生成的助记词非常重要,所以一定安全妥善保管,那么会不会被破解呢?如果一个HD钱包助记词是12个单词,一共有2048个单词可能性,那么随机的生成的助记词所有可能性大概是5e+39,因此几乎不可能被破解
90+
91+
**HD钱包**
92+
93+
通过BIP协议生成账号的钱包叫做HD钱包。这个HD钱包,并不是HardwareWallet硬件钱包,这里的HD是HierarchicalDeterministic的缩写,意思是分层确定性,所以HD钱包的全称为比特币分成确定性钱包。
94+
95+
96+
97+
## 密码、私钥、keystore与助记词的关系
98+
99+
<img src="https://cdn.jsdelivr.net/gh/xmhhmx/PicGoCDN//img/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202025-08-19%20224746.png" style="zoom:67%;" />
100+
101+
**钱包的核心:私钥**
102+
103+
基于以上的分析,我们对以太坊钱包的账号系统有了一个很好的认识,那么我们在使用钱包的过程中,该如何保管
104+
自己的钱包呢?主要包含以下几种方式:
105+
106+
- 私钥(Private Key)
107+
- keystore+密码(Keystore+Password)
108+
- 助记词(Mnemonic code)
109+
110+
通过以上三种中的一种方式都可以解锁账号,然后掌控它,所以对于每种方式中的数据都必须妥善包括,如有泄漏,请尽快转移数字资产。
111+
112+
我们可以得到以下总结:
113+
114+
- 通过私钥+密码可以生成keystore,即加密私钥;
115+
- 通过keystore+密码可以获取私钥,即解密keystore。
116+
- 通过助记词根据不同的路径获取不同的私钥,即使用HD钱包将助记词转化成种子来生成主私钥,然后派生海
117+
量的子私钥和地址。
118+
119+
可以看出这几种方式的核心其实都是为了获得私钥,然后去解锁账号,因此钱包的核心功能是私钥的创建、存储和
120+
使用。
121+
122+
123+
124+
## 创建账户
125+
126+
### web3直接创建账户
127+
128+
```
129+
web3.eth.accounts.create('2435@#@#@±++t!!678543213456764321534567543213456785432134567);
130+
```
131+
132+
### 助记词创建账户
133+
134+
需要使用 `BIP39` 协议将助记词转换成种子,再通过 `ethereumjs-wallet` 库生成hd钱包,根据路径的不同从hd钱包中获取不同的keypair,keypair中就包含有公钥、私钥,再通过 `ethereumjs-util` 库将公钥生成地址,从而根据助记词获取所有关联的账号,能获取到公钥、私钥、地址等数据信息。
135+
136+
> **HD钱包** 的全称是 **分层确定性钱包**。它是一种利用特定算法,从一个**单一的种子**(Seed)生成几乎无限个密钥对(私钥和公钥)的系统。
137+
>
138+
> 你可以把它想象成一棵“密钥树”:
139+
>
140+
> - **根种子**:就像大树的根。这是最核心的机密,通常由12或24个英文单词(助记词)表示。**谁拥有这个种子,谁就完全控制整棵树上的所有资产。**
141+
> - **主私钥**:由根种子生成的第一个、也是最重要的私钥,相当于树干。
142+
> - **子密钥**:从主私钥派生出的无数个私钥和地址,相当于树枝和树叶。这些地址就是你用来接收不同加密货币(如ETH、BTC)的地址。
143+
144+
1. 依赖库
145+
146+
需要用到三个库:bip39、ethereumjs-wallet/hdkey、ethereumjs-util。先安装依赖库,cd到项目跟路径运行命令`npm i bip39 ethereumjs-wallet ethereumjs-util`
147+
148+
- bip39:随机产生新的 mnemonic code,并可以将其转成 binary 的seed。
149+
- ethereumjs-wallet:生成和管理公私钥,下面使用其中hdkey子套件来创建HD钱包。
150+
- ethereumjs-util:Ethereum的一个工具库。
151+
- https://iancoleman.io/bip39/
152+
153+
2. 通过助记词创建账号
154+
155+
- 创建助记词
156+
157+
```js
158+
//引入bip39模块
159+
import * as bip39 from "bip39";
160+
//创建助记词
161+
let mnenonic = bip39.generateMnemonic();
162+
console.log(mnemonic);
163+
//结果 12位助记词
164+
// vote select solar shy embrace immense lizard stamp scrub vague negative forward
165+
```
166+
167+
- 根据助记词生成密钥对keypair
168+
169+
```js
170+
//导入分层钱包模块
171+
import { hdkey } from "ethereumjs-wallet";
172+
//1.将助记词转成seed
173+
let seed = await bip39.mnemonicToSeed("12位助记词");
174+
//3.通过hdkey将seed生成HDWallet
175+
let hdwallet = hdkey.fromMasterSeed(seed);
176+
//4.生成钱包中在m/44'/60`/0`/0/i路径的keypair
177+
let keypair = hdWallet.derivePath("m/44'/6o'/0'/0/0");
178+
console.log(keypair);
179+
```
180+
18181
# 2025-08-19
19182

20183
转账web3js功能

0 commit comments

Comments
 (0)