服务端3月1日 22:53
Solidity 智能合约有哪些常见安全漏洞?如何防止?最致命的 5 类漏洞:重入攻击(Reentrancy)——用 `Checks-Effects-Interactions` 模式或 `ReentrancyGuard`;整数溢出——Solidity 0.8+ 内置检查,0.7 及以下用 SafeMath;权限控制缺失——关键函数加 `onlyOwner` / `onlyRole`,用 OpenZeppelin 的 `AccessControl`;闪电贷操纵价格——用 TWAP 而非现货价格,加交易延迟;前端运行(MEV)——用 commit-reveal 方案或私有内存池。核心原则:所有外部调用都是不安全的,所有用户输入都是恶意的。
##...服务端3月1日 23:14
Solidity 中如何处理时间锁(Timelock)机制?时间锁就是给合约操作加一个延迟:提案创建后必须等待指定时间(如 48 小时)才能执行,期间可以取消。核心实现:`mapping(bytes32 => uint256) public queuedTimestamp`,`queue()` 记录时间戳,`execute()` 检查 `block.timestamp >= queuedTimestamp[id] + delay`。OpenZeppelin 的 `TimelockController` 是生产级实现,支持多角色( proposer / executor / admin)和最小延迟保障。
## 追问
### Timelock 和...服务端3月1日 23:27
WebGL 缓冲区(Buffer)是什么?VBO 和 VAO 有什么区别?WebGL 缓冲区就是 GPU 显存中的一块区域,用来存顶点数据(位置、颜色、法线、UV 等)。VBO(Vertex Buffer Object)是存数据的容器,VAO(Vertex Array Object)是记录"哪个 VBO 绑到哪个 attribute、偏移量多少、步长多少"的配置快照。WebGL 1 没有 VAO(需扩展 `OES_vertex_array_object`),WebGL 2 原生支持。有了 VAO,切换绘制对象只需 `gl.bindVertexArray(vao)` 一行,不用重复设置一堆 `vertexAttribPointer`。
## 追问
### V...服务端3月2日 00:13
WebGL 雾效(Fog)是如何实现的?WebGL 雾效的本质就是根据片段到相机的距离,在物体颜色和雾颜色之间做插值:`finalColor = mix(fogColor, objectColor, fogFactor)`。三种计算 fogFactor 的方式:线性雾 `clamp((end - dist) / (end - start), 0, 1)` 需要指定起止距离;指数雾 `exp(-density * dist)` 更自然,一个 density 参数搞定;指数平方雾 `exp(-(density*dist)²)` 过渡更柔和。深度值从视图空间的 `-viewPos.z` 或 `length(viewPos.xyz)`...服务端3月2日 00:18
WebGL Cubemap 立方体贴图是什么?有哪些应用场景?Cubemap 是 6 张正方形图片拼成的纹理盒子,用 3D 方向向量采样——GPU 根据向量哪个分量绝对值最大决定落在哪个面上,再换算成 2D 坐标取色。核心用途:天空盒、环境反射(`reflect`)、环境折射(`refract`)、菲涅尔效果。6 张图必须同尺寸且为 2 的幂次方,采样前务必设 `CLAMP_TO_EDGE` 防接缝。
## 追问
### 天空盒为什么必须去掉视图矩阵的平移分量?
天空盒模拟无限远的环境,如果跟着相机平移,走两步就穿帮了。只保留旋转:`mat4 rotOnly = mat4(mat3(viewMatrix))`。
### reflect 和 r...服务端2月25日 23:40
Canvas 动画怎么实现?如何优化性能?Canvas 动画本质是逐帧重绘:每帧调用 `requestAnimationFrame` 回调,在其中更新状态、清除画布、重绘所有元素,浏览器按刷新率(通常 60fps)将帧提交到屏幕。性能优化的核心思路是减少每帧的计算量和绘制量:用 `OffscreenCanvas` + Worker 将计算和预渲染移到后台线程;用对象池复用粒子避免 GC 压力;用脏矩形只重绘变化区域;分层 Canvas 将静态背景和动态前景分离;批量绘制减少状态切换。
## 追问
- `requestAnimationFrame` 和 `setInterval` 做动画有什么本质区别?
- `Offscree...服务端2月25日 23:34
Canvas 元素是什么?和 SVG 有什么区别?Canvas 是 HTML5 的 `<canvas>` 元素,提供一块可编程的像素级绘图表面。通过 JS 获取 2D 渲染上下文(`getContext('2d')`)或 WebGL 上下文来绘制图形。核心用途:数据可视化、2D 游戏、图像处理、动画、视频特效。与 SVG 的关键区别:Canvas 是栅格模式(像素绘制,适合高频更新和大量对象),SVG 是矢量模式(DOM 节点,适合交互和缩放)。Canvas 不保留绘制对象,每帧是完整重绘。
## 追问
- Canvas 2D 和 WebGL 上下文有什么区别?什么场景需要用 WebGL?
- Canvas 重绘时旧内容去哪了?为什...服务端2月25日 23:36
Canvas 路径绘制和图形变换怎么用?路径绘制分三步:定义路径、闭合路径、渲染路径。先用 `beginPath()` 清除旧路径,`moveTo()` 定起点,再用 `lineTo()`/`arc()`/`bezierCurveTo()` 等绘制子路径,最后 `closePath()` 闭合并用 `fill()` 或 `stroke()` 渲染。图形变换通过坐标系变换实现:`translate(x,y)` 平移原点、`rotate(angle)` 绕原点旋转、`scale(sx,sy)` 缩放,`transform(a,b,c,d,e,f)` 直接设置变换矩阵。变换是累积的,用 `save()/restore()` 管理状态...服务端2月26日 23:53
Nuxt.js 的路由系统和 Vue Router 有什么不同?核心区别:Vue Router 需要手动在 router.ts 中声明路由表(path/component 映射);Nuxt 基于文件系统自动生成路由——pages/ 目录的文件路径即路由路径。例如 pages/user/[id].vue 自动映射为 /user/:id,pages/user/index.vue 映射为 /user。Nuxt 还内置了 layouts/ 布局系统、middleware/ 路由中间件(替代 Vue Router 的 beforeEnter/全局守卫),以及 NuxtPage 和 NuxtLayout 组件处理嵌套路由渲染。底层仍使用 Vue Router,但...服务端2月27日 21:12
Nuxt.js 中如何管理状态?useState 和 Pinia 怎么选?Nuxt 3 推荐两种方案:内置的 `useState()` composable 和 Pinia(通过 `@pinia/nuxt` 模块集成)。`useState()` 适合跨组件共享简单响应式状态,天然 SSR 安全——服务端和客户端状态自动同步,无需额外处理水合。Pinia 适合复杂状态管理,支持 actions、getters、插件生态,且同样对 SSR 友好。Vuex 是 Nuxt 2 时代的默认方案,Nuxt 3 已不再内置。
## 追问
- `useState()` 和 `ref()` 在 SSR 场景下有什么区别?为什么不能用 `ref()` 共享状态?
- Pini...