Solidity入门学习(2)——基础知识

171 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情

Solidity基础知识

一、数据类型

值类型

  1. 整型:包含无符号整数与有符号整数。每类整数还可根据长度细分:从8~256,步长为8
  2. 布尔型:取值为字面常数值 true 和 false
  3. 地址类型:地址类型存储一个20字节的值,它由私钥间接生成。地址的类型也可以有成员变量(transfer,balance)
  4. 枚举:一种用户自定义类型,至少有一名成员,举个例子吧:
pragma solidity ^0.5.10;
contract Demo{
    enum Fruit {Apple,Banana,Orange,Strawberry}
}
  1. 函数:函数类型有两类内部函数和外部函数。可以将一个函数赋值给另一个函数类型的变量,也可以将一个函数作为参数进行传递,还能在函数调用中返回函数类型变量。

引用类型

  1. 定长字节数组:Solidity提供了bytes1到bytes32的类型,它们是固定长度的字节数组。用户可以读取定长bytes的内容。
  2. 变长字节数组:可以动态调整大小的字节数组。如果长度可以确定,尽量使用定长的如byte1到byte32中的一个,因为这样更省空间。
  3. 字符串:用来存储任意长度的UTF-8编码的字符串数据
  4. 结构体: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.tryblockchain.org/Solidity-Ty…

二、合约的构成

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,结合合约的保留字段来进行特殊处理