Solidity是一种面向智能合约的高级编程语言,专门为EVM设计。(面向合约编程)
用于编写Dapps的智能合约逻辑。
(智能合约:一种代码程序,像是根据合同或者协议条款一样自动执行,类似自动售货机,物理财产层面的强制执行,基于合同法。)
一、基本特性
静态类型语言:编译时检查类型,增加安全性
面向合约:基本编程单元是"合约"(类似面向对象中的类)
图灵完备:理论上可以计算任何可计算的问题
继承支持:支持多重继承和抽象合约
丰富的库生态:OpenZeppelin等标准库提供安全合约实现
二、核心概念
1.合约(Contract)
Solidity的基本构建块,类似于面向对象语言中的类:
contract MyContract {
// 状态变量、函数等
}
2.数据类型
值类型:布尔(bool)、整数(int/uint)、地址(address)、固定大小字节数组(bytes1-bytes32)等
引用类型:数组(动态/静态)、结构体(struct)、映射(mapping)
特殊类型:枚举(enum)、函数(function)
3.状态变量与存储
1)状态变量:永久存储在区块链上的数据
2)存储位置:
storage:永久存储在链上(状态变量默认)
memory:临时内存,函数调用结束消失
calldata:不可修改的临时数据(用于函数参数)
4.函数
function functionName(parameters) visibility modifiers returns (returnTypes) {
// 函数体
}
可见性:
public:任何合约和账户可调用
private:仅当前合约内可调用
internal:当前合约及继承合约可调用
external:仅其他合约和账户可调用
修饰符:
view(不修改状态)、pure(不读取也不修改状态)、payable(可接收ETH)等
5.事件(Events)
用于记录区块链日志,可供外部监听:
event Transfer(address indexed from, address indexed to, uint value);
6.错误处理
require(condition, "message"):条件不满足时回滚
revert("message"):立即回滚
assert(condition):用于检查内部错误(消耗所有gas)
三、开发工具链
1.编译器:solc(Solidity编译器)
2.开发框架:
Hardhat
Truffle
Foundry
3.测试网:
Ropsten、Rinkeby、Goerli等
4.IDE:
Remix(在线IDE)
VS Code + Solidity插件
四、典型应用场景
代币合约:ERC-20、ERC-721等标准代币
去中心化金融(DeFi):借贷协议、去中心化交易所
DAO治理:去中心化自治组织
NFT市场:数字资产交易
供应链追踪:商品溯源
五、安全性考虑
Solidity开发需要特别注意:
1)重入攻击:恶意合约回调导致的重复执行
2)整数溢出/下溢:使用SafeMath库或Solidity 0.8+的自动检查
3)gas限制:复杂操作可能超出区块gas limit
4)权限控制:敏感操作应有适当的访问限制
5)随机数生成:链上难以获得真正的随机数
六、版本演进
0.4.x:早期版本
0.5.x:重大语法变更
0.6.x:引入try/catch
0.8.x:默认检查算术溢出,更安全的特性
七、简单示例
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract SimpleStorage {
uint storedData;
event ValueChanged(uint newValue);
function set(uint x) public {
storedData = x;
emit ValueChanged(x);
}
function get() public view returns (uint) {
return storedData;
}
}