Skip to content

Commit d57cef7

Browse files
committed
init
1 parent 12f9063 commit d57cef7

File tree

4 files changed

+295
-14
lines changed

4 files changed

+295
-14
lines changed

01语言/1go/10内存管理.md

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,4 +88,36 @@
8888
#### GC优化
8989
- 控制内存分配的速度,限制 goroutine 的数量,从而提高赋值器对 CPU 的利用率。
9090
- 减少并复用内存,例如使用 sync.Pool 来复用需要频繁创建临时对象,例如提前分配足够的内存来降低多余的拷贝。
91-
- 需要时,增大 GOGC 的值,降低 GC 的运行频率。
91+
- 需要时,增大 GOGC 的值,降低 GC 的运行频率。
92+
93+
### Go 语言垃圾回收优化:
94+
95+
#### 1. 减少内存分配
96+
- 使用 **内存池** (`sync.Pool`) 复用对象,避免频繁内存分配。
97+
- **预分配内存** 使用 `make` 函数避免动态扩展。
98+
99+
#### 2. 优化垃圾回收触发条件
100+
- 通过调整 `GOGC` 环境变量优化 GC 触发频率。
101+
- `GOGC=100`(默认值): GC 每次堆内存大小的 100% 时触发。
102+
- `GOGC=200`: 增加 GC 触发阈值,减少频率。
103+
- 使用 `GODEBUG=gctrace=1` 查看 GC 日志,优化回收效率。
104+
105+
#### 3. 优化大对象的处理
106+
- 减少堆内存分配,将大型对象存储到持久化存储中。
107+
- **分批处理** 大对象,避免一次性加载过多数据。
108+
109+
#### 4. 减少引用周期
110+
- **及时清除引用**,通过显式 `nil` 来加速回收。
111+
- **避免循环引用**,确保垃圾回收器可以正常回收对象。
112+
113+
#### 5. 优化并发与 GC 交互
114+
- **合理使用 goroutine** 数量,避免过多的并发操作导致 GC 开销。
115+
- 使用 **worker pool** 来控制 goroutine 数量。
116+
117+
#### 6. 使用 `unsafe` 避免内存复制
118+
- 使用 `unsafe.Pointer` 来直接操作内存,减少内存复制。
119+
120+
#### 7. 内存泄漏检查
121+
- 使用 **pprof** 工具进行内存泄漏检查,确保内存及时回收。
122+
123+
通过这些优化方法,可以减少 Go 语言垃圾回收对区块链节点性能的影响,提高吞吐量和响应速度。

01语言/1go/13协程.md

Lines changed: 123 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -286,4 +286,126 @@ go func() {
286286
}()
287287
```
288288

289-
3. context包
289+
### 如何避免 Go 语言中的 Goroutine Leak(协程泄漏)
290+
291+
Goroutine leak(协程泄漏)指的是在程序中创建的协程未能正确退出或停止,导致系统资源(如内存)被长期占用,从而影响系统性能。
292+
293+
#### 常见场景
294+
##### 阻塞性 Channel 操作
295+
```go
296+
// 错误示例:若 ch 未被写入,goroutine 将永远阻塞
297+
go func() {
298+
data := <-ch
299+
// ...
300+
}()
301+
```
302+
解决方法:
303+
- 使用带缓冲的 Channel:确保发送方不被阻塞。
304+
- 超时控制:通过 select 和 time.After 设置超时。
305+
- Context 取消:使用 context.Context 传递终止信号。
306+
```go
307+
go func(ctx context.Context) {
308+
select {
309+
case data := <-ch:
310+
// 正常处理
311+
case <-ctx.Done():
312+
// 收到取消信号,退出
313+
case <-time.After(2 * time.Second):
314+
// 超时退出
315+
}
316+
}(ctx)
317+
```
318+
319+
##### 未关闭的 Channel
320+
```go
321+
// 发送方未关闭 Channel,导致接收方 Goroutine 无限等待。
322+
// 错误示例:若 ch 未被关闭,range 会一直阻塞
323+
go func() {
324+
for data := range ch {
325+
// 处理数据
326+
}
327+
}()
328+
```
329+
解决方法:
330+
- 明确关闭 Channel:当数据发送完毕后,由发送方关闭 Channel。
331+
- 结合 select 和退出信号:允许主动终止接收。
332+
```go
333+
go func() {
334+
for {
335+
select {
336+
case data, ok := <-ch:
337+
if !ok { // Channel 已关闭
338+
return
339+
}
340+
// 处理数据
341+
case <-done: // 外部终止信号
342+
return
343+
}
344+
}
345+
}()
346+
```
347+
348+
##### 无限循环未设退出条件
349+
```go
350+
// 错误示例:无限循环且无法终止
351+
go func() {
352+
for {
353+
// 持续执行任务
354+
}
355+
}()
356+
```
357+
解决方法:
358+
- 通过 Channel 或 Context 传递退出信号。
359+
```go
360+
go func(ctx context.Context) {
361+
for {
362+
select {
363+
case <-ctx.Done():
364+
return // 收到取消信号退出
365+
default:
366+
// 执行任务
367+
}
368+
}
369+
}(ctx)
370+
```
371+
372+
##### 使用 Context 传递终止信号
373+
```go
374+
// 通过 context.Context 统一管理 Goroutine 的生命周期:
375+
ctx, cancel := context.WithCancel(context.Background())
376+
377+
go func() {
378+
select {
379+
case <-ctx.Done():
380+
return // 收到取消信号退出
381+
case data := <-ch:
382+
// 处理数据
383+
}
384+
}()
385+
386+
// 需要终止时调用 cancel()
387+
cancel()
388+
```
389+
390+
##### 使用 sync.WaitGroup 同步
391+
```go
392+
var wg sync.WaitGroup
393+
394+
wg.Add(1)
395+
go func() {
396+
defer wg.Done()
397+
// 执行任务
398+
}()
399+
400+
wg.Wait() // 等待所有 Goroutine 完成
401+
```
402+
403+
#### 总结
404+
- 明确退出条件:每个 Goroutine 必须知道何时退出。
405+
- 优先使用 Context:统一管理取消、超时和终止。
406+
- 避免永久阻塞:通过超时、非阻塞操作或退出信号。
407+
- 关闭无用 Channel:通知接收方资源已释放。
408+
- 防御性代码:处理 Panic 和异常场景。
409+
- pprof 监控运行中的 Goroutine 数量,可进一步定位潜在泄漏。
410+
411+

13区块链/原理/原理2.md

Lines changed: 95 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@
100100

101101
| 方案 | 适用场景 | 优势 | 劣势 |
102102
|--------------|----------------------|----------------------|------------------|
103-
| **直接连接** | 双方都有公网 IP | 简单、高效 | 需要公网 IP |
103+
| **直接连接** | 双方都有公网 IP 或者IPV6 | 简单、高效 | 需要公网 IP |
104104
| **UDP 打洞** | 一方或双方在 NAT 之后 | 速度快、资源消耗小 | 对称 NAT 可能失败 |
105105
| **服务器中继**| 双方都在 对称 NAT 之后 | 适用所有情况 | 服务器负担大 |
106106
| **局域网发现(mDNS)**| 设备在 同一 LAN | 快速、无需公网服务器 | 仅限局域网 |
@@ -145,18 +145,85 @@
145145
- 一旦成功连接,节点将不断更新自己的对等节点列表,以便保持网络连接。
146146

147147

148-
## 1️⃣ Kademlia DHT概念
149-
**Kademlia DHT(分布式哈希表,Distributed Hash Table)** 是一种 **去中心化的 P2P 网络协议**,用于高效地存储和查找数据。Kademlia 通过 **XOR 距离度量(XOR Metric)** 组织节点,并采用 **递归查找** 方式来快速定位数据。
148+
## 📌 Kademlia 算法
149+
150+
Kademlia 是一种基于分布式哈希表(DHT,Distributed Hash Table)的对等网络协议,用于在去中心化网络中进行高效的节点查找和数据存储。它广泛应用于 P2P 网络中,特别是在像 IPFS 和 BitTorrent 这样的去中心化应用中。
151+
152+
### **Kademlia 算法的关键特性:**
153+
1. **基于 XOR 距离度量**:节点和数据项的“距离”是通过 XOR(异或)操作计算的,距离越小,表示节点之间的距离越近。
154+
2. **对等性**:网络中的每个节点都平等参与数据的存储和查找,无需中央服务器。
155+
3. **分布式哈希表(DHT)**:数据以键值对的形式存储,每个节点根据哈希值维护一部分数据,并通过 Kademlia 协议查找数据的位置。
156+
4. **路由表**:每个节点维护一个路由表,记录与其相距较近的节点信息,支持高效的查找过程。
157+
5. **高效查找**:Kademlia 的查找过程基于“迭代查找”,通过每次查询将范围缩小到接近目标的节点,极大提高了查找速度。
158+
159+
### **Kademlia 优势:**
160+
- **可扩展性**:网络规模增大时,查找效率不会显著下降。
161+
- **去中心化**:无中央服务器,所有节点均为对等的,减少单点故障的风险。
162+
- **容错性**:节点退出或失效时,数据不会丢失,能够通过网络中的其他节点继续查找和存取数据。
163+
164+
165+
### **1. Gossip 协议概述**
166+
Gossip 协议是一种基于消息传播的协议,通常用于分布式系统中以实现信息的高效传播。它的基本思想是节点随机选择一部分邻居,并将接收到的信息传播给这些邻居,从而形成类似“八卦”的传播方式。
167+
168+
这种协议在大型分布式系统中非常有效,因为它能够快速且高效地将信息从一个节点传递到整个网络,而不依赖于中心化的控制。
169+
170+
### **2. Gossip 协议的工作原理**
171+
- **信息传播:** 每个节点收到信息后,会随机选择一部分邻居节点将该信息发送过去。信息通过多个节点进行传播,逐渐覆盖整个网络。
172+
- **传播范围:** 由于是基于邻居节点的传递方式,信息会在网络中快速扩展。
173+
- **高效性:** Gossip 协议的优点是信息传播迅速,即使网络节点非常多,信息也能在相对较短的时间内传播到网络中的每一个节点。
174+
175+
### **3. Gossip 协议的特点**
176+
- **去中心化:** 无需中央服务器或控制节点来协调信息传播,所有节点都是平等的。
177+
- **容错性强:** 即使某些节点发生故障或丢失数据,信息依然能够通过其他节点继续传播。
178+
- **高效传播:** 由于每个节点都会向多个邻居节点传播信息,因此信息的传播速度非常快。
179+
- **简洁性:** 该协议不需要复杂的路由表或拓扑管理,只需节点之间的简单通信。
180+
181+
### **4. Gossip 协议在区块链中的作用**
182+
在区块链网络中,Gossip 协议扮演着重要的角色,帮助解决节点之间的通信和数据同步问题。
183+
184+
185+
## 📌 什么是 Sybil 攻击?
186+
187+
### **定义**
188+
Sybil 攻击是一种网络攻击方式,攻击者通过伪造大量虚假身份或节点来控制网络中的多数。特别是在区块链系统中。攻击者通过创建多个伪造节点来影响网络的决策、达成共识或操纵数据。
189+
190+
在区块链中,Sybil 攻击的威胁通常表现为:
191+
192+
1. **占用节点资源**:伪造节点参与区块链的共识过程,消耗网络资源。
193+
2. **篡改数据或共识**:通过控制大量虚假节点,攻击者可以影响网络决策、区块生成或交易确认。
194+
3. **恶意行为的推广**:伪造的节点可能向网络发送错误数据,导致网络无法达成一致或受到误导。
195+
196+
### **如何在区块链中防止 Sybil 攻击?**
197+
198+
#### 1. **共识机制的设计**
199+
- **工作量证明(Proof of Work,PoW)**
200+
- **原理**:PoW 机制通过消耗算力来确保节点参与区块链的验证过程。创建一个有效的区块需要消耗大量的计算资源,从而限制了通过简单创建伪造节点进行攻击的可能性。
201+
- **限制**:尽管 PoW 对 Sybil 攻击有一定防范作用,但如果攻击者可以控制大量的算力,也可能发动 51% 攻击。
202+
203+
- **权益证明(Proof of Stake,PoS)**
204+
- **原理**:PoS 通过持有和“质押”代币来决定谁有权验证新区块。攻击者必须拥有大量的代币才能影响共识,而伪造身份的成本较高。
205+
- **防范 Sybil 攻击**:通过让验证者的权利与他们持有的代币数量挂钩,增加了伪造大量身份的成本。攻击者如果想要操纵网络,必须大量购买代币。
206+
207+
208+
209+
### 如何选择哈希算法
210+
211+
1. **强抗碰撞性**
212+
- 选择具有强抗碰撞性和抗预映像攻击的哈希算法,如 **SHA-256****SHA-3**。这些算法设计上具有较高的安全性,可以有效防止攻击者通过碰撞攻击或预映像攻击来伪造数据。
213+
214+
2. **安全性验证**
215+
- 优先选择经过长期使用和验证的哈希算法,避免使用已知存在安全漏洞的算法。例如,**MD5****SHA-1** 在近年来被证明容易受到攻击,因此不推荐在高安全性要求的场景中使用。
216+
217+
3. **性能要求**
218+
- 如果需要高效的计算性能,可以选择 **BLAKE2**。它在性能上相对较快,同时能够保持较高的安全性,适合需要快速计算的应用场景。
219+
220+
4. **适用场景**
221+
- 根据应用场景选择合适的哈希算法。例如:
222+
- **区块链**:通常使用 **SHA-256**(比特币)或 **SHA-3**(以太坊)。
223+
- **数字签名**:选择 **SHA-256****SHA-3**,结合 RSA 或 ECDSA 来增强安全性。
224+
- **数据完整性验证**:可以选择 **BLAKE2****SHA-256**,在确保安全性的同时提供较好的计算效率。
150225

151-
---
152226

153-
### 2️⃣ Kademlia DHT 关键特性
154-
| 特性 | 说明 |
155-
|--------------------|------------------------------|
156-
| **去中心化** | 节点间直接通信,无需中心服务器 |
157-
| **高效路由** | 采用 XOR 距离,路由开销低(O(log N))|
158-
| **容错性强** | 自动适应节点加入和退出 |
159-
| **数据分片存储** | 采用哈希分片,保证数据分布均衡 |
160227

161228
---
162229

@@ -188,7 +255,23 @@
188255
- 跨链技术
189256
- 使用桥接(Bridge)技术,减少主链负载(如 Polkadot、Cosmos 互操作)。
190257

191-
258+
## **📌 智能合约 vs. 传统程序**
259+
260+
| **对比项** | **智能合约(Smart Contract)** | **传统程序(Regular Software)** |
261+
|---------------|--------------------------------|--------------------------------|
262+
| **运行环境** | 区块链(EVM、WASM、Solana VM) | 传统服务器、本地计算机 |
263+
| **执行方式** | 自动触发 & 不可篡改 | 需人工或程序调用,可修改 |
264+
| **数据存储** | 分布式存储,数据不可篡改 | 服务器/数据库,数据可更改 |
265+
| **安全性** | 代码透明,需严格审计 | 代码可私有,可随时更新 |
266+
| **第三方依赖** | 无需信任第三方,依赖共识机制 | 依赖中心化服务器和第三方 |
267+
| **成本** | 需要支付 Gas 费,运行成本较高 | 服务器维护成本 |
268+
| **典型应用** | DeFi、NFT、DAO、链上游戏 | Web 应用、企业软件、移动 App |
269+
270+
## go和智能合约交互
271+
- 通过 go-ethereum 库连接到以太坊节点。
272+
- 使用 ABI 解析合约,并通过 CallContract 方法调用合约中的函数。
273+
- 可以通过 SendTransaction 发送交易到智能合约(如转账)。
274+
- 解析合约返回的数据并输出。
192275

193276

194277

27书籍资料/投资.md

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# 投资
2+
3+
## 策略加权指数基金
4+
也被称为聪明贝塔指数基金,通常会采用某种投资策略来挑选股票,不再按照上市公司市值规模的大小来挑选股票。
5+
- 常见的策略加权指数有:红利指数、基本面指数、价值指数和低波动指数。
6+
- 策略加权指数基金收益可能更好,但承载不了太多的资金,是一个小而美的品种。
7+
8+
## 场内和场外
9+
- 场内基金:
10+
- 在证券交易所上市交易的基金,主要包括 ETF(交易型开放式指数基金) 和 LOF(上市型开放式基金)。
11+
- 费用低、流动性高,适合短期交易和专业投资者。
12+
- 场外基金:
13+
- 通过基金公司、银行、第三方平台(如支付宝、天天基金)申购赎回的基金。
14+
- 操作简单、门槛低,适合长期定投和小白投资者。
15+
16+
## 指数基金的AC类区别
17+
- A:申购费(如原价1.5%,第三方平台常打1折至0.15%),无销售服务费,长期持有总成本更低。
18+
- C:免申购费,但每日计提销售服务费(从净值中扣除,投资者无感知)。持有≥7天通常免赎回费,适合频繁调仓。
19+
20+
21+
## 如何挑选指数基金
22+
通常有三个比较重要的因素,分别是规模、费用和追踪误差。
23+
- 基金规模小于1亿元不要选
24+
- 挑选费用较低的基金
25+
- 选择追踪误差较小的基金
26+
27+
28+
29+
## 定投计划
30+
### 组合
31+
组合是一个以低估指数基金为主的组合。指数基金组合挑选品种的核心思路如下:
32+
- 以优秀策略类宽基指数基金为主,主要是红利、基本面、价值、低波动等策略加权指数基金。
33+
- 上证红利和中证红利,深证基本面60和深证基本面120,重合度比较高。
34+
- 基本面50、300价值,这两个都是大盘类品种,并且金融地产行业比例都比较高。
35+
- 以优秀行业指数基金为辅。
36+
37+
### 怎么买
38+
- 低估买入
39+
- 越跌越买
40+
- 定期不定额
41+
42+
### 怎么卖
43+
- 长期持有
44+
- 牛市高估卖出

0 commit comments

Comments
 (0)