服务端3月1日 23:09
Solidity 中如何实现多签钱包(Multi-Sig Wallet)?多签钱包(Multi-Signature Wallet)是一种需要多个私钥共同授权才能执行交易的智能合约。比如 3/5 多签表示 5 个持有者中至少 3 人确认才能转账,任何单点私钥泄露都无法独自挪走资金。
这类问题在 Solidity 面试中出现频率很高,考察的是你对合约安全设计、状态管理和外部调用的综合理解。
### 1. 核心数据结构设计
多签钱包的状态管理围绕三个核心映射展开:
```solidity
contract MultiSigWallet {
address[] public owners;
mapping(address => bool) pu...服务端3月1日 22:56
Solidity 中 Library 和 Contract 有什么区别?Library(库)和 Contract(合约)是 Solidity 中两种不同的代码组织方式。核心区别在于:Library 不能有状态变量、不能接收 ETH、不能被继承,通过 DELEGATECALL 在调用合约的上下文中执行;Contract 则是完整的独立实体,拥有自己的存储和生命周期。面试中常围绕调用机制、Gas 优化和使用场景展开追问。
## Library 和 Contract 的核心区别
| 特性 | Library | Contract |
|------|---------|----------|
| 状态变量 | 不能拥有 | 可以拥有 |
| ETH 接收 | ...服务端3月1日 22:39
Solidity 智能合约如何进行 Gas 优化?有哪些常见的优化技巧?Gas 优化是 Solidity 开发中最核心的实战能力之一,直接影响合约部署成本和用户交互费用。下面从存储、计算、函数、错误处理等维度系统梳理常见优化技巧,每一条都配有对比示例。
## 存储优化
Storage 操作是最昂贵的 EVM 指令,写一次 SSTORE 至少消耗 20,000 Gas,优化存储是降本的第一优先级。
### 变量打包:让一个 slot 装更多数据
Solidity 中每个 storage slot 为 32 字节,多个小类型变量可以打包进同一个 slot:
```solidity
// 未优化:占用 3 个 slot
struct Bad {
...服务端3月1日 22:32
Solidity 中的继承机制是如何工作的?抽象合约和接口有什么区别?## Solidity 的继承机制是怎样的?
Solidity 使用 `is` 关键字实现单继承和多重继承。子合约可以继承父合约的状态变量和函数,并通过 `virtual`/`override` 关键字实现函数重写。多重继承时,Solidity 采用 C3 线性化算法确定调用顺序——继承列表中越靠右的基类优先级越高,`super` 会沿着线性化顺序向上调用。
```solidity
contract Animal {
function speak() public pure virtual returns (string memory) {
return "S...服务端3月1日 22:34
Solidity 中的内联汇编(Inline Assembly)如何使用?有哪些注意事项?Solidity 内联汇编允许开发者在合约中直接编写 Yul(EVM 汇编)代码,绕过编译器的高级抽象,获得对 EVM 的细粒度控制。它主要用于 Gas 优化、底层操作和实现 Solidity 本身无法完成的功能,但也带来了安全隐患——编译器的溢出检查、类型安全等保护机制在汇编块内全部失效。
## 什么时候需要内联汇编?
三个典型场景:
1. **Gas 敏感路径**:循环内的频繁操作、批量存储读写,汇编可减少冗余操作码
2. **Solidity 语法盲区**:读取 `calldata` 的特定偏移、访问预编译合约、手动控制内存布局
3. **库函数封装**:如 ECDSA 签名...服务端3月1日 22:01
如何优化 Zustand 的性能,减少不必要的重渲染?## 核心答案
Zustand 减少不必要重渲染的关键在于**精确订阅**——让组件只在自己关心的状态变化时才重新渲染。具体手段有三层:
1. **选择器订阅**:用 `useStore(state => state.xxx)` 替代 `useStore()` 全量订阅
2. **浅比较防抖**:用 `useShallow` 处理多值订阅,避免对象引用变化导致的误触发
3. **自定义等式函数**:用 `createWithEqualityFn` 或第二个参数实现精确的变更判断
## 为什么选择器能避免重渲染
Zustand 内部基于发布-订阅模式工作。当 `set()` 被调用...服务端3月1日 21:06
什么是跨链技术?详解原子交换、中继链和桥接方案的工作原理## 跨链技术背景
区块链网络各自运行独立的共识机制和状态机,不同链之间无法直接读取对方的数据或转移资产,这就是"区块链孤岛"问题。比如以太坊上的 DeFi 协议无法直接使用比特币的流动性,Solana 上的 NFT 也无法在以太坊生态中交易。
跨链技术的目标就是打通这些孤岛——让不同区块链之间安全地交换资产、传递消息、执行跨链合约调用。根据 Electric Capital 的开发者报告,跨链互操作性已成为 2024-2026 年区块链基础设施投入最多的方向之一。
### 跨链技术分类
按链的异构程度,跨链方案分为两大类:
- **同构跨链**:连接相同或相似架构的区块链,如...服务端3月1日 12:21
Babel 配置 TypeScript 和 React 的完整方案是什么?## Babel 如何编译 TypeScript 和 JSX?
Babel 的编译流程是:解析(Parse)→ 转换(Transform)→ 生成(Generate)。`@babel/preset-typescript` 的工作方式是**直接剥离类型注解**,而非像 `tsc` 那样做类型检查后编译。`@babel/preset-react` 负责将 JSX 转换为 `React.createElement` 调用(React 17+ 使用新的 `jsx` 运行时自动导入)。
这意味着 Babel 只负责语法转译,**不做类型校验**。项目中需要额外运行 `tsc --noEmit`...服务端2月24日 22:22
Cookie 和 LocalStorage 有什么区别?什么场景该用哪个?## 核心答案
Cookie 和 LocalStorage 都是浏览器的客户端存储机制,核心区别在于:Cookie 每次请求自动携带到服务器,容量约 4KB,适合存服务端需要的数据(如会话 ID);LocalStorage 不参与网络请求,容量 5-10MB,适合纯客户端的持久化数据(如用户偏好)。
两者选择的关键判断标准是:**数据是否需要服务端读取**。需要则 Cookie,不需要则 LocalStorage。
## 容量与生命周期
| 维度 | Cookie | LocalStorage |
|------|--------|-------------|
| 容量 | 单条...服务端3月1日 22:00
如何使用 Zustand 创建和管理全局状态?## 核心答案
Zustand 通过 `create` 函数创建 store,将状态和操作定义在同一对象中,组件通过 hook 选择性订阅所需状态片段,从而实现轻量级的全局状态管理。与 Redux 相比,Zustand 无需 Provider 包裹、无需 reducer/action 分离,store 可在组件外直接调用 `getState()`/`setState()`,且内置 selector 机制避免不必要的重渲染。
## 创建 Store
```typescript
import { create } from 'zustand';
interface CounterSt...