基础漏洞总结3
拒绝服务拒绝服务指的是攻击者通过某种方式阻止合约正常执行其预期功能,使得合约无法继续服务合法用户。 简单来说,这是一种”我让你无法正常工作”的攻击方式。在智能合约中,DoS攻击通常通过操纵合约状态或利用执行限制来实现。 示例一个代币分发合约,负责收集投资并向投资者分发回报: 123456789101112131415161718192021contract DistributeTokens { address public owner; // gets set somewhere address[] investors; // array of investors uint[] investorBalances; // the amount investor gets bool public isFinalized = false; // ... function invest() public payable { investors.push(msg.sender); inves...
基础漏洞总结2
随机错觉(Entropy lllusion)随机错觉,也称为熵错觉,指的是开发者错误地认为在区块链上可以轻易地获得安全、不可预测的随机数。 简单来说,这是一种“我以为它是随机的,但实际上并非如此”的认知错误。 示例一个私有视图函数,用于根据一定的随机性条件判断是否执行空投。 123456789101112131415function airdrop() private view returns(bool){ uint256 seed = uint256(keccak256(abi.encodePacked( (block.timestamp).add (block.difficulty).add ((uint256(keccak256(abi.encodePacked(block.coinbase)))) / (now)).add (block.gaslimit).add ((uint256(keccak256(abi.encodePacked(msg.sender)))) / (now)).a...
基础漏洞总结1
之前学的比较乱,现在复习整理一下。 重入re-entrancy重入攻击是指在合约执行外部调用(通常是向外发送以太或调用另一个合约)时,接收方在该外部调用的执行流程中再次调用回原合约的某个函数,并借此在原合约未完成状态更新之前重复利用其尚未更新的状态,从而盗取资金或破坏状态一致性。 换句话说:合约 A 在执行到“对外调用”并等待返回时,被外部合约 B 回调回 A,利用 A 尚未完成的内部逻辑(比如余额未清零)重复触发受害逻辑。 示例漏洞合约 12345678910111213141516171819202122232425262728293031323334// SPDX-License-Identifier: MITpragma solidity ^0.8.0;contract EtherStoreVulnerable { uint256 public withdrawalLimit = 1 ether; mapping(address => uint256) public lastWithdrawTime; mapping(address...
关于Git 子模块(子文档)
问题发现&解决什么是子模块(子文档) 定义:Git 子模块(submodule)是一个嵌套在父仓库中的独立 Git 仓库。 作用:允许你在一个 Git 仓库中引用另一个仓库,并保持独立版本控制。 特点: 有自己的 .git 目录或由父仓库 .gitmodules 管理。 GitHub 上显示为 箭头文件夹,点击会跳转到子模块的远程仓库。 本地未初始化或更新时,会出现 in unpopulated submodule 报错。 如何发现文件夹被上传成子模块 GitHub 文件浏览器: 文件夹前有 箭头标记。 点击会跳到子模块对应的远程仓库,而不是显示普通文件列表。 本地操作: 执行 git status 或 git submodule status 可能显示子模块信息。 对未初始化的子模块操作文件会报错,例如: 1in unpopulated submodule 为什么文件夹会被识别为子模块 误操作添加子模块: 1git submodule add <repo_url> 子文件夹名 Git 会记录子模块信息在 .gitmodules...
分布式详解2
ZAB协议ZAB协议定义ZAB协议是为分布式协调服务Zookeeper专门设计的一种支持崩溃恢复的原子广播协议,实现分布式数据一致性。 ZAB协议组成部分消息广播 集群中所有的事务请求都由Leader节点来处理,其他服务器为Follower Leader将客户端的事务请求转换为事务Proposal,并且将Proposal分发给集群中其他所有的Follower 完成广播之后,Leader等待Follower反馈,当有过半数的Follower反馈信息后,Leader将再次向集群内Follower广播Commit信息 Commit信息就是确认将之前的Proposal提交 Leader节点的写入是一个两步操作:第一步是广播事务操作,第二步是广播提交操作 过半数指的是反馈的节点数 >=N/2+1,N是全部的Follower节点数量 崩溃恢复 在以下情况下会进入崩溃恢复模式: 初始化集群,刚刚启动的时候 Leader崩溃,因为故障宕机 Leader失去了半数的机器支持,与集群中超过一半的节点断连 此时开启新一轮Leader选举,选举产生的Leader会与过半的...
分布式详解1
CAP理论简述CAP理论 **数据一致性 (Consistency)**:如果系统对一个写操作返回成功,那么之后的读请求都必须读到这个新数据;如果返回失败,那么所有读操作都不能读到这个数据。对调用者而言数据具有强一致性。 **服务可用性 (Availability)**:所有读写请求在一定时间内得到响应,可终止、不会一直等待。 **分区容错性 (Partition Tolerance)**:在网络分区的情况下,被分解的节点仍能正常对外服务。 如果选择了CA而放弃了P,那么当发生分区现象时,为了保证C,系统需要禁止写入,当有写入请求时,系统返回error,这又和A冲突了,因为A要求返回no error和no timeout。因此,分布式系统理论上不可能选择CA架构,只能选择CP或者AP架构。 反证:如果CAP三者可同时满足,由于允许P的存在,则一定存在节点之间的丢包,如此则不能保证C。因为允许分区容错,写操作可能在节点1上成功,在节点2上失败,这时候对于Client1(读取节点1)和Client2(读取节点2),就会读取到不一致的值,出现不一致的情况。如果要保持一致性,写操作必...
nvm 是如何在操作系统文件层面管理 Node.js 版本的?
nvm 是如何在操作系统文件层面管理 Node.js 版本的?很多人知道 nvm(Node Version Manager)可以一键切换 Node.js 版本,但它到底是如何在系统文件层做到“多版本共存、快速切换”的呢?下面用简单易懂的方式带你了解。 核心思路:把不同版本放在不同文件夹里nvm 不会把 Node.js 安装在系统默认目录(比如 /usr/local/bin 或 C:\Program Files),而是放到它自己的目录下。例如: 在 Linux / macOS:1234~/.nvm/versions/node/ ├── v14.21.3/ ├── v16.20.0/ └── v18.17.1/ 在 Windows(nvm-windows):1234D:\Program Files\nvm\ ├── v14.21.3\ ├── v16.20.0\ └── v18.17.1\ 每个版本都有一套完整的 Node 和 npm 文件,不互相覆盖。 一、切换版本时做了什么?当你运行: 1nvm use 16 nvm 的操作...
代码理解记录1
1uint id = zombies.push(Zombie(_name, _dna)) - 1; 错误理解:仅记录加入数组的僵尸的下标 正确理解:1. 创建一个 Zombie 结构体实例1Zombie(_name, _dna) 这是对 Zombie 结构体的构造(只是内存中的一个临时对象)。 2. 调用 zombies.push(...) 将它加入数组1zombies.push(...) push 会把这个新的僵尸放入 zombies 动态数组中,并且返回当前数组的新长度。 3. 计算该僵尸的下标(ID)因为 push 返回的是「数组新长度」,所以减 1 就是索引: 1uint id = ... - 1; 该代码等价于: 12zombies.push(Zombie(_name, _dna)); // 加入数组uint id = zombies.length - 1; // 获取下标
V3里的tick与价格表示
代码地址: https://github.com/Uniswap/v3-core/blob/main/contracts/UniswapV3Pool.sol