NodeJS全栈WEB3面试题——P6安全与最佳实践
🔐 6.1 如何防范重放攻击、私钥泄露、钓鱼签名?
✅ 重放攻击(Replay Attack)防范:
-
引入 nonce:每次登录或交易签名都携带唯一 nonce;
-
链 ID 检查:在签名中加入特定链 ID,防止跨链重放;
-
使用 EIP-712 签名结构:结构化签名防止签名滥用。
✅ 私钥泄露防范:
-
从不把私钥写入前端代码或硬盘明文保存;
-
后端钱包使用冷钱包或 HSM 服务(如 AWS KMS, Fireblocks);
-
使用环境变量加密存储助记词或私钥,部署中使用
.env + vault
; -
限制私钥操作权限,冷热钱包分离;
✅ 钓鱼签名防范:
-
签名前显示明确信息说明(如“登录授权而非转账”);
-
使用 EIP-712 结构化数据签名,避免用户签不明数据;
-
前端签名提示加上网站来源(如
yourapp.com
)+ 描述;
⚡ 6.2 什么是“前置运行攻击”(Front-running)?怎么防御?
✅ 定义:
Front-running 是攻击者监听 mempool,抢在用户交易之前提交相同或对其有利的交易(如抢先购买 NFT、调整价格、抢矿);
🛡️ 防御方式:
-
使用 commit-reveal 策略:
-
用户先提交加密数据(commit),后提交明文(reveal);
-
-
延迟执行 + 随机性机制:
-
引入链上随机数,避免固定执行顺序;
-
-
Flashbots:
-
将交易发送至 Flashbots 私有池,避免泄露到公共 mempool;
-
-
签名授权后端执行:
-
用户授权后由后端发送交易,缩短暴露时间窗口;
-
🎁 6.3 如果要做代币空投(Airdrop),你如何设计安全的分发策略?
✅ 目标:确保代币安全发放、避免滥领、节省 Gas。
📌 安全空投策略设计:
-
Merkle Tree 空投(常用):
-
构造用户地址+数量的 Merkle Root,存入合约;
-
用户自行调用
claim()
提供 Merkle proof; -
✅ 优点:一次部署即可支持大规模空投,节省 Gas;
-
✅ 防止重复领取,通过记录
claimed[address] = true
;
-
-
签名式空投:
-
后端为每个地址签名分发信息;
-
用户提交签名至合约,合约验证签名;
-
适合灵活分发、动态设置领取者;
-
-
Batch Transfer + 权限限制:
-
批量发送空投(
transferBatch()
); -
控制可操作账户,避免私钥被盗后滥发;
-
✅ 安全建议:
-
空投逻辑使用开源库(如 OpenZeppelin MerkleDistributor);
-
空投合约部署后不可修改 Merkle Root;
-
添加空投截止时间、防多次领取、防重入等措施;
🔁 6.4 合约升级有几种方式?各自的优缺点?
✅ 1. 代理合约(Proxy Pattern):
-
实现方式:使用
delegatecall
将调用转发至逻辑合约; -
典型模式:
-
Transparent Proxy(OpenZeppelin)
-
UUPS Proxy(更轻量,推荐)
-
模式 | 优点 | 缺点 |
---|---|---|
Transparent | 稳定,OpenZeppelin支持 | 存储布局要求严格,结构复杂 |
UUPS | 更节省 Gas,可自定义升级逻辑 | 升级函数自身易被攻击,需审慎授权 |
✅ 2. 数据迁移升级:
-
新部署一个合约,人工迁移数据;
-
✅ 优点:无 delegatecall 安全风险;
-
❌ 缺点:迁移成本高、用户需重新授权;
✅ 3. Eternal Storage 模式:
-
将状态变量独立放在一个固定合约;
-
易维护,但结构复杂、不推荐新项目使用;
🧨 6.5 哪些 Solidity 编码模式容易出安全漏洞?
🚨 常见风险编码模式:
漏洞类型 | 示例代码 / 描述 | 防御方式 |
---|---|---|
重入攻击 | 调用外部合约前修改状态(如提现) | Checks-Effects-Interactions;使用 ReentrancyGuard |
整数溢出/下溢 | uint256 a = b - c(未判断 b > c) | 使用 SafeMath 或启用 Solidity ≥0.8 自动检查 |
无访问控制 | 没有限制 setOwner() | 添加 onlyOwner 或 AccessControl |
调用未初始化合约地址 | 外部合约地址为空调用 | require 地址非 0 且合约存在 |
delegatecall 滥用 | 调用非可信合约逻辑代码 | 限制 delegatecall 使用,仅可信模块 |
Gas limit 不足 | 数组遍历转账 gas 用尽,状态不变 | 加限制、使用 pull 模式而非 push |
tx.origin 验证身份 | require(tx.origin == owner) 易被 phishing | 用 msg.sender 替代 tx.origin |
📌 总结建议:
-
使用 OpenZeppelin 工具、Hardhat 插件审计合约;
-
引入 CI 检查(如
slither
、mythx
); -
所有用户交互都应防御重入、钓鱼、溢出、权限越权;
-
升级合约需严格测试、控制 upgrade 权限;
-
尽量使用 audited 合约库,避免“自己写轮子”;
相关文章:
NodeJS全栈WEB3面试题——P6安全与最佳实践
🔐 6.1 如何防范重放攻击、私钥泄露、钓鱼签名? ✅ 重放攻击(Replay Attack)防范: 引入 nonce:每次登录或交易签名都携带唯一 nonce; 链 ID 检查:在签名中加入特定链 ID࿰…...

「Java教案」算术运算符与表达式
课程目标 1.知识目标 能够区分Java运算符的种类,例如,算术、赋值、关系、逻辑、位运算等。能够区分Java各类运算符的功能和使用场景。能够根据表达式的构成和计算规则,写出正确的表达式。能够根据运算符优先级与结合性ÿ…...
Ubuntu开机黑屏现象的常见解决方案详解
Ubuntu开机黑屏现象的常见解决方案详解 Ubuntu作为一款流行的Linux发行版,因其开源性和灵活性受到广泛欢迎。然而,用户在使用过程中可能会遇到开机黑屏的问题,即系统启动后屏幕完全无显示,仅留下光标闪烁或黑屏界面。这种问题可能…...
黑马程序员C++核心编程笔记--4 类和对象--多态
1.多态的基本概念 多态是C面向对象三大特性之一 多态分为两类 静态多态: 函数重载和运算符重载属于静态多态,复用函数名动态多态: 派生类和虚函数实现运行时多态 静态多态和动态多态区别: -静态多态的函数地址早绑定 - 编译阶段确定函数地址 -动态多…...

论文写作核心要点
不要只读论文里的motivation和method 论文里的图表和统计特征 在论文里找到具有统计意义的东西,那么在语料里也肯定遵循这样的规律,我们就能用机器学习的方法, 我们再用不同方法解决,哪种方法好,就用哪种 实验分析 …...

[java]eclipse中windowbuilder插件在线安装
目录 一、打开eclipse 二、打开插件市场 三、输入windowbuilder,点击install 四、进入安装界面 五、勾选我同意... 重启即可 一、打开eclipse 二、打开插件市场 三、输入windowbuilder,点击install 四、进入安装界面 五、勾选我同意... 重启即可...

Ubuntu20.04服务器开启路由转发让局域网内其他电脑通过该服务器连接外网
要让你的 Ubuntu作为路由器,通过 Wi-Fi 上网,并给连接到 UsbNetwork 的设备提供网络,需要做以下配置: 1. 网络拓扑 [互联网] ← (Wi-Fi, wlo1) → [Ubuntu] ← (USB网络/USB以太网, UsbNetwork) → [设备]Ubuntu: Wi-…...

【Oracle】TCL语言
个人主页:Guiat 归属专栏:Oracle 文章目录 1. TCL概述1.1 什么是TCL?1.2 TCL的核心功能 2. 事务基础概念2.1 事务的ACID特性2.2 事务的生命周期 3. COMMIT语句详解3.1 COMMIT基础语法3.2 自动提交与手动提交3.3 提交性能优化 4. ROLLBACK语句…...

Windows | 总误按Num Lock?修改注册表永久禁用Numlk键使小键盘一直输入数字
先说需修改注册表的位置与键值 路径:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout\ 二进制键:Scancode Map 键值: 00 00 00 00 00 00 00 00 01 00 00 00 00 00 45 00 00 00 00 00 00 00 00 00如下图: …...

2.RV1126-OPENCV Mat理解和AT函数
一.Mat概念 Mat 是整个图像存储的核心也是所有图像处理的最基础的类,Mat 主要存储图像的矩阵类型,包括向量、矩阵、灰度或者彩色图像等等。Mat由两部分组成:矩阵头,矩阵数据。矩阵头是存储图像的长度、宽度、色彩信息等头部信息&a…...
Go 语言 + Word 文档模板:WordZero 引擎如何让企业文档处理效率提升 300%?
前言 在企业级应用开发中,自动化生成Word文档一直是个令人头疼的需求。传统的方案要么依赖于复杂的Office COM组件,要么使用功能有限的第三方库。今天为大家介绍一个纯Go语言实现的Word操作库——WordZero,特别是其强大的模板引擎功能&#…...

unidbg patch 初探 微博deviceId 案例
声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 逆向过程 看了b站迷人瑞信那个由于是…...

循序渐进 Android Binder(一):IPC 基本概念和 AIDL 跨进程通信的简单实例
Binder 给人的第一印象是”捆绑者“,即将两个需要建立关系的事物用某些工具束缚在一起。在 Android 中,Binder 是一种高效的跨进程通信(IPC)机制,它将可以将运行在不同进程中的组件进行绑定,以实现彼此通信…...

网络安全之Web渗透加解密
项目基本使用 准备环境:node.js python chrome npm install chrome-remote-interface pip install playwright playwright install chromium pip install mitmproxy ............... 第一步启动cdp.js。 第二步使用python .\cdp_load.py vue_demo,连…...
Leetcode 3567. Minimum Absolute Difference in Sliding Submatrix
Leetcode 3567. Minimum Absolute Difference in Sliding Submatrix 1. 解题思路2. 代码实现 题目链接:3567. Minimum Absolute Difference in Sliding Submatrix 1. 解题思路 这一题想了一下,没想到啥好的思路,就是暴力直接求解了一下&am…...

【LeetCode 题解】两数之和(C++/Python 双解法):从语法到算法的全面解析
【LeetCode题解】两数之和(C/Python双解法):从语法到算法的全面解析 一、题目描述 题目链接:1. 两数之和 难度:简单 要求:给定一个整数数组 nums 和一个整数目标值 target,在数组中找出两个数…...

【机器学习基础】机器学习入门核心算法:集成学习(Ensemble Learning)
机器学习入门核心算法:集成学习(Ensemble Learning) 1. 算法逻辑核心逻辑: 2. 算法原理与数学推导2.1 Bagging(Bootstrap Aggregating)2.2 Boosting2.3 Stacking 3. 模型评估评估指标基学习器选择策略 4. 应…...

【TMS570LC4357】之相关驱动开发学习记录1
系列文章目录 【TMS570LC4357】之工程创建 【TMS570LC4357】之工程配置修改 【TMS570LC4357】之HALCOGEN使用 【TMS570LC4357】之相关问题及解决 ——————————————————— 前言 记录笔者在第一次使用TMS570过程中对外设驱动的一些学习碎片。 1. RTI 1.1 添…...

RAG入门 - Retriever(1)
文章目录 环境准备知识库加载1. Retriever - embeddings 🗂️1.1 将文档拆分为chunks1.2 词嵌入1.3 构建向量数据库Nearest Neighbor search algorithm (最近邻搜索算法)Distances (距离)点积(Dot Product&…...

pyspark实践
1。pyspark是什么 PySpark 是 Apache Spark 的官方 Python 接口,它使得 Python 开发者能够访问 Spark 的核心功能,如: Spark SQL:用于执行 SQL 查询以及读取数据的库,支持多种数据格式和存储系统。py.qizhen.xyz Data…...
内网怎么映射外网ip? 内网的地址快速映射给外网访问用方法
本文章向大家介绍内网怎么映射外网ip,主要包括如何将内网 IP 端口的网络服务映射到外网使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。内容主要包括路由映射公网IP和无公网IP通过nat123映射…...

【深度学习新浪潮】多模态模型如何处理任意分辨率输入?
多模态模型处理任意分辨率输入的能力主要依赖于架构设计的灵活性和预处理技术的结合。以下是核心方法及技术细节: 一、图像模态的分辨率处理 1. 基于Transformer的可变补丁划分(ViT架构) 补丁化(Patch Embedding): 将图像分割为固定大小的补丁(如1616或3232像素),不…...
ZYNQ移植FreeRTOS和固化和openAMP双核
想象一下:一颗拥有“双脑”的ZYNQ芯片,左脑运行Linux处理复杂网络协议,右脑运行FreeRTOS以微秒级精度控制电机,双脑通过“量子纠缠”般的技术实时对话——这就是OpenAMP框架创造的工程奇迹!今天,我们将揭开这项技术的神秘面纱,带你从零构建一个双核异构的智能系统。 🧠…...

K-匿名模型
K-匿名模型是隐私保护领域的一项基础技术,防止通过链接攻击从公开数据中重新识别特定个体。其核心思想是让每个个体在发布的数据中“隐匿于人群”,确保任意一条记录至少与其他K-1条记录在准标识符(Quasi-Identifiers, QIDs)上不可…...

UE5蓝图暴露变量,在游戏运行时修改变量实时变化、看向目标跟随目标Find Look at Rotation、修改玩家自身弹簧臂
UE5蓝图中暴露变量,类似Unity中public一个变量,在游戏运行时修改变量实时变化 1,添加变量 2,设置变量的值 3,点开小眼睛,此变量显示在编辑器中,可以运行时修改 看向目标跟随目标Find Look at R…...
C语言进阶知识:深入探索编程的奥秘
一、指针:C语言的灵魂 指针是C语言中最核心的概念之一,它为程序员提供了对内存的直接操作能力。指针变量存储的是一个地址,通过这个地址可以访问和修改内存中的数据。 (一)指针的基本操作 指针的声明 指针的声明格式…...
机器视觉2D定位引导一般步骤
机器视觉的2D定位引导是工业自动化中的核心应用,主要用于精确确定目标物体的位置(X, Y坐标)和角度(旋转角度θ),并引导机器人或运动机构进行抓取、装配、对位、检测等操作。其一般步骤可概括如下: 一、系统规划与硬件选型 明确需求: 定位精度要求(多少毫米/像素,多少…...

Python-matplotlib中的Pyplot API和面向对象 API
matplotlib中的Pyplot API和面向对象 API Pyplot API(状态机模式)面向对象 API 详解二者差别核心区别方法命名差异注意事项差别举例 🍅 Pyplot API(状态机模式)和面向对象 API 是两种不同的编程接口.🍅 它们…...

FastAPI安全认证:从密码到令牌的魔法之旅
title: FastAPI安全认证:从密码到令牌的魔法之旅 date: 2025/06/02 13:24:43 updated: 2025/06/02 13:24:43 author: cmdragon excerpt: 在FastAPI中实现OAuth2密码流程的认证机制。通过创建令牌端点,用户可以使用用户名和密码获取JWT访问令牌。代码示例展示了如何使用Cry…...
人工智能时代教师角色的重塑与应对策略研究:从理论到实践的转型
一、引言 1.1 研究背景 近年来,人工智能技术迅猛发展,已经逐渐渗透到社会的各个领域,对人类的生产、生活和学习方式产生了深远影响。作为社会发展的重要组成部分,教育领域也不可避免地受到人工智能的冲击,正经历着前…...