开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情
Solidity基础知识
一、数据类型
值类型
- 整型:包含无符号整数与有符号整数。每类整数还可根据长度细分:从8~256,步长为8
- 布尔型:取值为字面常数值 true 和 false
- 地址类型:地址类型存储一个20字节的值,它由私钥间接生成。地址的类型也可以有成员变量(transfer,balance)
- 枚举:一种用户自定义类型,至少有一名成员,举个例子吧:
pragma solidity ^0.5.10;
contract Demo{
enum Fruit {Apple,Banana,Orange,Strawberry}
}
- 函数:函数类型有两类内部函数和外部函数。可以将一个函数赋值给另一个函数类型的变量,也可以将一个函数作为参数进行传递,还能在函数调用中返回函数类型变量。
引用类型
- 定长字节数组:Solidity提供了bytes1到bytes32的类型,它们是固定长度的字节数组。用户可以读取定长bytes的内容。
- 变长字节数组:可以动态调整大小的字节数组。如果长度可以确定,尽量使用定长的如byte1到byte32中的一个,因为这样更省空间。
- 字符串:用来存储任意长度的UTF-8编码的字符串数据
- 结构体:struct,是一种自定义结构对象,既可以作为状态变量存储,也可以在函数中作为局部变量存在。 举个例子:
struct Person{
uint age;
string name;
}
Person private _person;
function structExample() {
Person memory p = Person(1, "alice");
_person = p;
}
-
在bytes和byte array的时候有点分不清楚到底bytes是不是byte array,也分不清他们应该属于值类型,还是引用类型,还是看具体使用的时候是值传递还是引用传递吧。
二、合约的构成
Solidity合约可以包含状态变量、函数、事件的声明,且合约可以从其他合约继承。
-
状态变量:
- 会被永久保存,也可以被函数修改
- 状态变量的声明方式为:[类型] [访问修饰符-可选] [字段名]
-
函数:
- 构造函数:用于部署并初始化合约,允许用户传入一些基本的数据,写入到状态变量中,和java不同的是,构造函数不支持重载,只能指定一个构造函数。
- 函数修饰符:函数修饰器可以用来以声明的方式改良函数语义。
- 函数用于读写状态变量。
- 函数的调用包含在交易中,经过区块链网络共识后,函数对状态变量的修改才生效(永久保存在区块链账本中)
- 函数签名定义了函数名、输入输出参数、访问修饰符、自定义修饰符
- 与Java不同,solidity的函数可以有多个返回值,比如:
- function functionSample() public view returns(uint, uint){ return (1,2); }
-
事件:
- 事件是能方便地调用以太坊虚拟机日志功能的接口
- 客户端可以通过web3订阅事件
- 定义事件:event SetState(uint value);
- 构造事件:emit SetState(value); (构造事件也可以不写emit直接调用,但是推荐写上emit)
三、合约的编写原则
- 分层设计
- 统一接口
- 代码细节
- 命名规范:
- 合约命名:采用驼峰命名、首字母大写、且能表达对应的业务含义;
- 方法命名:采用驼峰命名、首字母小写、且能表达对应的业务含义;
- 事件命名:采用驼峰命名、首字母小写、且能表达对应的业务含义,以Event结尾;
- 合约变量:采用驼峰命名、以_开头,首字母小写、且能表达对应的业务含义;
- 方法入参:采用驼峰命名、首字母小写、且能表达对应的业务含义;
- 方法出参:建议只写出参类型,无需命名,特殊情况例外;
- 事件参数:同方法入参;
- 局部变量:同方法入参。
- 命名规范:
- 兜底方案
- 合约中设计保留字段
- 紧急情况下,不修改合约,通过修改SDK,结合合约的保留字段来进行特殊处理