Solidity 基础

admin
admin 2019年08月08日
  • 在其它设备中阅读本文章

一、定义

Solidity 是一门面向合约的、为实现智能合约而创建的高级编程语言。这门语言受到了 C++,Python 和 Javascript 语言的影响,设计的目的是能在以太坊虚拟机(EVM)上运行。

Solidity 是静态类型语言,支持继承、库和复杂的用户定义类型等特性

Remix是 Solidity 在线开发环境,包括编译、部署、测试等等。

二、以太坊虚拟机

以太坊虚拟机 EVM 是智能合约的运行环境。它不仅是沙盒封装的,而且是完全隔离的,也就是说在 EVM 中运行代码是无法访问网络、文件系统和其他进程的。甚至智能合约之间的访问也是受限的。
每笔交易都收取一定数量的 gas ,目的是限制执行交易所需要的工作量和为交易支付手续费。EVM 执行交易时,gas 将按特定规则逐渐耗尽。
EVM 的指令集量应尽量少,以最大限度地避免可能导致共识问题的错误实现。所有的指令都是针对”256 位的字(word)”这个基本的数据类型来进行操作。具备常用的算术、位、逻辑和比较操作。也可以做到有条件和无条件跳转。

1、存储、内存、栈

  • 每个账户有一块持久化内存区称为 存储(storage) 。 存储是将 256 位字映射到 256 位字的键值存储区
  • 第二个内存区称为 内存(memory) ,合约会试图为每一次消息调用获取一块被重新擦拭干净的内存实例。 内存是线性的,可按字节级寻址,但读的长度被限制为 256 位,而写的长度可以是 8 位或 256 位
  • EVM 不是基于寄存器的,而是基于栈的,因此所有的计算都在一个被称为 栈(stack) 的区域执行。 栈最大有 1024 个元素,每个元素长度是一个字(256 位)

三、源文件结构

源文件中可以包含 版本标识指令 导入源文件指令 任意多个合约定义

1、版本标识

关键字 pragma 版本标识指令,版本标识 pragma 指令通常只对本文件有效,所以我们需要把版本标识添加到项目中所有的源文件。 如果使用了 import 导入其他的文件, 标识 pragma 并不会从被导入的文件加入到导入的文件中

pragma solidity ^0.4.0;

2、导入其他源文件

  • 全局引入,这种形式已经不建议使用,因为它会无法预测地污染当前命名空间:
    import "filename";
  • 自定义命名空间引入,推荐使用:
    import * as symbolName from "filename";
    import "filename" as symbolName;
  • 分别定义引入,解决命名冲突
    import {symbol1 as alias, symbol2} from “filename”
    引入文件路径时要注意,非. 打头的路径会被认为是绝对路径

3、合约定义

关键字 contract 定义一个合约,一般格式如下:

contract TinyStorage {

}

4、注释

两种方式, 单行(//), 多行使用 (//)

四、合约结构

在 Solidity 语言中,合约类似于其他面向对象编程语言中的 。每个合约中可以包含 状态变量 函数 函数 事件 结构体 、和 枚举类型 的声明,且合约可以从其他合约继承。还有一些特殊的合约,如:接口

  • 状态变量 :永久地存储在合约存储中的值
  • 函数 :合约中代码的可执行单元,函数调用可发生在合约内部或外部
  • 函数修饰器 :可以用来以声明的方式修改函数语义
  • 事件 :能方便地调用以太坊虚拟机日志功能的接口
  • 结构体 :将几个变量组合在一起形成的自定义类型
  • 枚举 :特殊的自定义类型,类型的所有值可枚举的情况

五、完整源文件示例

pragma solidity ^0.5.10;  //版本标识

import * as symbolName from “filename1”//源文件引用
import “./filename2”//源文件引用

contract exampleContract{  //合约定义
    uint storedXlbData;//状态变量

   function ()  {   //匿名函数,一个合约最多一个
   }
    
    function Mybid() public payable { // 定义函数
    }
    
    modifier onlySeller() { // 修饰器
        _;
    }

    function abort() public onlySeller { // 修饰器用法
    }
    
    event HighestBidIncreased(address bidder, uint amount); // 事件
    
    function bid() public payable {
        emit HighestBidIncreased(msg.sender, msg.value); // 触发事件
    }
    
    struct Voter { // 结构体
        uint weight;
        bool voted;
    }
    
    enum State { Created, Locked, InValid } // 枚举
}


library exampleLibrary {  //库定义
}


interface exampleInterface {  //接口定义
}