- 博客(248)
- 收藏
- 关注
原创 Uniswap v1、v2、v3 全面对比
Uniswap发展历程:从AMM雏形到专业做市工具 V1(2018)首创x*y=k模型,仅支持ETH-Token交易,验证AMM可行性但功能有限;V2(2020)实现任意Token交易,新增Flash Swap和预言机,成为DeFi基础设施;V3(2021)创新性引入集中流动性机制,允许LP自选价格区间(资金效率提升4000倍),采用多费率池和NFT仓位,大幅提升资本效率但增加了操作复杂度。三代版本呈现"从简到繁、从粗到精"的演进路径,逐步从通用协议转向专业化做市工具。
2025-09-12 15:49:09
799
原创 区块链里的 “信标” 是啥?
摘要: 信标(Beacon)是区块链中的“中央公告牌”,用于统一管理多个代理合约的实现地址。类比连锁超市,信标相当于总部公告牌,所有分店(代理合约)通过查询信标获取最新系统版本,实现一键升级。其核心优势包括:1)集中升级,无需逐个修改代理合约;2)权限统一管理;3)确保系统一致性。适用于多代理场景(如NFT钱包)、复杂DeFi协议或需频繁升级的合约。信标通过简化升级流程和降低维护成本,成为区块链开发中的高效工具。
2025-09-08 17:07:02
393
原创 Solidity 结构体优化,大幅降低 Gas 消耗
优化以太坊智能合约结构体设计可大幅节省Gas费用。核心策略包括:1.按字段大小排序(小字段优先),使存储槽利用率最大化;2.用uint256位操作合并多个小字段;3.避免动态类型,改用固定长度;4.临时结构体使用packed修饰;5.按功能拆分大结构体。通过合理排序和压缩,可减少30-60%的Gas消耗,高频交互合约长期节省显著。关键是将相关小字段组合填充32字节存储槽,避免空间浪费。
2025-09-04 15:52:23
621
原创 如何在 Solidity 中编写高效的 gas 循环?
摘要:Solidity智能合约中优化gas循环的关键技巧包括:1)限制循环迭代次数;2)使用unchecked块处理计数器;3)缓存存储变量到内存;4)避免循环内频繁存储写入;5)减少循环内外部合约调用;6)优先使用映射而非数组;7)考虑小循环展开。核心原则是减少存储操作、利用内存缓存、限制迭代次数,并通过工具分析gas消耗选择最佳实现方案。这些优化能显著降低交易成本并避免gas限制问题。
2025-09-03 11:11:14
271
原创 Solidity 转账三函数:call、transfer、send 精简指南
摘要: ETH转账方法transfer、send、call的核心差异: 错误处理:transfer失败回滚,send返回false需手动检查,call返回状态+数据,灵活性高但需防重入。 Gas限制:transfer/send固定2300,易失败;call无限制,支持复杂操作。 功能:call可同时调用合约函数,适合DeFi;前两者仅转账。 2025推荐:优先call(需防重入),简单场景用transfer,避免send。关键:查返回值、防重入、多测试。 (字数:150)
2025-09-03 10:53:12
385
原创 fallback 和 receive 到底咋区分?啥时候该用哪个?
要分清 fallback 和 receive,关键看两个维度:1. 是否给合约转 ETH;2. 是否携带函数调用数据(比如调用某个函数时,会传函数名、参数等数据,单纯转 ETH 没有这些数据)
2025-09-03 10:22:59
1058
原创 Slither 审计自己写的智能合约
Slither 是一款非常好用的自动化审计工具,可以帮你快速找出大部分常见风险。这篇文章专门讲 “只审计自己写的合约” 怎么做,流程简单、注意事项清楚,帮你高效定位风险。
2025-08-22 15:54:42
783
原创 SQL LIMIT 10000000, 10和 LIMIT 10哪个更快?
摘要:LIMIT分页查询的性能瓶颈主要在于偏移量参数,当偏移量较大时(如LIMIT 10000000,10),数据库需要先扫描并丢弃前1000万条记录,导致查询变慢。相比之下,LIMIT 10只需返回前10条记录,速度更快。优化大偏移量分页的方法是用主键范围查询替代偏移量(如WHERE id>10000000 LIMIT 10),直接通过索引定位数据。这种方案适合顺序翻页,但不适合直接跳转大页码的场景,且需注意主键连续性和索引优化问题。
2025-08-19 10:00:53
492
原创 智能合约里的 “拒绝服务“ 攻击:让你的合约变成 “死机的手机“
智能合约DoS攻击防护指南 摘要:智能合约可能遭受拒绝服务(DoS)攻击,导致核心功能瘫痪。常见攻击方式包括:1)利用批量操作强制失败;2)通过gas炸弹耗尽资源;3)控制关键权限。防范措施:1)拆分批量操作为小批次;2)限制计算复杂度,避免遍历长数组;3)采用多签钱包或DAO治理替代单一管理员。核心原则是避免单点依赖,控制操作复杂度,为系统预留后路,确保合约在部分功能受阻时仍可运行。
2025-08-17 17:30:56
759
原创 重入攻击:区块链世界里的「先上车后买票」骗局
重入攻击是智能合约安全的主要威胁,其核心是利用状态更新滞后进行重复调用套利。本文分析了三种典型重入攻击:1)单函数重入,通过回调函数反复调用同一取款函数;2)跨函数重入,利用关联函数间接实现重复操作;3)跨合约重入,通过多个合约的信任关系形成连锁攻击。防御方案包括:1)采用"检查-生效-交互"模式,先更新状态再转账;2)使用ReentrancyGuard锁机制;3)限制外部调用gas。开发者应遵循"先更新后交互"原则,并善用安全工具,以有效防范重入风险。
2025-08-17 17:08:23
877
原创 合约低级调用三兄弟:call、delegatecall、staticcall
摘要:以太坊提供三种低级调用方式:call(灵活调用合约函数及转账)、delegatecall(借用外部代码但保持自身数据)和staticcall(仅查询不修改数据)。call适合通用调用和转账,delegatecall用于合约升级,staticcall用于安全查询。使用需谨慎,需手动处理错误和安全检查,避免资产损失。高级调用更安全,仅在特殊需求时使用低级调用。
2025-08-16 18:20:02
915
原创 一文看懂 ethers.js:区块链开发
ethers.js 就是一个 JavaScript 库(可以理解为一堆写好的工具函数),专门用来帮你和以太坊(以及类似的区块链,比如 BSC、Polygon 这些)打交道。
2025-08-16 17:53:35
575
原创 如何将 Vue 前端、Hardhat 合约和 Node.js 后端集成到一个项目中
在区块链开发中,DApp(去中心化应用)的开发往往涉及到多个层次:前端、合约和后端。今天我们将演示如何将 Vue 前端、Hardhat 合约 和 Node.js 后端 放在一个项目中,来打造一个完整的区块链应用。
2025-08-08 10:56:03
412
原创 PyTorch topk() 用法详解:取最大值
torch.topk(input, k) 返回张量中最大的 k 个元素以及它们在原张量中的 索引。
2025-06-24 17:19:43
475
原创 深入浅出 iOS 对象模型:isa 指针 与 Swift Metadata
在iOS开发中,isa指针和Metadata是两个关键概念,分别源自Objective-C和Swift的对象系统。isa指针是Objective-C对象的“身份证”,指向其类对象,支持动态消息发送和运行时方法调度。Swift的Metadata则描述了类型的详细信息,如类名、方法表等,支持静态和动态方法调度。两者在内存效率和方法调用上各有优势,isa指针在64位系统中通过合并结构节省内存,而Metadata通过只读共享减少全局开销。在混合开发中,继承自NSObject的Swift类会同时拥有isa指针和Met
2025-05-12 16:15:12
1047
原创 哈希表扩容怎么处理新插入的值?Swift 是怎么做的?
如果在扩容的过程中,又有新的值要插入怎么办?1. 等扩容完再插入 2. 扩容和插入同时进行(并发)3. 渐进式扩容
2025-05-09 15:11:05
926
原创 SwiftData 用泛型查任意表
不用@Query,自己封装了一个泛型查询函数能查任何表、加任何条件、按任何顺序封装成服务类,解耦 UI 和数据层最重要的是,写得开心,用得自由SwiftData 是个不错的工具,但你没必要被它框死。只要你能掌握它的底层逻辑,就可以根据自己的方式来使用它,哪怕是“非主流”的方式。
2025-05-08 16:31:51
367
原创 SwiftData 数据持久化解决方案
SwiftData 是苹果在 WWDC23 上推出的全新数据持久化框架,它构建在 Core Data 之上,但提供了更加 Swift 友好的 API。SwiftData 旨在简化数据模型的创建和管理,让开发者能够以更少的代码实现强大的数据持久化功能。@Model@Model宏会自动为你的类添加持久化能力,无需手动处理 Core Data 的复杂设置。SwiftData 为 Swift 开发者提供了一种更现代、更简洁的数据持久化方案。
2025-05-08 16:13:48
474
原创 模板模式 VS 建造者模式
模板模式和建造者模式是两种不同的设计模式,下面从定义、结构、应用场景等方面介绍它们的区别,并给出 Python 示例代码。
2025-05-06 17:08:42
510
原创 状态模式 VS 策略模式
在软件开发的世界里,设计模式如同工匠手中的精良工具,能帮助开发者打造出结构清晰、易于维护和扩展的软件系统。状态模式和策略模式便是其中两个常用却容易让人混淆的设计模式。接下来,我们会详细剖析它们的区别、适用场景,并给出 Python 代码示例
2025-05-06 16:10:36
789
原创 SwiftUI 音频播放器:AVPlayer 在线播放 + 播放进度条 + 音量调节 + 后台播放
在 iOS 应用中,如果你想实现一个简洁优雅的音乐播放器组件,Apple 的 AVPlayer 是一个非常可靠的工具。本文将带你用 SwiftUI 构建一个支持:
2025-04-21 16:32:38
4987
原创 使用 Google ML Kit 实现图片文字识别(提取美国驾照信息)
Google ML Kit 是一个现代、功能强大、跨平台的机器学习 SDK。在这篇文章中,我们将使用 ML Kit 在 Android 应用中识别图片文字,以提取美国驾照上的关键信息:DL(驾照号) 和 EXP(有效日期)。
2025-04-08 17:40:22
451
原创 Swift 并发任务的协作式取消
在 Swift 并发(Swift Concurrency)中,任务(Task)不会被强行终止,而是采用**协作式取消(cooperative cancellation)**机制。这意味着任务会被标记为“已取消”,但是否真正停止执行,取决于任务本身的逻辑处理。
2025-03-21 10:59:28
588
原创 Vue3中集成Chart.js实现柱状图
我们将介绍如何在Vue 3项目中集成Chart.js并使用其功能绘制一个柱状图。Chart.js是一个流行的开源JavaScript库,可以帮助我们轻松创建美观的图表。
2025-03-20 15:19:16
813
原创 JS中Object与Map的区别
Object 和 Map 均可用来存储键值对,但它们存在诸多不同之处。下面为你详细介绍两者的区别并给出示例代码。
2025-03-19 13:58:22
228
原创 JS中let和var变量区别
作用域:var 是函数作用域,let 是块级作用域。提升:var 会被提升并初始化为 undefined,let 也会提升,但在声明前访问会导致错误。重声明:var 允许在同一作用域内重复声明,let 不允许。循环中的行为:在 for 循环中,使用 let 会创建一个新的作用域,而 var 只会有一个作用域。
2025-02-28 10:09:09
456
原创 Android CustomTextField
在 Compose 中开发用户界面时,需要处理输入框和键盘的交互,例如在键盘弹出时调整布局位置,避免遮挡重要内容。本篇博客将通过一个完整的示例展示如何实现这一功能
2025-01-15 17:30:32
673
原创 SwiftUI 中的 navigationBarTitleDisplayMode 使用区别:.automatic、.inline 和 .large
SwiftUI 提供了navigationBarTitleDisplayMode修饰符来控制导航栏标题的显示模式。这三种模式(.automatic、.inline和.large)主要决定了标题的外观和布局方式,本文将介绍它们的使用场景和区别
2025-01-13 14:55:43
537
原创 SwiftUI 导航:通过 NavigationStack 和 NavigationDestination 实现路径管理
在 SwiftUI 开发中,实现灵活且功能丰富的导航系统是构建优秀用户界面的关键。本文将深入解析一段 SwiftUI 代码,展示如何利用NavigationStack和枚举来实现多界面导航,并在不同界面之间传递参数
2025-01-11 17:22:06
736
原创 Xcode 正则表达式实现查找替换
在软件开发过程中,查找和替换文本是一项常见的任务。正则表达式(Regular Expressions)是一种强大的工具,可以帮助我们在复杂的文本中进行精确的匹配和替换。Xcode 作为一款流行的开发工具,提供了对正则表达式的支持。本文将详细介绍如何在 Xcode 中利用正则表达式实现查找替换功能。
2025-01-11 14:42:42
1410
原创 Python 桌面时钟
学习如何使用 Python 的 tkinter 模块创建一个动态时钟。通过这个项目,你将熟悉 tkinter 的基本用法,掌握画布绘图和动态更新的技巧
2025-01-09 15:32:26
554
原创 Python 爬取 B 站视频弹幕
B 站的弹幕数据是通过视频的cid(弹幕 ID)来获取的。每个视频对应一个cid,而弹幕存储在一个 XML 文件中。只需要知道视频的cid,就能通过 API 获取对应的弹幕
2025-01-08 19:26:36
2695
10
原创 Python 用 PrettyTable 让你的数据展示更美观
PrettyTable是一个用于在 Python 中以表格形式展示数据的模块,提供简单易用的接口,可以轻松创建格式化的表格
2025-01-08 15:43:56
443
原创 深入理解 Python 线程:多线程编程的实践与技巧
在Python编程中,线程是一个强大的工具,它允许我们在程序中同时执行多个任务,从而提高程序的效率和响应性。本文将深入探讨Python线程的概念、使用方法以及在实际应用中需要注意的问题。
2025-01-07 18:01:29
502
原创 Python 协程:用 asyncio 和 Task 实现并发
Python的协程提供了一种高效处理异步任务的方式,使我们可以轻松实现并发编程。在实际开发中,asyncio 和 Task 是协程并发的核心工具。本文将介绍协程的基本概念,并通过代码示例演示如何使用 asyncio 和 Task 来实现并发。
2025-01-07 18:00:46
589
原创 Python 代理的使用:突破网络限制,提升数据获取效率
在当今数字化的世界中,网络数据的获取和处理变得越来越重要。在使用Python进行网络请求时,有时候我们会遇到网络限制、访问速度慢等问题。这时候,代理(Proxy)就成为了解决这些问题的有力工具。本文将详细介绍如何在Python中使用代理,让你的网络请求更加顺畅。
2025-01-07 15:17:53
569
原创 使用 Python 和 BeautifulSoup 进行网页数据抓取
网页数据抓取(WebScraping)是从网页上提取数据的技术。Python提供了许多库来完成这项任务,其中BeautifulSoup是一个非常流行且易用的选择。本文将介绍如何使用BeautifulSoup抓取网页数据,并提供详细的代码示例。
2025-01-07 14:51:29
304
原创 Python 与 Xpath 解析小说网站
try:resp.raise_for_status() # 检查请求是否成功,如果状态码不是200,引发异常print(f"网络请求错误: {e}")return ""这个函数url(要请求的网页地址)和headers(请求头信息)。在函数内部,使用方法发送 GET 请求获取网页内容,并通过with语句确保请求完成后资源能够正确关闭。用于检查请求是否成功,如果状态码不是 200,会引发异常,捕获异常后打印错误信息并返回空字符串。
2025-01-03 16:44:54
418
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人