第一周·总结二:业务逻辑与权限/资金安全

  • 涵盖课次

    • lesson4:拍卖逻辑与时间控制(参考:day04-AuctionHouse.sol
    • lesson5:所有权与访问控制(参考:day05-AdminOnly.sol
    • lesson6:ETH 存取与账户(参考:day06-EtherPiggyBank.sol
    • lesson7:好友记账与转账方式(参考:day07-SimpleIOU.sol
  • 核心知识点

    • 流程控制与时间:用 require 守卫业务前置条件;block.timestamp 控制拍卖起止。
    • 权限模型:owner 模式与 modifier 封装访问控制,分离“管理动作”和“普通用户动作”。
    • ETH 流转:payablemsg.value、余额记账;transfer/call 的行为差异与错误处理。
    • 账本建模:多重映射记录债务关系,余额扣减与清偿的原子性。
  • 代码要点

    • 拍卖行:维护最高出价者与金额,时间结束后揭示结果。
      • day04-AuctionHouse.solauctionEndTime + require 保证竞拍窗口;highestBidder/highestBid 实时更新(本实现为逻辑建模,未涉及真实 ETH)。
    • 管理员合约:集中授权与额度,支持转移所有权。
      • day05-AdminOnly.solonlyOwner 统一权限;approveWithdrawal + withdrawTreasure 控制提取上限与一次性领取(本实现以数值抽象宝藏,并非真实 ETH)。
    • 存钱罐:成员注册、存取款与 ETH 存入。
      • day06-EtherPiggyBank.solonlyRegisteredMember 保护账户操作;depositAmountEther() 接收真实 ETH;建议为关键变更添加事件日志。
    • IOU 记账:好友白名单、钱包余额、债务登记与偿还。
      • day07-SimpleIOU.soldebts[debtor][creditor] 建模应付账;提供 transfercall 两种转账实现,以及 withdraw
  • 安全与工程化要点

    • Checks-Effects-Interactions:先校验、再更新状态、最后外部交互;在 withdraw 采用先减后转更安全。
    • transfer vs calltransfer 固定 2300 gas 可能在现代合约失效;call 需检查返回值并考虑重入保护。
    • 时间与终止:block.timestamp 可被矿工微调,适合宽窗口控制;关键金融逻辑可引入“缓冲/延迟”。
    • 权限扩展:为 owner 转移提供函数并校验非零地址;为关键操作增加事件,便于前端与审计。
  • 设计建议与可选优化

    • 统一“内部账本余额”和“真实 ETH”语义,避免混用导致双重记账风险(例如在 SimpleIOU 中既向对方地址发送 ETH 又同时增加其内部余额,可能引起重复提取的业务风险;可将内部转账与链上转账两种模式区分开并分别结算)。
    • 在资金相关函数增加重入保护(如互斥或引入类似 OpenZeppelin ReentrancyGuard 的模式)。
    • 为拍卖与额度审批补充“取消/撤销/更新”路径,完善状态机与边界处理。
  • 自测清单

    • 说出 onlyOwner 的实现方式与优缺点;何时需要多签替代单一 owner?
    • 描述一次安全的转账流程,包括校验、记账与外部调用的顺序与失败回滚。
    • 在拍卖中如何避免“最后一刻抢跑/阻塞”?你会如何改进当前实现?
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容