当前位置:首页>学习笔记>Web3学习笔记:Day 3-智能合约进阶与 ERC-20 代币(理论部分)

Web3学习笔记:Day 3-智能合约进阶与 ERC-20 代币(理论部分)

  • 2026-02-26 00:32:33
Web3学习笔记:Day 3-智能合约进阶与 ERC-20 代币(理论部分)

前几天我分享了web3学习笔记的Day 1和Day2,原本以为没有人感兴趣,我就暂停了相关内容的分享。结果今天看到有朋友在学习笔记下留言了,看来还是有感兴趣的伙伴,所以决定继续分享学习笔记。由于Day 3的内容比较多,我会分2次分享,今天主要分享一下Day 3的理论部分。

📋 学习目标

  • • 掌握 Solidity 的继承机制
  • • 学习错误处理的最佳实践
  • • 深入理解 ERC-20 代币标准
  • • 使用 OpenZeppelin 库开发代币
  • • 实现一个完整的 ERC-20 代币合约
  • • 部署代币到测试网并在钱包中查看

📚 理论部分 (35分钟)

3.1 合约进阶概念

继承 (Inheritance)

什么是继承?

继承允许一个合约从另一个合约继承属性和方法,类似于面向对象编程。

继承的优点:

  • • 代码复用
  • • 逻辑分离
  • • 模块化设计
  • • 易于维护

基本继承示例:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

// 父合约
contract Ownable {
    address public owner;

    constructor() {
        owner = msg.sender;
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "Not owner");
        _;
    }

    function transferOwnership(address newOwner) public onlyOwner {
        require(newOwner != address(0), "Invalid address");
        owner = newOwner;
    }
}

// 子合约继承父合约
contract MyContract is Ownable {
    uint256 private value;

    function setValue(uint256 _value) public onlyOwner {
        value = _value;
    }

    function getValue() public view returns (uint256) {
        return value;
    }
}

多重继承:

contract A {
    function funcA() public pure returns (string memory) {
        return "A";
    }
}

contract B {
    function funcB() public pure returns (string memory) {
        return "B";
    }
}

contract C is A, B {
    function getAll() public pure returns (string memory, string memory) {
        return (funcA(), funcB());
    }
}
//思考:如果这A和B都有一个同名函数:funcX(),如何在C里面调用?

继承顺序与 C3 线性化:

Solidity 使用 C3 线性化算法确定继承顺序。基本原则是:"更派生"的合约应该放在前面

contract A { function a() public {} }
contract B is A { function b() public {} }
contract C is A { function c() public {} }

// 菱形继承:两种写法都合法
contract D is B, C {}  // 线性化: D → B → C → A
contract E is C, B {}  // 线性化: E → C → B → A

// 真正的错误示例:基类不能出现在派生类之后
// contract F is A, B {}  // ❌ 错误:B 继承自 A,B 应该在 A 前面

使用 super 时的调用顺序:

contract D is B, C {
    function callSuper() public {
        super.a();  // 按照 C3 线性化顺序调用:先 C.a(),再 B.a(),最后 A.a()
    }
}

多重继承同名函数的处理:

当多个父合约有同名函数时,必须在子合约中重写并显式指定调用哪个版本:

contract A {
    function funcX() public pure virtual returns (string memory) {
        return "A";
    }
}

contract B {
    function funcX() public pure virtual returns (string memory) {
        return "B";
    }
}

contract C is A, B {
    // 必须重写,指定使用哪个父合约的实现
    function funcX() public pure override(A, B) returns (string memory) {
        return A.funcX();  // 选择 A 的实现
        // 或 return B.funcX();  // 选择 B 的实现
        // 或 return string.concat(A.funcX(), B.funcX());  // 组合两者
    }
}

错误处理

Solidity 的三种错误处理方式:

函数
用途
优点
缺点
require
验证输入和外部条件
简单直观
Gas 成本较高
revert
主动回滚交易
可配合自定义错误
较少使用
assert
验证内部不变量
用于调试
不应在生产环境使用

1. require - 验证条件

function withdraw(uint256 amount) public {
    require(amount > 0, "Amount must be greater than 0");
    require(balances[msg.sender] >= amount, "Insufficient balance");

    balances[msg.sender] -= amount;
    payable(msg.sender).transfer(amount);
}

2. revert - 主动回滚

function withdraw(uint256 amount) public {
    if (amount > balances[msg.sender]) {
        revert("Insufficient balance");
    }
    // 或者使用自定义错误
    revert InsufficientBalance(balances[msg.sender], amount);
}

// 自定义错误(Solidity 0.8.4+)
error InsufficientBalance(uint256 available, uint256 required);

3. assert - 验证内部不变量

function transfer(address to, uint256 amount) public {
    uint256 oldBalance = balances[msg.sender];
    balances[msg.sender] -= amount;
    balances[to] += amount;

    // 断言总余额不变(不应该失败)
    assert(balances[msg.sender] + balances[to] == oldBalance + balances[to] - amount);
}

自定义错误的优势:

// ❌ 使用字符串
require(balances[msg.sender] >= amount, "Insufficient balance");
// Gas 成本: ~243 gas

// ✅ 使用自定义错误
error InsufficientBalance(uint256 available, uint256 required);
if (balances[msg.sender] < amount) {
    revert InsufficientBalance(balances[msg.sender], amount);
}
// Gas 成本: ~91 gas(节省 ~60%)

修饰符 (Modifiers)

什么是修饰符?

修饰符用于修改函数的行为,通常用于访问控制和前置条件检查。

修饰符的工作原理:

modifier onlyOwner() {
    require(msg.sender == owner, "Not owner");
    _;  // 函数体插入的位置
}

function sensitiveFunction() public onlyOwner {
    // 函数代码
}
// 编译后等价于:
function sensitiveFunction() public {
    require(msg.sender == owner, "Not owner");
    // 函数代码
}

带参数的修饰符:

modifier validAddress(address _addr) {
    require(_addr != address(0), "Invalid address");
    _;
}

function transfer(address _to, uint256 _amount) public validAddress(_to) {
    // 函数代码
}

多个修饰符:

function importantFunction() public onlyOwner validAddress(msg.sender) {
    // 先执行 onlyOwner,再执行 validAddress
}

3.2 ERC-20 代币标准

什么是 ERC-20?

ERC-20 是以太坊上同质化代币的标准,定义了代币必须实现的接口。

ERC-20 的特点:

  • • 同质化:每个代币都是相同的,可以互换
  • • 可分割:代币可以分割成小数
  • • 标准化:所有 ERC-20 代币遵循相同的接口
  • • 兼容性:所有 DeFi 协议都支持 ERC-20

ERC-20 vs 其他代币标准:

特性
ERC-20
ERC-721
ERC-1155
代币性质
同质化
非同质化
多代币
可分割
可互换
部分
批量操作
典型用途
货币、积分
NFT
游戏、收藏品

ERC-20 标准接口

interface IERC20 {
    // ====== 基本信息函数 ======
    /**
     * @dev 返回代币名称
     */
    function name() external view returns (string memory);

    /**
     * @dev 返回代币符号
     */
    function symbol() external view returns (string memory);

    /**
     * @dev 返回代币精度(通常为 18)
     */
    function decimals() external view returns (uint8);

    /**
     * @dev 返回总供应量
     */
    function totalSupply() external view returns (uint256);

    // ====== 余额查询 ======
    /**
     * @dev 查询账户余额
     * @param account 账户地址
     */
    function balanceOf(address account) external view returns (uint256);

    // ====== 转账功能 ======
    /**
     * @dev 转账代币
     * @param to 接收地址
     * @param amount 转账数量
     * @return bool 是否成功
     */
    function transfer(address to, uint256 amount) external returns (bool);

    // ====== 授权机制 ======
    /**
     * @dev 授权spender使用代币
     * @param spender 被授权地址
     * @param amount 授权数量
     * @return bool 是否成功
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev 查询授权额度
     * @param owner 所有者地址
     * @param spender 被授权地址
     * @return uint256 授权数量
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev 使用授权额度转账
     * @param from 发送地址
     * @param to 接收地址
     * @param amount 转账数量
     * @return bool 是否成功
     */
    function transferFrom(address from, address to, uint256 amount) external returns (bool);

    // ====== 事件 ======
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

授权机制详解

为什么需要授权?

授权机制允许第三方(如 DEX、借贷协议)使用你的代币,而无需你手动转账。

授权流程:

1. 用户授权给 Uniswap
   approve(uniswapAddress, 100)

   状态:
   - 用户余额: 1000
   - 授权额度: 用户 → Uniswap: 100

2. Uniswap 使用授权额度
   transferFrom(user, pool, 50)

   状态:
   - 用户余额: 950
   - 授权额度: 用户 → Uniswap: 50
   - Pool 余额: 50

授权机制图解:

┌──────────┐    approve(100)    ┌──────────┐
│  Owner   │ ──────────────────>│ Spender  │
│          │                     │          │
│ balance: │   allowance:       │          │
│  1000    │   Owner→Spender:100│          │
└──────────┘                     └──────────┘
      │                                │
      │  transferFrom(Owner, Recv, 50) │
      │<───────────────────────────────│
      ▼                                ▼
┌──────────┐                     ┌──────────┐
│  Owner   │                     │ Receiver │
│ balance: │                     │ balance: │
│   950    │                     │    50    │
└──────────┘                     └──────────┘

无限授权的风险:

// ❌ 危险:无限授权
approve(uniswapAddress, 2^256 - 1);

// ✅ 安全:仅授权需要的数量
approve(uniswapAddress, 100);

代币精度 (Decimals)

什么是精度?

精度决定了代币可以分割的最小单位。

// 示例:精度为 18
1 Token = 1 * 10^18 = 1000000000000000000 wei
0.5 Token = 0.5 * 10^18 = 500000000000000000 wei

常见精度:

代币
精度
说明
ETH
18
以太坊标准
USDC
6
稳定币常用
WBTC
8
与比特币相同

计算实际数量:

function mint(uint256 amount) public {
    // amount 已经考虑了精度
    _mint(msg.sender, amount * 10 ** decimals());
}

function getBalanceInToken(address account) public view returns (uint256) {
    // 转换为 Token 单位
    return balanceOf(account) / 10 ** decimals();
}

3.3 安全最佳实践

常见安全漏洞

1. 重入攻击 (Reentrancy Attack)

什么是重入攻击?

攻击者在合约完成状态更新前,通过回调函数再次调用合约,导致状态被多次修改。

重入攻击示例:

// ❌ 容易遭受重入攻击
function withdraw(uint256 amount) public {
    require(balances[msg.sender] >= amount);

    (bool success, ) = msg.sender.call{value: amount}("");  // 先调用外部
    require(success);

    balances[msg.sender] -= amount;  // 后修改状态 - 危险!
}

// 攻击流程:
// 1. 攻击者调用 withdraw(100)
// 2. 合约发送 100 ETH 到攻击者
// 3. 攻击者的 receive 函数再次调用 withdraw(100)
// 4. 合约再次发送 100 ETH(余额还未更新)
// 5. 重复直到合约耗尽

防护方法 - Checks-Effects-Interactions 模式:

// ✅ 正确示范
function withdraw(uint256 amount) public {
    require(balances[msg.sender] >= amount, "Insufficient");  // 1. Checks

    balances[msg.sender] -= amount;  // 2. Effects(先更新状态)

    (bool success, ) = msg.sender.call{value: amount}("");  // 3. Interactions
    require(success, "Transfer failed");
}

// 或使用 ReentrancyGuard 修饰符
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";

function withdraw(uint256 amount) public nonReentrant {
    require(balances[msg.sender] >= amount);
    balances[msg.sender] -= amount;
    payable(msg.sender).transfer(amount);
}

2. 整数溢出 (Integer Overflow)

什么是整数溢出?

当数值超过类型的最大值时,会回绕到最小值。

// Solidity 0.8.0 之前
uint8 a = 255;
a + 1;  // 结果为 0(溢出)

uint8 b = 0;
b - 1;  // 结果为 255(下溢)

防护方法:

// Solidity 0.8.0+ 自动检查溢出
uint8 a = 255;
a + 1;  // 自动回滚交易

// 使用 SafeMath(旧版本)
import "@openzeppelin/contracts/math/SafeMath.sol";

using SafeMath for uint256;

function add(uint256 a, uint256 b) public pure returns (uint256) {
    return a.add(b);  // 自动检查溢出
}

3. 访问控制缺失

问题:

// ❌ 危险:任何人都可以调用
function mint(uint256 amount) public {
    _mint(msg.sender, amount);
}

解决方法:

// ✅ 使用修饰符限制访问
function mint(uint256 amount) public onlyOwner {
    _mint(msg.sender, amount);
}

4. 未检查的返回值

问题:

// ❌ 危险:不检查转账是否成功
function withdraw() public {
    payable(msg.sender).transfer(address(this).balance);
}

解决方法:

// ✅ 检查返回值
function withdraw() public {
    (bool success, ) = payable(msg.sender).call{value: address(this).balance}("");
    require(success, "Transfer failed");
}

安全检查清单

  • • 使用 OpenZeppelin 的安全合约库
  • • 遵循 Checks-Effects-Interactions 模式
  • • 所有敏感函数都有访问控制
  • • 所有外部调用都检查返回值
  • • 使用 nonReentrant 修饰符防止重入
  • • 限制循环次数防止 DoS 攻击
  • • 使用 msg.sender 而不是 tx.origin 进行身份验证
  • • 避免使用 delegatecall 除非必要
  • • 主网部署前进行专业审计
  • 今天就分享这么多,接下来是实操部分,内容比较多,我会下次分享。

📌 关于“令狐冲AI”
聚焦AI与SaaS出海,分享AI时代如何打造超级个体,探索更聪明的工作与生活方式。

喜欢这篇文章? 请点赞👍、在看👀、转发📤给更多朋友!

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-26 10:17:18 HTTP/2.0 GET : https://67808.cn/a/470452.html
  2. 运行时间 : 0.121380s [ 吞吐率:8.24req/s ] 内存消耗:4,712.88kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=291ece73a5e57d654e5eadfc9fbb87d9
  1. /yingpanguazai/ssd/ssd1/www/no.67808.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/no.67808.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/no.67808.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/no.67808.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/no.67808.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/no.67808.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/no.67808.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/no.67808.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/no.67808.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/no.67808.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/no.67808.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/no.67808.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/no.67808.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/no.67808.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/no.67808.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/no.67808.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/no.67808.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/no.67808.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/no.67808.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/no.67808.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/no.67808.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/no.67808.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/no.67808.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/no.67808.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/no.67808.cn/runtime/temp/6df755f970a38e704c5414acbc6e8bcd.php ( 12.06 KB )
  140. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000572s ] mysql:host=127.0.0.1;port=3306;dbname=no_67808;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000661s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000259s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000269s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000453s ]
  6. SELECT * FROM `set` [ RunTime:0.000196s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000503s ]
  8. SELECT * FROM `article` WHERE `id` = 470452 LIMIT 1 [ RunTime:0.000413s ]
  9. UPDATE `article` SET `lasttime` = 1772072238 WHERE `id` = 470452 [ RunTime:0.004213s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 65 LIMIT 1 [ RunTime:0.000239s ]
  11. SELECT * FROM `article` WHERE `id` < 470452 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.015165s ]
  12. SELECT * FROM `article` WHERE `id` > 470452 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000402s ]
  13. SELECT * FROM `article` WHERE `id` < 470452 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.003395s ]
  14. SELECT * FROM `article` WHERE `id` < 470452 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.004314s ]
  15. SELECT * FROM `article` WHERE `id` < 470452 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.017367s ]
0.122989s