2025
解决:bufio.Scanner: token too long 错误
我在使用 bufio.NewScanner()
读取文件时遇到了 “token too long” 错误。错误原因是 bufio.Scanner
默认限制,最大的 token
大小是 64KB
当我们单行数据超过这个限制时,会报 token too long
错误。
这其实是一个非常典型的场景,在读取非常大的数据时(比如超过几十 MB)应该采用什么方法,因为一次读取非常大的数据可能效率不高。我们首先要考虑的数据是否可以分片处理,尽可能减少对于大内存的占用。如果必须要分配大内存,也应该合理的设置缓冲区大小。
君子不器
“君子不器”出自《论语·为政》,是孔子的一句名言。其字面意思是:君子不应该像器具那样局限于单一的用途或功能。这句话表达了孔子对君子品质的期望,即君子应该具备广泛的知识和才能,而不是局限于某一特定的技能或角色。
在人生中我们有很多命题需要去做,比如:学习、工作、生活、家庭、朋友、爱情、事业等等。这些命题都是我们人生中需要去面对和处理的,但是我们不能仅仅局限于某一个命题,而应该具备广泛的知识和才能,这样才能更好地应对人生中的各种挑战和机遇。
同时也要广泛的培养自己的兴趣爱好,既要把工作做好也要建立属于自己的事业,让自己的抗风险能力进一步提高,共勉。
这句话穿越两千多年,依然闪烁着智慧的光芒,提醒我们追求一种更丰富、更自由、更有价值的人生境界。正如清代理学家黄棃洲所言:“君子之学,非可囿于一技也。”(《孟子师说》)这不仅是学识的广度,更是心灵的深度与精神的维度,让我们得以在纷繁世相中不被标签束缚,活出生命的完整性。
区块 DAG(Directed Acyclic Graph,有向无环图)
区块 DAG(Directed Acyclic Graph,有向无环图) 是一种数据结构,用于描述区块链或分布式账本中交易或区块之间的关联关系。与传统区块链的线性链式结构不同,DAG 通过网状拓扑组织交易,允许多个交易并行处理,从而提升系统的扩展性和吞吐量。
最早在区块链中引入 DAG 概念作为共识算法是在 2013 年,bitcointalik.org 由 ID 为 avivz78 的以色列希伯来大学学者提出,也就是 GHOST 协议,作为比特币的交易处理能力扩容解决方案;Vitalik 在以太坊紫皮书描述的 POS共识协议 Casper,也是基于 GHOST POW 协议的 POS 变种。
后来 NXT 社区有人提出用 DAG 的拓扑结构来存储区块,解决区块链的效率问题。区块链只有一条单链,打包出块无法并发执行。如果改变区块的链式存储结构,变成 DAG 的网状拓扑可以并发写入。在区块打包时间不变的情况下,网络中可以并行打包 N 个区块,网络中的交易就可以容纳 N 倍。
此时 DAG 跟区块链的结合依旧停留在类似侧链的解决思路,交易打包可以并行在不同的分支链条进行,达到提升性能的目的。此时 DAG 还是有区块的概念。
2015年9月,Sergio Demian Lerner 发表了 《DagCoin: a cryptocurrency without blocks》一文,提出了 DAG-Chain 的概念,首次把 DAG 网络从区块打包这样粗粒度提升到了基于交易层面,但 DagCoin 本身是一篇论文,没有代码实现。
DagCoin 的思路,让每一笔交易都直接参与维护全网的交易顺序。交易发起后,直接广播全网,跳过打包区块阶段,达到所谓的 Blockless。这样省去了打包交易出块的时间。如前文提到的,DAG 最初跟区块链的结合就是为了解决效率问题,现在不用打包确认,交易发起后直接广播网络确认,理论上效率得到了质的飞跃。DAG 进一步演变成了完全抛弃区块链的一种解决方案。
2016 年 7 月,基于 Bitcointalk 论坛公布的创世贴,IOTA 横空出世,随后 ByteBall 也闪亮登场,IOTA 和 Byteball 是头一次 DAG 网络真正技术实现,也是此领域最耀眼的领军者;此时,号称无块之链、独树一帜的 DAG 链家族雏形基本形成。
一句话来概括:DAG是面向未来的新一代区块链,从图论拓扑模型宏观看,从单链进化到树状和网状、从区块粒度细化到交易粒度、从单点跃迁到并发写入,这是区块链从容量到速度的一次革新。
- 非线性结构:交易(或区块)之间通过引用(指针)相互连接,形成网状图,而非单链。每个新交易需要引用多个历史交易的哈希值(类似“确认”前序交易;
- 有向性:图中的边具有方向性(例如,交易 A 引用交易 B,则边为 \(A \rightarrow B\),不可以反向引用);
- 无环性:不允许出现循环依赖(例如,交易 A 引用交易 B,交易 B 引用交易 C,交易 C 引用交易 A,则形成一个循环),确保数据一致性。
特性 | 传统区块链 | DAG |
---|---|---|
结构 | 线性链式结构 | 网状拓扑结构 |
交易确认方式 | 顺序打包,线性链式结构,需要多个区块确认 | 并行处理,网状结构,交易之间相互引用,无需多个区块确认 |
吞吐量 | 受限于区块大小和出块速度 | 理论上可以无限扩展 |
延迟 | 高(需要等待区块确认) | 低(交易即时传播) |
典型应用 | 比特币、以太坊 | IOTA、Nano、Hedera Hashgraph |
- 交易创建:用户发起交易时,需引用多个已确认的历史交易(作为“基础”)。引用越多,交易的可信度越高(类似共识机制)。
- 交易传播:新交易广播到网络,其他节点验证其引用的历史交易是否有效。验证通过后,交易被加入DAG网络。
- 冲突解决:若两个交易互相矛盾(例如双花攻击),DAG通过拓扑排序或共识算法(如Tangle)决定最终状态。
- 高扩展:无需矿工打包区块,交易可并行处理,适合高频场景(如物联网支付);
- 低延迟:交易即确认,无需等待区块生成;
- 去中心化:节点间直接交互,减少对中心化矿池对依赖。
- 数据存储:网状结构可能导致存储需求指数级增长;
- 双花攻击风险:若恶意用户持续发起冲突交易,可能破坏网络一致性(需依赖强共识机制);
- 复杂性:开发难度高于传统区块链,需设计高效的冲突检测和解决算法。
零知识证明(Zero-Knowledge Proof, ZKP)详解
一、核心概念
零知识证明 是一种密码学协议,允许证明者(Prover)向验证者(Verifier)证明某个命题为真,而无需透露任何与该命题相关的额外信息。其核心目标是 在保证隐私的前提下验证真实性。
二、基本特性
- 完备性(Completeness) 若命题为真,诚实验证者会被证明者的论证说服。
- 可靠性(Soundness) 若命题为假,任何欺骗性证明者都无法通过诚实验证者的检验。
- 零知识性(Zero-Knowledgeness) 验证者无法获得命题之外的任何信息,仅知命题的真伪。
三、工作原理
-
交互式 ZKP
-
步骤:
- 证明者发送初始信息(如承诺)。
- 验证者提出挑战(如随机数)。
- 证明者根据挑战生成响应。
- 验证者检查响应是否合法。
-
示例:Feige-Fiat-Shamir 协议(基于平方剩余难题)。
-
-
非交互式 ZKP(NIZKP)
- 特点:仅需一轮通信(如 zk-SNARKs)。
- 技术基础:
- 多项式承诺:将复杂计算转化为多项式形式。
- 可信设置:生成公共参数(如 CRS,Common Reference String)。
- 代表协议:zk-SNARKs(零知识简洁非交互式知识论证)、zk-STARKs。
四、应用场景
-
区块链与加密货币
- Zcash:使用 zk-SNARKs 隐藏交易金额和参与者身份。
- 以太坊:支持 ZKP 的 Layer 2 方案(如 zkRollups)提升隐私与扩展性。
-
身份验证
- 匿名登录:用户证明拥有私钥,无需泄露密码。
- KYC(了解你的客户):在合规前提下保护用户身份数据。
-
安全协议
- 安全多方计算(MPC):多方协作计算时保护输入隐私。
- 数字签名:结合 ZKP 实现匿名签名(如 DSA 的零知识变种)。
-
游戏与谜题
- 数独验证:证明数独答案正确但不透露解法。
- 谜题解锁:在游戏中证明拥有通关线索,避免剧透。
五、技术实现
-
数学基础
- 困难问题假设:如离散对数、椭圆曲线离散对数(ECDLP)。
- 同态加密:允许在密文上直接计算,保护数据隐私。
-
主流协议
-
zk-SNARKs:
- 优势:验证速度快,证明尺寸小。
- 局限:依赖可信设置(如 Groth16 协议)。
-
zk-STARKs:
- 优势:无需可信设置,抗量子计算。
- 局限:证明尺寸较大。
-
Bulletproofs:适用于短声明的简洁证明(如 Monero 隐私交易)。
-
-
工具与框架
- Libsnark:开源 zk-SNARKs 库。
- Circom:电路编译器,用于构建 zk-SNARKs 电路。
- StarkWare:提供 zk-STARKs 商业解决方案。
六、优缺点分析
优点 | 缺点 |
---|---|
1. 增强隐私:保护敏感数据不泄露。 | 1. 计算开销大:生成/验证证明耗时。 |
2. 安全性高:抵御中间人攻击。 | 2. 实现复杂:需密码学专业知识。 |
3. 灵活性强:适用于多种场景。 | 3. 可信设置风险:若参数泄露,安全性崩溃。 |
七、实际案例
-
Zcash
- 使用 zk-SNARKs 实现隐私交易,隐藏发送方、接收方和金额。
- 挑战:需定期更新可信设置(如 Sprout→Sapling 升级)。
-
以太坊 Layer 2
- zkRollups:将数千笔交易压缩为一个 ZKP,批量提交至主链。
- 优势:降低 Gas 费用,提升吞吐量。
-
匿名身份系统
- Algorand:结合 ZKP 实现去中心化身份认证。
- 微软 ION:基于 Bitcoin 的去中心化标识符(DID)。
八、未来趋势
-
硬件加速
- GPU/FPGA 优化:加速证明生成与验证。
- 可信执行环境(TEE):如 Intel SGX,增强隐私保护。
-
标准化与互操作性
- 通用标准制定:推动 ZKP 协议跨平台兼容。
- 跨链隐私:实现不同区块链间的隐私资产转移。
-
抗量子 ZKP
- Lattice-based ZKP:基于格密码学,抵御量子计算攻击。
总结
零知识证明通过密码学手段,在不泄露隐私的前提下验证信息真实性,已成为区块链、隐私计算和网络安全的核心技术。尽管面临计算开销和实现复杂性等挑战,但随着硬件优化和标准化进展,ZKP 将在更多领域重塑数据隐私的未来。
Components
Components are the units of deployment. They are the smallest entities that can be deployed as part of a system. In Java, they are jar files. In Ruby, they are gem files. In .Net, they are DLLs. In compiled languages, they are aggregations of binary files. In interpreted languages, they are aggregations of source files. In all languages, they are the granule of deployment.
Components can be linked together into a single executable. Or they can be aggregated together into a single archive, such as a .war file. Or they can be independently deployed as separate dynamically loaded plugins, such as.jar or .dll or .exe files. Regardless of how they are eventually deployed, well-designed components always retain the ability to be independently deployable and, therefore, independently developable.
编辑于 2025-03-31
高频 R/W
场景下的性能设计方案
对于这个问题我们需要回归到计算机读写的核心上,计算机的读写速度是有限的,所以需要把数据缓存起来,来提高读写速度。为什么要使用缓存呢?从硬件角度我们知道计算机是有多级缓存架构的,每一级存储设备的读写速度是指数级下降的,越靠近终端存储设备(机械硬盘、固态硬盘)其读写速度越慢,越靠近 CPU 的存储设备其读写速度越快。
缓存是一个有着更快的查询速度的存储技术,这里的更快是指比起从初始的数据源查询(比如数据库,以下都称作数据库)而言。我们经常会把频繁请求的或是耗时计算的数据缓存起来,在程序收到请求这些数据的时候可以直接从缓存中查询数据返回给客户端来提高系统的吞吐量,现在我们来看看有哪些缓存模式可以考虑。
2025-03-23 有感
绕着困难走的人永远不会成为成功的人。一个成功的人,他是主动迎接挑战的人,因为他要开辟新赛道,他如同走在沙漠当中一样,这是任正非的话。
因为没有人会给你指明未来的方向,需要你去开辟新赛道,引领未来发展的方向,这才是伟大的成功者。
所以人呐,是否能成为一个对社会有贡献的人,一是要有信念,二是要有情怀,要敢于面对挑战,迎接挑战。人往往是在迎接挑战的时候,你的才能才会得到极大的释放。
共勉!