solidity是静态类型,编译型,高级预言。针对EVM专门设计,受到C++、JS等语言影响。
数据类型
值类型
布尔、整型、定长字节数字、枚举、函数类型、地址类型
十六进制常量、有理数和整形常量、字符串常量、地址常量
引用类型
结构体
数组
映射类型
全局变量及函数
区块和交易
block.number (uint) 当前区块号
block.timestamp (uint) 自unix epoch 起始当前区块以秒计算的时间戳
msg.sender (address)消息发送者(当前调用)
msg.value (uint) 随消息发送的wei的数量
tx.origin (address payable) 消息的发起者(完全的调用链)
错误处理(require()/revert())
在程序发⽣错误时的处理⽅式:EVM通过回退状态来处理错误的,以便保证状态修改的事务性
assert()和require()⽤来进⾏条件检查,并在条件不满⾜时抛出异常
assert(bool condition)
如果不满足条件,则会导致Panic 错误,则撤销状态更改 - 用于检查内部错误。
require(bool condition)
如果条件不满足则撤销状态更改 - 用于检查由输入或者外部组件引起的错误。
revert(“msg”):
终止运行并撤销状态更改,可以同时提供一个解释性的字符串。
Error 定义错误
数学和密码学
addmod(uint x, uint y, uint k) returns (uint)
计算 (x + y) % k
,加法会在任意精度下执行,并且加法的结果即使超过 2**256
也不会被截取。从 0.5.0 版本的编译器开始会加入对 k != 0
的校验(assert)。
mulmod(uint x, uint y, uint k) returns (uint)
计算 (x * y) % k
,乘法会在任意精度下执行,并且乘法的结果即使超过 2**256
也不会被截取。从 0.5.0 版本的编译器开始会加入对 k != 0
的校验(assert)。
keccak256((bytes memory) returns (bytes32)
计算 Keccak-256 哈希。
ABI 编码
ABI:Application Binary Interface 应⽤程序⼆进制接⼝
ABI 接⼝描述: 定义如何与合约交互
ABI 编码 • 函数选择器:对函数签名计算Keccak-256哈希,取前 4 个字节
地址成员
<address>.balance
(uint256
)
以 Wei 为单位的 地址类型 Address 的余额
<address>.code
(bytes memory
)
在 地址类型 Address 上的代码(可以为空)
<address>.codehash
(bytes32
)
地址类型 Address 的codehash
<address payable>.transfer(uint256 amount)
向 地址类型 Address 发送数量为 amount 的 Wei,失败时抛出异常,使用固定(不可调节)的 2300 gas 的矿工费。
<address payable>.send(uint256 amount) returns (bool)
向 地址类型 Address 发送数量为 amount 的 Wei,失败时返回 false
,发送 2300 gas 的矿工费用,不可调节。