本系列用于记录为期30天的solidity共学学习笔记,并尝试结合ai进行整理并定期记录。
-
涵盖课次
- lesson1:计数器入门,变量与函数基础(参考:
day1-ClickCounter.sol) - lesson2:字符串与档案存取,读写状态变量(参考:
day2-SaveMyName.sol) - lesson3:去中心化投票,数组与映射建模(参考:
day03-PollStation.sol)
- lesson1:计数器入门,变量与函数基础(参考:
-
核心知识点
- 状态与函数:状态变量持久化,函数读写区分(view/pure/非 view),外部可见性与默认可见性。
- 基础类型:uint、string、address;在参数与返回值中用
memory处理临时数据拷贝。 - 集合结构:数组(候选人列表)、映射(投票计数、投票标记)用于 O(1) 状态查询。
- 访问者身份:
msg.sender作为轻量身份标识,限制“一人一票”或用户私域数据。
-
代码要点
- 计数器最小合约:只含状态与自增函数,便于理解“链上状态即持久存储”。
-
day1-ClickCounter.sol:clickCount为公开状态,click()修改状态触发交易。
-
- 档案读写:两个字符串字段保存姓名与简介,提供分离的写入与读取函数。
-
day2-SaveMyName.sol:saveProfile写、getProfile读;了解memory语义。
-
- 投票站:候选人注册、投票、防重复投票与结果查询。
-
day03-PollStation.sol:mapping(address=>bool) hasVoted防重;mapping(string=>uint)计票;isCandidate校验合法候选。
-
- 计数器最小合约:只含状态与自增函数,便于理解“链上状态即持久存储”。
-
设计与实践建议
- 用映射替代数组线性搜索统计,保持常数时间复杂度;必要时维护数组用于遍历展示。
- 对公共只读数据,合理使用
public状态变量自动生成 getter,减少样板代码。 - 明确读写边界:只读函数标注
view,写操作需要交易;前端集成时据此区分调用方式。
-
易错点与修正
- 字符串唯一性:不能直接比较 storage string;用
mapping(string=>bool) isCandidate作为存在性标记更稳妥(PollStation已采用)。 - 重复投票:缺少投票标记会导致重复累计;
hasVoted必不可少。 - 可见性默认值:函数与变量未显式标注可见性时容易产生误解,建议总是显式声明。
- 字符串唯一性:不能直接比较 storage string;用
-
自测清单
- 能否说明
state variable、view function、transaction的区别? - 何时需要
memory关键字?对返回值有何影响? - 如何在投票场景中做到“一地址一票”并防止伪造候选人?
- 能否说明