0 参考来源
文档主要参考了https://cryptozombies.io的游戏dapp开发网站,一步步通过游戏来讲解solidity。
同时一些细节参考了网上的博客:
https://www.colabug.com/2416565.html
https://www.cnblogs.com/StephenWu/p/7096550.html
https://blog.youkuaiyun.com/liyuechun520/article/details/78408588
等等
附一些solidity和以太坊的参考资料:
official docs: http://www.ethdocs.org/en/latest
以太坊wiki:https://github.com/ethereum/wiki/wiki
以及github上的solidity指南合集:https://github.com/bkrem/awesome-solidity
1 solidity支持的数据类型
1.1 关键词罗列
string//字符串
uint //默认为uint256,还有uint8,uint128等等
int//默认为int256
[] //数组
struct //结构体
view //修饰函数,函数只读取数据不更改数据
pure //修饰函数,函数不访问应用中的数据,返回值完全取决于它的输入参数
mapping//映射:存储和查找数据所用的键-值对
address//地址
bytesN//N取1到32的任意整数值,默认的byte表示bytes1
require//限制条件,require使得函数在执行过程中,当不满足某些条件时抛出错误,并停止执行,个人感觉类似assert断言
inheritance//继承,合约可以访问被继承合约中定义的public函数
storage//永久存储在区块链中的变量
memory//临时变量,当外部函数对某合约调用完成时,内存型变量即被移除
//大多数时候你都用不到这些关键字,默认情况下 Solidity 会自动处理它们。 状态变量(在函数之外声明的变量)默认为“存储”形式,//并永久写入区块链;而在函数内部声明的变量是“内存”型的,它们函数调用结束后消失。
//有时,也需要手动声明存储类型,主要用于处理函数内的 _ 结构体 _ 和 _ 数组 _ ,用以标识指针指向的是原始上链数据还是副本
internal//类似private,但是合约可以访问父合约中定义的internal函数
external//与public类似,但是这些函数只能在合约之外调用
constructor()//0.4.22及以后采用此作为构造函数
modifier//函数修饰符,修饰函数,它不能像函数那样被直接调用,只能被添加到函数定义的末尾,用以改变函数的行为,在其他语句执行前,先检查先验条件,给继承这个函数的modifier的对应函数加一个特定约束,在继承的函数体将在_特殊符号的位置被插入
now//当前unix时间戳(自1970年1月1日以来经过的秒数)
Solidity 定义的函数的属性默认为公共。 这就意味着任何一方 (或其它合约) 都可以调用你合约里的函数。
在 Solidity 中,有一些全局变量可以被所有函数调用, msg.sender,它指的是当前调用者(或智能合约)的 address
Solidity 并不支持原生的字符串比较, 我们只能通过比较两字符串的 keccak256 哈希值来进行判断
1.2 参数类型细节
1.2.1 数组
https://www.jianshu.com/p/5ca861cce245
1.2.2 memory storage
引用类型的变量在传值时需要memory或storage关键词,一般用于结构体struct、数组或者mapping当中,具体而言,就是传入的值是一个副本还是原始参数。
例如:
struct Zombie {
uint a;
bool b;
}
function modify(Zombie storage _zombie) internal {
_zombie.a = 6;//这样就修改了传入对象的原始值
}
function fake_modify(Zombie memory _zombie) internal {
_zombie.a = 5;//这样只是修改了临时变量的值
}
注:函数参数如果为storage类型时,函数的类型