Solidity学习-1
一、整型
int / uint :分别表示有符号和无符号的不同位数的整型变量。 支持关键字 uint8 到 uint256 (无符号,从 8 位到 256 位)以及 int8 到 int256,以 8 位为步长递增。 uint 和 int 分别是 uint256 和 int256 的别名。 uint8 的长度为 2**8 - 1 即:[0, 255],int8即[-128,127]; 需要注意整型溢出的问题,属于程序问题 解决方案:
- 使用
assert断言 - 使用
safemath库
二、地址
以太坊中的地址的长度为20字节,一字节等于8位,一共160位,所以address也可以用uint160来声明。以太坊钱包地址是以16进制的形式呈现,十六进制的数字占4位,160 / 4 = 40,所以钱包地址的长度为40。
三、memory 与 storage
memory关键字告诉solidity应当在该函数运行时为变量创建一块空间,使其大小和结构满足函数运行的需要。 Storage 变量是指永久存储在区块链中的变量。 Memory 变量则是临时的,当外部函数对某合约调用完成时,内存型变量即被移除。 局部变量默认是storage类型,状态变量是强制为storage类型。
四、转账
4.1 transfer() 从当前合约向某个地址转资产,大多数情况使用 4.2 send() 发生异常时,不抛出错误,返回false,所以使用时需要检查返回值 异常: Gas 花费超过 2300
相同点: 都有 2300 gas 限制,当合约接收以太币时,很容易失败,以下操作消耗会大于 2300 gas:
- 写入储存(storage)
- 创建一个合约
- 执行一个外部(external)函数调用,会花费很多
gas - 发送
ether
4.3 call() 合约环境是调用的合约环境 4.4 delegatecall() 合约环境是当前合约环境,地址为发起调用的账号地址
即call() ,delegatecall()本质区别
五、函数类型
- 外部函数(
external) 消耗gas比较多 - 内部函数(
internal) - 函数选择器(
selector) 返回一个哈希值,EVM中实际上通过该哈希值进行函数匹配的,只有外部函数拥有。
六、引用类型
与JavaScript中表现一致 储存位置:storage(区块链中)、memory(EVM内存中)
storage状态变量,复杂类型的局部变量memory局部变量即参数- 数组
length获取长度push添加元素,仅限变长数组,memory数组不支持
七、 字节(bytes)与字符串(string)
字符串库(solidity-stringutils)