请结合网站 https://cryptozombies.io 一起学习,下面是自己的学习记录。
一、创建空合约
0.4.19(是基于这个版本编译的)
二、状态变量和整数
状态变量:状态变量是被永久地保存在合约中。也就是说它们被写入以太币区块链中,想象成写入一个数据库。
uint 无符号数据类型,指其指不能是负数,对于有符号的整数存在名为int的数据类型
三、数学运算
加 减 乘 除,以及取余其他编程语言都是类似的。
Solidity还支持乘方操作
例如: 5 ** 2=25 (意思就是5的平方)
uint x = 5 **2;
四、结构体
结构体允许生成更复杂的数据类型,它有多个属性。类似于java中的类中的属性。
五、数组
数组中有静态数据和动态数组。
静态数据是固定数组长度,动态数组是长度不固定,可以动态添加元素。
uint[2] firstArray; //静态
string[6] stringArray; //静态
uint[] dynamicArray; //动态
也可以创建结构体数组
Person[] people;
公共数组
定义public数组,其他的合约可以从这个数组读取数据(但不能写入数据),所以这在合约中是一个有用的保存公共数据的模式。
Person[] public people;
六、定义函数
在Solidity中定义函数
function eatHamburgers(string name, uint amount){
}
与js中的函数定义类似。
七、使用结构体和数组
创建新的结构体
Struct Person{
Uint age;
String name;
}
Person zm=Person(50, “Zm”);
Person[] public people;
People.push(zm);
把新创的结构体放在数组中。
八、私有/公有函数
Solidity 定义的函数的属性默认为公共。这就意味着任何一方(或者其他合约)都可以调用该合约里的函数。
显然,不是什么时候都需要这样,而且这样的合约易于受到攻击。 所以将自己的函数定义为私有是一个好的编程习惯,只有当你需要外部世界调用它时才将它设置为公共。
function _zt(uint _number) private {
}
function _zt private{
}
可以看到,在函数名字后面(无参数情况)/参数后面(有参数情况)使用private关键字即可。和函数的参数类似,私有函数的名字用(_)起始来区别公用函数。
九、函数的更多属性
返回值:
string greeting = “What’s up dog”;
function sayHello() public returns (string){
Return greeting;
}
Solidity里,函数的定义里可包含返回值的数据类型。比如returns后面的string类型。
函数的修饰符:
没有改变任何值或者写任何东西的情况,我们把函数定义为view,意味着它只能读取数据不能修改数据。
function sayHello() public view returns (string) {
}
Solidity 还支持pure函数,表明这个函数甚至都不访问应用里的数据
function _multiply(uint a, uint b) private pure returns (uint){
return a*b;
}
这个函数甚至都不读取应用里的状态, 它的返回值完全取决于它的输入参数,在这种情况下我们把函数定义为pure。
十、Keccak256和类型转换
Keccak256:
Ethereum 内部有一个散列函数keccak256,它用了SHA3版本。一个散列函数基本上就是把一个字符串转换为一个256位的16进制数字。字符串的一个微小变化会引起散列数据极大变化。
类型转换:
uint8 a=5;
uint b=6;
uint8 c = a*b; //会报错,因为a*b返回的是uint,而不是uint8;
uint8 c=a * uint8(b); //把b转换成uint8即可
十一、放在一起,实战演习
十二、事件
事件是合约和区块链通讯的一种机制。你的前端应用“监听”某些事件,并做出反应。