服务端3月1日 20:57
PoW、PoS 和 DPoS 共识机制有什么区别?优缺点各是什么?PoW:算力竞争出块,安全但耗能(BTC 每笔约 1000 kWh)。PoS:持币量决定出块权,节能 99.9% 但有质押中心化风险。DPoS:投票选验证者(如 EOS 21 节点),出块快但去中心化程度低。选型:极致安全选 PoW,效率可扩展选 PoS,高 TPS 选 DPoS。Ethereum 已从 PoW 转为 PoS。
## 追问
### PoS 不是更容易富者愈富吗?
是的,这是核心争议。缓解:设质押上限、slashing 惩罚、流动性质押降低门槛。完全消除不现实,但比 PoW 的矿机垄断门槛低。
### DPoS 为什么被批评不够去中心化?
21 个节点就能控制整条链,...服务端3月1日 20:48
Service Worker 如何实现跨域资源的缓存?Service Worker 可以缓存跨域资源,但有 CORS 限制:fetch 跨域请求默认不发 credentials,响应必须包含 Access-Control-Allow-Origin 头,否则浏览器拦截无法缓存。opaque response(no-cors 模式下)可缓存但无法读取内容,且计入 7 倍缓存配额,最多存活 7 天(Chrome)。CDN 支持 CORS 时务必用 cors 模式。
## 追问
### opaque response 有什么坑?
status 始终为 0,无法读取 body 也不能判断缓存是否有效。占用 7 倍缓存配额,7 天后自动清理。CDN...服务端3月1日 22:01
Zustand 中如何用 TypeScript 确保类型安全?定义 interface StoreState 声明所有状态和 action 类型,create<StoreState>()((set) => ...) 传入泛型。关键:set((state) => ({ count: state.count + 1 })) 这种函数式更新需要泛型才能正确推断 state 类型。Action 也写在 interface 里,类型签名一目了然。
## 追问
### set 的类型怎么写才不报错?
set 接受 Partial<StoreState> | ((state: StoreState) => Partial<StoreState>)。用 imm...服务端3月1日 22:01
Zustand 和 Redux 有什么区别?选哪个?核心区别:Zustand 不需要 Provider 包裹、不需要 reducer/action 模板代码、store 直接用 set 修改。Redux 需要 Provider + createSlice + useDispatch + useSelector 四件套。Zustand 1KB vs Redux+RTK 30KB。选型:新项目/中小团队选 Zustand,已有 Redux 代码库或需要强约束选 Redux。
## 追问
### Zustand 没有 DevTools 吗?
有。import { devtools } from zustand/middleware,用法和 ...服务端3月1日 22:02
React Native 中如何使用 Zustand 管理状态?和 Web 端完全一样——npm install zustand,create((set) => ({ ... })) 创建 store,组件里 useStore(selector) 读取。Zustand 不依赖 DOM API,纯 JS 实现,React Native 直接能用。唯一需要注意的是持久化:Web 用 localStorage,RN 用 mmkv 或 AsyncStorage,配合 zustand/middleware 的 persist 中间件传入不同的 storage adapter。
## 追问
### Zustand 和 Redux 在 RN 中哪个更合适?
Z...服务端3月1日 22:02
Zustand 中如何处理异步操作?Zustand 的 store 就是个普通对象,create 回调里直接写 async 函数即可,不需要 thunk 之类的中间件。写法:在 `create((set, get) => ({ ... }))` 里定义 async action,内部 await 拿到数据后调 `set({ data, loading: false })`。手动管理 loading/error 状态是最常见的方式。如果嫌重复,用 `zustand/middleware` 的 `immer` 简化嵌套更新,或封装一个 `createAsyncAction` 工具函数统一处理 loading/success/e...服务端3月1日 22:27
Solidity 中 view、pure 和 payable 函数修饰符有什么区别?`view` 可读不可写状态变量,`pure` 不可读也不可写,`payable` 允许接收 ETH。无修饰符的函数可读可写。`view` 和 `pure` 不消耗 gas(外部调用时),因为节点可以本地模拟执行而不上链。但 `view`/`pure` 在合约内部被交易调用时,调用者仍需付 gas。`payable` 的唯一作用是让函数能通过 `msg.value` 收到 ETH,非 payable 函数收到 ETH 会自动 revert。
## 追问
### view 函数真的不花 gas 吗?
外部调用(`call` / `eth_call`)不花 gas,因为是只读模拟。但如果...服务端3月1日 22:36
Solidity 中 delegatecall 和 call 有什么区别?代理合约怎么实现?`call` 在被调用合约的上下文执行,`msg.sender` 是调用者,存储读写被调用合约的 storage。`delegatecall` 在调用者的上下文执行,`msg.sender` 保持原始调用者不变,存储读写调用者的 storage——代码是别人的,存储是自己的。代理合约就是靠 `delegatecall` 实现的:代理合约存数据,逻辑合约存代码,`fallback` 函数 `delegatecall` 到逻辑合约,逻辑合约操作的是代理的 storage。
## 追问
### 透明代理和 UUPS 有什么区别?
透明代理(Transparent Proxy):代理合约的 ...服务端3月1日 22:47
Solidity 中如何安全地生成随机数?Solidity 无法原生生成真随机数——`block.timestamp`、`block.difficulty`、`blockhash` 都可被矿工操纵,永远不要用于决定资金分配。安全方案分三类:Chainlink VRF(链上验证的链下随机数,生产首选)、commit-reveal(双方各提交哈希再揭示,适合两方博弈)、Randao/Drand(去中心化随机数网络,多节点协作生成)。Chainlink VRF 流程:请求时传 `seed` → Chainlink 链下生成随机数 + 证明 → 回调函数中验证证明后使用随机数,链上可验证不可篡改。
## 追问
### blockha...服务端3月1日 22:50
Solidity 中 ECDSA 签名验证的原理是什么?如何实现?ECDSA 签名验证就是用私钥签名、用公钥验证,链下签名链上验证。Solidity 用 `ecrecover(hash, v, r, s)` 从签名恢复出签名者地址,再对比是否为预期地址。标准流程:`bytes32 hash = keccak256(abi.encodePacked(...))` → 用 EIP-712 结构化哈希 → 链下签名得 (r, s, v) → 链上 `ecrecover` 恢复地址。OpenZeppelin 的 `ECDSA` 库封装了边界检查和 malleability 防护。
## 追问
### EIP-712 为什么比普通 keccak256 签名好...