Solidity 0.5.8官方文档

智能合约简介
实例 - 简单存储合约 实例 - 简单子货币合约 区块链基础知识
以太坊虚拟机简介
EVM - 账户 EVM - 交易 EVM - Gas EVM - 内存/存储/栈 EVM - 指令集 EVM - 消息调用 EVM - 委托调用/调用代码/库 EVM - 日志 EVM - 创建其他合约 EVM - 合约停用与自毁
安装Solidity编译器
Solidity编译器版本概述 使用在线Solidity IDE - Remix 使用npm安装Solidity编译器 使用Solidity编译器Docker镜像 安装预构建Solidity编译器 使用源代码构建Solidity编译器
利用实例学习Solidity
实例 - 投票合约 实例 - 盲拍合约 实例 - 安全远程购买合约 实例 - 微支付通道 实例 - 模块化合约
Solidity源文件布局
Pragma - Solidity编译控制指令 导入其他Solidity文件 在Solidity中使用注释
Solidity智能合约的结构
合约 - 状态变量 合约 - 函数 合约 - 函数修饰符 合约 - 事件 合约 - 结构类型 合约 - 枚举类型
Solidity值数据类型
布尔类型 整型 定长浮点数 地址类型 定长字节数组 变长字节数组 地址字面量 数值字面量 字符串字面量 十六进制字面量 枚举类型 数类型
Solidity其他数据类型
引用类型 映射类型 LValue相关的操作符 基本类型之间的转换 字面量类型推断
Solidity内置的计量单位及全局变量
以太币计量单位 时间单位 特殊变量与特殊函数
Solidity表达式和逻辑控制结构
逻辑控制结构 函数调用 使用new创建合约实例 表达式执行顺序 赋值 变量声明与作用域
Solidity智能合约
创建合约 可视性与getter函数 函数修饰符 状态常量 函数参数与返回值 只读函数 纯函数 回退函数 函数重载 使用日志 合约的构造函数 基类构造函数的参数 多重继承与线性化 同名不同类型成员的继承 抽象合约 接口 using for指令
Solidity汇编
内联汇编 - 语法 内联汇编 - 示例 内联汇编 - 操作符 内联汇编 - 字面量 内联汇编 - 函数式风格 内联汇编 - 访问外部变量/函数/库 内联汇编 - 标签 内联汇编 - 声明本地变量 内联汇编 - 赋值 内联汇编 - 条件语句 内联汇编 - 分支语句 内联汇编 - 循环语句 内联汇编 - 函数 使用内联汇编需要避免的错误 Solidity中的惯例 独立汇编的语法
Solidity其他问题
存储中的状态变量布局 内存中的布局 调用数据的布局 变量清理的内部机制 优化器的内部机制 源代码映射 技巧及小窍门
Solidity速查表
操作符优先级 全局变量 函数可见性声明符 修饰符 保留关键字 Solidity语法
NatSpec格式
NatSpec文档示例 使用NatSpec标签 NatSpec文档输出
Solidity安全陷阱
安全陷阱 - 私有信息与随机性 安全陷阱 - 重入问题 安全陷阱 - Gas限量与循环 安全陷阱 - 以太币的发送与接收 安全陷阱 - 调用栈的深度 安全陷阱 - 谨慎使用tx.origin 安全陷阱 - 2的补数/下界溢出/上界溢出 安全相关的小细节
Solidity安全推荐做法
安全推荐 - 认真对待警告信息 安全推荐 - 限定以太币的数量 安全推荐 - 保持合约的简洁与模块化 安全推荐 - 使用检查/生效/交互模式 安全推荐 - 引入故障安全运行模式 安全推荐 - 提请他人审核代码
Solidity安全的正式验证
安全验证 - 抽象与误报 安全验证 - 引用类型与别名
Solidity资源
常规资源 支持Solidity集成的在线服务 Solidity工具 第三方Solidity解析器和语法器
使用Solidity编译器
使用命令行编译器 设置目标EVM版本 编译器输入/输出JSON格式说明
Solidity合约元数据
在合约字节码中嵌入元数据 使用元数据自动生成接口及NatSpec文档 使用元数据进行源代码验证
Solidity合约ABI规范
ABI - 基本设计 ABI - 函数选择符 ABI - 参数编码 ABI - 数据类型 ABI - 编码设计条件 ABI - 编码的形式化约定 ABI - 函数选择符与参数编码 ABI - 示例 ABI - 使用动态类型 ABI - JSON格式 ABI - 严格编码格式 ABI - 非标压缩格式 ABI - 有索引事件参数的编码
Yul规范
Yul - 语法的局限性 Yul - 作用域规则 Yul - 形式化定义 Yul - 类型转换函数 Yul - 底层函数 Yul - 后端 Yul - 对象规范
Solidity风格指南
风格指南简介 代码布局指南 代码布局的顺序 命名惯例 NatSpec风格
Solidity常见模式
模式 - 从合约提款 模式 - 访问限制 模式 - 状态机
在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器

数值字面量

整数字面常数由范围在 0-9 的一串数字组成,表现成十进制。 例如,69 表示数字 69。 Solidity 中是没有八进制的,因此前置 0 是无效的。

十进制小数字面常数带有一个 .,至少在其一边会有一个数字。 比如:1.,.1,和 1.3。

科学符号也是支持的,尽管指数必须是整数,但底数可以是小数。 比如:2e10, -2e10, 2e-10, 2.5e1。

数值字面常数表达式本身支持任意精度,除非它们被转换成了非字面常数类型(也就是说,当它们出现在非字面常数表达式中时就会发生转换)。 这意味着在数值常量表达式中, 计算不会溢出而除法也不会截断。

例如, (2800 + 1) - 2800 的结果是字面常数 1 (属于 uint8 类型),尽管计算的中间结果已经超过了 以太坊虚拟机Ethereum Virtual Machine(EVM) 的机器字长度。 此外, .5 * 8 的结果是整型 4 (尽管有非整型参与了计算)。

只要操作数是整型,任意整型支持的运算符都可以被运用在数值字面常数表达式中。 如果两个中的任一个数是小数,则不允许进行位运算。如果指数是小数的话,也不支持幂运算(因为这样可能会得到一个无理数)。

Solidity 对每个有理数都有对应的数值字面常数类型。 整数字面常数和有理数字面常数都属于数值字面常数类型。 除此之外,所有的数值字面常数表达式(即只包含数值字面常数和运算符的表达式)都属于数值字面常数类型。 因此数值字面常数表达式 1 + 2 和 2 + 1 的结果跟有理数三的数值字面常数类型相同。

警告:在早期版本中,整数字面常数的除法也会截断,但在现在的版本中,会将结果转换成一个有理数。即 5 / 2 并不等于 2,而是等于 2.5。

数值字面常数表达式只要在非字面常数表达式中使用就会转换成非字面常数类型。 在下面的例子中,尽管我们知道 b 的值是一个整数,但 2.5 + a 这部分表达式并不进行类型检查,因此编译不能通过。

uint128 a = 1;
uint128 b = 2.5 + a + 0.5;