审计辅助工具

EtherScan Etherscan 是以太坊区块链浏览器,用于查询交易、合约和账户信息。 在审计过程中可用于: 检查合约部署地址及交易历史 验证合约源代码与链上字节码一致性 查询 ERC-20/ERC-721 代币持有人和转账记录 cloc 统计代码行数的工具,可用于: 了解代码规模 比较不同版本的代码变化 支持多种语言,包括 Solidity notion 可用于汇总和管理审计过程中的资料、笔记和报告: 可以建立审计任务列表 追踪漏洞修复进度 整合团队协作 Documentation ( 需求方提供 ) 审计文档部分通常包含以下内容: Roles:合约中涉及的角色定义,例如 Owner、Admin、User 等 Scope:审计范围,包括智能合约模块、外部依赖、第三方库 Commit Hash (github repository):记录审计所使用的代码版本 Known Issues:已知问题或潜在风险列表 Solidity Metrics ( vscode 扩展 ) Solidity 代码度量工具,用于评估合约复杂度和安全性 Note.md ( 自己撰写 ) 审计笔记记录,可包含: 潜在漏洞说明 安全优化建议 审计过程中发现的异常行为 链上交互测试结果

August 16, 2025 · 1 min · 52 words · Guangyang Zhong

静态分析工具

简介 静态分析工具是智能合约安全审计的重要辅助手段,能够在代码执行前自动检测潜在的安全漏洞、编码问题和最佳实践违规。这些工具通过分析源代码或字节码的模式来识别风险,极大提高了审计效率和漏洞发现率 主要静态分析工具对比 工具名称 语言支持 分析类型 特点 适用场景 Slither Solidity 源代码分析 快速、检测种类多、可定制规则 常规安全审计、开发中检查 Mythril EVM字节码 符号执行 深度分析、路径覆盖广 复杂逻辑漏洞、重入攻击检测 Aderyn Solidity 源代码分析 专注于Rust实现、速度快 Rust开发者、性能敏感场景 Semgrep 多语言 模式匹配 简单规则、学习曲线低 团队编码规范检查 Slither 概述 Slither 是由 Trail of Bits 开发的 Solidity 静态分析框架,速度快、检测能力强,支持自定义检测规则。 安装 python3 -m pip install slither-analyzer 升级 python3 -m pip install --upgrade slither-analyzer 基本使用 扫描当前目录 slither . 扫描特定文件 slither tests/uninitialized.sol 检测器选择 Slither 默认会运行 所有内置检测器 指定检测器 slither file.sol --detect arbitrary-send,pragma 排除指定检测器 slither file.sol --exclude naming-convention,unused-state,suicidal 排除全部 informational / low 级别的检测器 slither file.sol --exclude-informational slither file.sol --exclude-low 查看所有可用检测器 slither --list-detectors 打印器 默认情况下,所有 printers 都不会运行 ...

August 16, 2025 · 4 min · 668 words · Guangyang Zhong

Vector 日志采集与处理

简介 Vector 是一个高性能日志与指标采集代理,它从各种 source 收集数据,经过 transform 处理后发送到 sink(如 Loki、ClickHouse、Kafka、Elasticsearch 等) 它的特点是高吞吐、低延迟、无需依赖 JVM、轻量好部署,非常适合边缘节点和容器环境 本文主要讲述 Events 和 Compnents 1. 配置结构概览 Vector 有两种数据模型 (Data Model), 又称事件(Events): Logs: 用于表示结构化或非结构化日志数据 metrics: 用于表示指标数据 Vector 的配置由三个核心部分 (Compnets) 组成: sources:数据采集源 transforms:数据处理与解析 sinks:输出目标 2. Data model(events) Log events Here’s an example representation of a log event (as JSON): { "log": { "custom": "field", "host": "my.host.com", "message": "Hello world", "timestamp": "2020-11-01T21:15:47+00:00" } } Metric event 此处留给以后撰写 3. Compnents 3.1 source 详细配置请见 👉 Sources reference ...

August 20, 2024 · 2 min · 232 words · Guangyang Zhong

ClickHouse 高性能数据库

ClickHouse 高性能数据库 ClickHouse 是一款 开源、高性能的列式数据库,主要用于 大规模数据分析 (OLAP) 和 实时查询。它的特点是: 列式存储,读取指定列非常快 支持高并发写入和查询 强大的聚合功能,适合报表和日志分析 支持 SQL 查询,易上手 1️. 安装与快速开始 可以参考官方文档或社区教程 👉ClickHouse 官方文档 1.1 安装 curl https://clickhouse.com/ | sh sudo ./clickhouse install 1.2 运行 $ clickhouse-client --host server ClickHouse client version 24.12.2.29 (official build). Connecting to server:9000 as user default. Connected to ClickHouse server version 24.12.2. :) Specify additional connection details as necessary: Option Description --port <port> The port ClickHouse server is accepting connections on. The default ports are 9440 (TLS) and 9000 (no TLS). Note that ClickHouse Client uses the native protocol and not HTTP(S). -s [--secure] Whether to use TLS (usually autodetected). -u [--user] <username> The database user to connect as. Connects as the default user by default. --password <password> The password of the database user. You can also specify the password for a connection in the configuration file. If you do not specify the password, the client will ask for it. -c [--config] <path-to-file> The location of the configuration file for ClickHouse Client, if it is not at one of the default locations. See Configuration Files. 1.3 退出 To exit the client, press Ctrl+D, or enter one of the following instead of a query: ...

August 18, 2024 · 2 min · 270 words · Guangyang Zhong

QR Scanner 使用指南

简介 qr-scanner 是一款纯前端、零依赖的 JavaScript 二维码扫描库,完全在浏览器端运行,无需后端配合。它同时支持: 摄像头实时扫码 静态图片/文件离线扫码(支持 <img>、<canvas>、<video>、File、Blob 等多种来源) 底层使用 WebAssembly 加速解码,识别速度快、准确率高,在手机端表现尤为优秀,是目前最推荐的前端二维码扫描方案 本文以 React + Next.js 框架为例 1. 安装 npm install qr-scanner 或使用 yarn: yarn add qr-scanner 注意:已不再推荐直接用 <script> 标签引入,现代项目请通过包管理器安装 2. 基本引入方式 import QrScanner from 'qr-scanner'; 3. 核心类:QrScanner 3.1 摄像头实时扫码 const videoElement = document.getElementById('video') as HTMLVideoElement; const scanner = new QrScanner( videoElement, (result) => { console.log('扫码成功:', result.data); // result.cornerPoints 可用来做边框动画 }, { returnDetailedScanResult: true, // 返回完整对象而非仅字符串 highlightScanRegion: true, // 显示扫描区域遮罩 highlightCodeOutline: true, // 高亮二维码轮廓 } ); // 启动摄像头 await scanner.start(); // 停止扫描 scanner.stop(); 常用配置项 参数 说明 returnDetailedScanResult true 时返回 { data, cornerPoints } 对象 highlightScanRegion 显示半透明扫描区域框 highlightCodeOutline 实时绘制二维码四角轮廓 3.2 离线扫描图片文件 const file: File = 文件输入框.files[0]; const result = await QrScanner.scanImage(file, { returnDetailedScanResult: true }); console.log('二维码内容:', result.data); 支持所有图片源:File、Blob、HTMLImageElement、HTMLCanvasElement、URL 等 ...

August 16, 2024 · 2 min · 263 words · Guangyang Zhong

Redis 迭代历程

图片来源: https://bytebytego.com 2010 - 独立版 Redis(Standalone Redis) Redis 1.0 发布,架构简单,通常用作业务应用的缓存 特点:数据完全存储在内存中 问题:重启 Redis 会丢失所有数据,所有流量直接打到数据库 2013 - 持久化(Persistence) Redis 2.8 发布,引入持久化机制 RDB:内存数据快照,定期保存数据状态到磁盘 AOF(Append-Only File):记录每条写命令,保证数据在重启后恢复 2013 - 主从复制(Replication) Redis 2.8 增加复制功能,提高可用性 主节点:处理实时读写请求 从节点:同步主节点数据,实现高可用 2013 - Sentinel Redis 2.8 引入 Sentinel,用于监控 Redis 实例 功能: 监控实例状态 事件通知 自动故障转移(failover) 配置提供者(配置管理) 2015 - 集群(Cluster) Redis 3.0 发布,增加 Redis 集群功能 Redis Cluster:分布式数据库解决方案,通过分片管理数据 数据分片机制:将数据分为 16384 个槽位,每个节点负责部分槽位 后续发展 2017 - Redis 5.0:增加 Stream 数据类型 2020 - Redis 6.0:引入网络模块多线程 I/O ...

July 20, 2024 · 1 min · 78 words · Guangyang Zhong

Redis 如何持久化数据

图片来源: https://bytebytego.com 一、AOF(Append-Only File) 特点:写后日志(Write-after log),记录执行过的命令而不是数据本身 工作原理: Redis 先在内存中执行命令修改数据 然后将命令写入 AOF 文件 优势: 基于事件的设计,数据恢复简单 不阻塞当前写操作,性能高 注意:AOF 是命令日志,恢复时需要重放日志,日志大时恢复较慢 二、RDB(Redis Database) 特点:数据快照,在特定时间点记录整个数据集 工作原理: 主线程 fork 出 bgsave 子进程,共享内存数据 bgsave 读取数据并写入 RDB 文件 主线程修改数据时,创建数据副本(Copy-on-write) 主线程对副本操作,bgsave 继续写入 RDB 文件 优势: 数据恢复快速,只需加载快照即可 限制: 快照频率低时可能丢失最近修改的数据 三、混合策略(Mixed Approach) 生产环境常用策略: 使用 RDB 定时生成数据快照 使用 AOF 记录快照之后的命令 优势: 结合 RDB 快速恢复和 AOF 高可靠性,兼顾性能与安全

July 19, 2024 · 1 min · 54 words · Guangyang Zhong

Redis 为什么这么快

图片来源: https://bytebytego.com 一、基于内存(RAM-based) 1. Redis 使用内存而非磁盘 Redis 的数据主要存储在 RAM(内存) 中 避免了磁盘 IO 带来的巨大延迟 2. 不同存储介质的延迟对比(近似值) 存储层级 延迟 CPU Register ~0.3 ns L1 Cache ~0.9 ns L2 Cache ~2.8 ns L3 Cache ~12.9 ns RAM ~120 ns SSD 50–150 μs HDD 1–10 ms 内存访问速度比 SSD 快 数百倍,比 HDD 快 数万倍,这是 Redis 高性能的根本原因 二、IO 多路复用 + 单线程模型 1. IO 多路复用(IO Multiplexing) Redis 使用 IO 多路复用机制(如 epoll / kqueue / select) 一个线程即可同时监听 大量 Socket 连接 示意: ...

July 18, 2024 · 1 min · 213 words · Guangyang Zhong

Redis 应用场景

图片来源: https://bytebytego.com 1. 会话管理(Session) 用途:在分布式系统中共享用户会话数据 实现方式:Redis STRING 或 HASH 存储 session 信息 2. 缓存(Cache) 用途:缓存对象、页面或热点数据,减少数据库压力 实现方式:Redis STRING / HASH / ZSET 3. 分布式锁(Distributed Lock) 用途:保证多个分布式服务间的资源互斥访问 实现方式:Redis STRING + 设置过期时间 + 原子操作(SETNX / Lua 脚本) 4. 计数器(Counter) 用途:统计文章点赞数、阅读量等 实现方式:Redis INCR / INCRBY 5. 限流器(Rate Limiter) 用途:限制特定用户或 IP 的请求频率 实现方式:Redis STRING / HASH + TTL 或令牌桶算法 6. 全局 ID 生成器(Global ID Generator) 用途:生成分布式系统全局唯一 ID 实现方式:Redis INCR / INCRBY 7. 购物车(Shopping Cart) 用途:存储用户购物车中的商品及数量 实现方式:Redis HASH(key=用户ID,field=商品ID,value=数量) 8. 用户留存计算(User Retention) 用途:统计用户每日登录情况,计算留存率 实现方式:Redis BITMAP 或 HyperLogLog 9. 消息队列(Message Queue) 用途:实现简单的队列消息传递机制 实现方式:Redis LIST(LPUSH / RPOP) 10. 排行榜(Ranking) 用途:对文章、用户或商品进行排名展示 实现方式:Redis ZSET(有序集合,按分数排序)

July 18, 2024 · 1 min · 93 words · Guangyang Zhong

全方位理解 Cache

图片来源: https://bytebytego.com 1. 什么是缓存(What is a Cache) 内存存储(In-Memory Storage) 缓存是一种将数据存储在 更快的介质(通常是内存) 中的技术 本质是 用空间换时间 缓存中的数据通常不是权威数据源,权威数据仍在数据库或磁盘中 缓存命中 / 未命中(Cache Hit & Miss) 缓存命中(Hit):请求的数据存在于缓存中 缓存未命中(Miss):缓存中没有数据,需要访问下层存储 命中率(Hit Ratio)是衡量缓存效果的核心指标 2. 缓存的应用场景(Where Is Caching Used) CPU 缓存(L1 / L2 / L3) 位于 CPU 内部或附近的硬件缓存 利用: 时间局部性 空间局部性 页面缓存(Page Cache) 操作系统级缓存 文件读写会优先命中内存中的 Page Cache CDN 缓存静态或半静态资源(HTML / CSS / JS / 图片) 减少源站压力,降低网络延迟 缓冲区缓存(Buffer Cache) 对磁盘 IO 进行缓冲 减少频繁的小 IO 操作 Memcached 轻量级内存 KV 缓存 不支持复杂数据结构和持久化 Redis 功能丰富的内存数据存储系统 支持多种数据结构、持久化、复制和集群 3. 缓存部署方式(Cache Deployment) 进程内缓存(In-Process Cache) 缓存存在于应用进程内部 优点:访问速度最快 缺点:无法共享、数据不一致 进程间缓存(Inter-Process Cache) 多进程共享同一缓存实例(同一台机器) 需要 IPC 或共享内存机制 远程缓存(Remote Cache) 通过网络访问缓存(如 Redis) 支持多服务共享和水平扩展 4. 为什么需要缓存(Why Do We Need to Cache) 提升性能(Improve Performance) 减少数据库和后端服务压力 避免重复计算 降低延迟(Reduce Latency) 内存访问速度远快于磁盘和网络 IO 阿姆达尔定律(Amdahl’s Law) 系统整体性能提升受限于不可优化部分 缓存应优先优化系统中的关键耗时路径 帕累托分布(Pareto Distribution) 20% 的数据产生 80% 的访问量 缓存非常适合热点数据场景 5. 分布式缓存(Distributed Cache) 取模分片(Modulus Sharding) 根据 hash(key) % N 分片 节点变化会导致大量缓存失效 范围分片(Range-Based Sharding) 按 Key 范围进行分片 容易产生数据倾斜和热点 一致性哈希(Consistent Hashing) 节点变化只影响少量 Key 常用于 Redis Cluster 6. 缓存替换与失效(Cache Replacement & Invalidation) 缓存替换策略 LRU(最近最少使用):淘汰最近最少被访问的数据 LFU(最不经常使用):淘汰访问频率最低的数据 缓存失效策略 白名单策略(Allowlist Policy) 仅允许指定 Key 进入缓存 写时主动失效 数据更新时先写数据库,再删除或更新缓存 读时主动失效 读数据时发现不一致,主动使缓存失效 TTL(过期时间) 为缓存设置存活时间,自动过期 7. 缓存策略(Cache Strategies) Cache-Aside(旁路缓存) 应用程序显式控制缓存 读:缓存 → 数据库 → 写缓存 写:写数据库 → 删除缓存 Read-Through 缓存层负责从数据库加载数据 Write-Around 写操作绕过缓存,直接写数据库 Write-Through 同时写缓存和数据库,保证一致性 Write-Back 先写缓存,异步写数据库 性能高,但有数据丢失风险 8. 缓存面临的挑战(Caching Challenges) 惊群效应(Thundering Herd) 大量请求同时发生缓存未命中 解决方式:加锁、请求合并 缓存穿透(Cache Penetration) 请求不存在的数据,绕过缓存直达数据库 解决方式:布隆过滤器、缓存空值 大 Key(Big Key) 单个 Key 占用大量内存 可能导致阻塞和延迟抖动 热 Key(Hot Key) 某些 Key 被高频访问 解决方式:本地缓存、Key 拆分、多副本 数据一致性(Data Consistency) 缓存通常只能保证最终一致性 需要合理的失效和过期策略 9. 其他(Others) 监控与告警(Monitoring & Alerts) 缓存命中率 QPS 与延迟 内存使用率 热 Key 监控 异常告警机制

July 18, 2024 · 2 min · 227 words · Guangyang Zhong