第一周·总结一:语法入门与数据建模

本系列用于记录为期30天的solidity共学学习笔记,并尝试结合ai进行整理并定期记录。

  • 涵盖课次

    • lesson1:计数器入门,变量与函数基础(参考:day1-ClickCounter.sol
    • lesson2:字符串与档案存取,读写状态变量(参考:day2-SaveMyName.sol
    • lesson3:去中心化投票,数组与映射建模(参考:day03-PollStation.sol
  • 核心知识点

    • 状态与函数:状态变量持久化,函数读写区分(view/pure/非 view),外部可见性与默认可见性。
    • 基础类型:uint、string、address;在参数与返回值中用 memory 处理临时数据拷贝。
    • 集合结构:数组(候选人列表)、映射(投票计数、投票标记)用于 O(1) 状态查询。
    • 访问者身份:msg.sender 作为轻量身份标识,限制“一人一票”或用户私域数据。
  • 代码要点

    • 计数器最小合约:只含状态与自增函数,便于理解“链上状态即持久存储”。
      • day1-ClickCounter.solclickCount 为公开状态,click() 修改状态触发交易。
    • 档案读写:两个字符串字段保存姓名与简介,提供分离的写入与读取函数。
      • day2-SaveMyName.solsaveProfile 写、getProfile 读;了解 memory 语义。
    • 投票站:候选人注册、投票、防重复投票与结果查询。
      • day03-PollStation.solmapping(address=>bool) hasVoted 防重;mapping(string=>uint) 计票;isCandidate 校验合法候选。
  • 设计与实践建议

    • 用映射替代数组线性搜索统计,保持常数时间复杂度;必要时维护数组用于遍历展示。
    • 对公共只读数据,合理使用 public 状态变量自动生成 getter,减少样板代码。
    • 明确读写边界:只读函数标注 view,写操作需要交易;前端集成时据此区分调用方式。
  • 易错点与修正

    • 字符串唯一性:不能直接比较 storage string;用 mapping(string=>bool) isCandidate 作为存在性标记更稳妥(PollStation 已采用)。
    • 重复投票:缺少投票标记会导致重复累计;hasVoted 必不可少。
    • 可见性默认值:函数与变量未显式标注可见性时容易产生误解,建议总是显式声明。
  • 自测清单

    • 能否说明 state variableview functiontransaction 的区别?
    • 何时需要 memory 关键字?对返回值有何影响?
    • 如何在投票场景中做到“一地址一票”并防止伪造候选人?
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容