Solidity学习记录(一)

基础篇

请结合网站  https://cryptozombies.io  一起学习,下面是自己的学习记录。

一、创建空合约

Solidity学习记录(一)_第1张图片

0.4.19(是基于这个版本编译的)

 

二、状态变量和整数

状态变量:状态变量是被永久地保存在合约中。也就是说它们被写入以太币区块链中,想象成写入一个数据库。

Solidity学习记录(一)_第2张图片

uint 无符号数据类型,指其指不能是负数,对于有符号的整数存在名为int的数据类型

三、数学运算

加 减 乘 除,以及取余其他编程语言都是类似的。

Solidity还支持乘方操作

例如: 5 ** 2=25 (意思就是5的平方)

uint x = 5 **2;

Solidity学习记录(一)_第3张图片

四、结构体

结构体允许生成更复杂的数据类型,它有多个属性。类似于java中的类中的属性。

Solidity学习记录(一)_第4张图片

 

五、数组

数组中有静态数据和动态数组。

静态数据是固定数组长度,动态数组是长度不固定,可以动态添加元素。

uint[2] firstArray;     //静态

string[6] stringArray;  //静态

uint[] dynamicArray;  //动态

 

也可以创建结构体数组

Person[] people;

 

公共数组

定义public数组,其他的合约可以从这个数组读取数据(但不能写入数据),所以这在合约中是一个有用的保存公共数据的模式。

Person[] public people;

Solidity学习记录(一)_第5张图片

六、定义函数

在Solidity中定义函数

function eatHamburgers(string name, uint amount){

 

}

与js中的函数定义类似。

Solidity学习记录(一)_第6张图片

 

七、使用结构体和数组

创建新的结构体

Struct Person{

Uint age;

String name;

}

Person zm=Person(50, “Zm”);

Person[] public people;

People.push(zm);

把新创的结构体放在数组中。

Solidity学习记录(一)_第7张图片

八、私有/公有函数

Solidity 定义的函数的属性默认为公共。这就意味着任何一方(或者其他合约)都可以调用该合约里的函数。

显然,不是什么时候都需要这样,而且这样的合约易于受到攻击。 所以将自己的函数定义为私有是一个好的编程习惯,只有当你需要外部世界调用它时才将它设置为公共。

 

function _zt(uint _number) private {

 

}

function _zt private{

 

}

可以看到,在函数名字后面(无参数情况)/参数后面(有参数情况)使用private关键字即可。和函数的参数类似,私有函数的名字用(_)起始来区别公用函数。

 

Solidity学习记录(一)_第8张图片

 

九、函数的更多属性

 

返回值:

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。

Solidity学习记录(一)_第9张图片

 

十、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即可

Solidity学习记录(一)_第10张图片

 

十一、放在一起,实战演习

Solidity学习记录(一)_第11张图片

Solidity学习记录(一)_第12张图片

 

 

十二、事件

 

事件是合约和区块链通讯的一种机制。你的前端应用“监听”某些事件,并做出反应。

Solidity学习记录(一)_第13张图片

 

Solidity学习记录(一)_第14张图片

 

Solidity学习记录(一)_第15张图片

你可能感兴趣的:(Solidity)