/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */
#content_views .toc,
/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */
#content_views.markdown_views > p:empty:has(+ .toc),
#content_views.markdown_views > .toc + p:empty,
/* 富文本旧版目录标记 */
#content_views.htmledit_views #main-toc,
#content_views.htmledit_views #hr-toc,
#content_views.htmledit_views p[id*=\”-toc\”] {
display: none !important;
}
/* 目录去掉后,紧跟的首个标题不再多出一块上边距 */
#content_views.markdown_views > .toc + h1,
#content_views.markdown_views > .toc + h2,
#content_views.markdown_views > .toc + h3,
#content_views.markdown_views > .toc + h4,
#content_views.markdown_views > .toc + p:empty + h1,
#content_views.markdown_views > .toc + p:empty + h2,
#content_views.markdown_views > .toc + p:empty + h3,
#content_views.markdown_views > .toc + p:empty + h4 {
margin-top: 0 !important;
}
开篇:我在DeFi项目里踩的“百万级漏洞”,让我明白合约开发不是“能跑就行”
去年帮一个DeFi团队做质押挖矿合约时,上线前的最后一次测试差点让项目黄掉:
- 写质押函数时,为了图方便,直接用transfer转ETH,没考虑到接收方是合约时可能触发重入——测试网模拟攻击中,黑客利用这个漏洞,用一个恶意合约反复调用质押函数,凭空套走了1000 ETH测试币;
- 合约里用uint存储用户质押量,没处理溢出——当用户质押量超过2^256-1时,数值直接归零,还好测试时发现了,不然主网上线就是灾难性后果。
那时候才懂:Solidity合约开发和普通编程不一样,一行代码写错可能损失数百万美元,而且一旦部署就无法修改(除非设计可升级)。这篇文章就从实战出发,拆透智能合约开发的核心坑点,从基础语法陷阱到安全漏洞,再到Gas优化,每个点都附真实案例和代码修复方案,帮你避开我踩过的弯路。
一、先搞懂:Solidity的“特殊脾气”——和其他语言不一样的坑
Solidity作为区块链特有的编程语言,有很多和Java、Python不一样的“脾气”,新手很容易在这里栽跟头:
1.1 数据类型:uint和int的“隐形炸弹”
Solidity的uint(无符号整数)和int(有符号整数)有固定位数(如uint256占256位),超出范围会溢出—
