区块链笔记:Solidity语言之程序示例、程序结构、数据类型、表达式以及控制结构、异常处理

Solidity程序示例

// 指定编译版本
pragma solidity ^0.4.21;

// 指定contract名字
contract MyContract {
    // 定义合约中的变量
    uint256 totalQty;
    enum Colors (WHITE, BLACK, RED, GREEN, PINK)
    uint[5] eachLine=[1,2,3,4,5];
    struct StudyInfo {
        uint height;
        address voteAddress;
    }
    function MyContract(uint256 _initQty) public {
        totalQty = _initQty;
    }

    function changeEachLine(uint _index, uint _value) public {
        eachLine[_index] = _value;
    }
}

// 合约的继承
contract MySonContract is MyContract{}
  • 这是一份使用Solidity语言编写的以太坊智能合约的源代码
  • 源码第一行指定编译版本,以太坊在发展过程当中升级了很多版本,包括编译器
  • 不同版本的Solidity之间会存在一些差异,需要指定版本
  • 指定这个合约的名字MyContract, 在这个合约中可以定义变量,枚举量,数组,结构体函数等
  • 合约还可以具备继承关系,和我们通常的程序没什么特别的差别和javascript类似

Solidity 程序结构

  • 以contract定义为一个完整的结构
  • 每个contract相当于java的类
  • 里面包含构造函数、方法、变量等元素
  • contract可以集成其他的contract,方笔智能合约的编写
// 指定编译版本
// ^表示兼容之前的版本,最高只能0.4.19
pragma solidity ^0.4.19

// 引入其他文件 import 关键字
import "other_file_name"

// 指定contract, 并且加入文档注释,语法:/** ... */
/** @MyContract is a test contract */
contract MyContract {
    // 单行注释

    /*
        多行注释
        多行注释
    */

   // 变量定义

   // 方法定义

}

// 合约集成
contract MySonContract is MyContract{}

主要的数据类型

pragma solidity ^0.4.19;
contract MyContract {
    // 变量定义
    mapping(address => uint) public balances;
    uint x;
    bool y;
    string myname;
    int32 quantity;
    bytes32 hashValue;
    address myaddress;
}
  • mapping类型,相当于其他语言里面的关联数组或者key-value结构
    • 这里定义了一个mapping类型,address是地址,以太坊里面有账户地址的概念
    • 这里是通过一个地址关联一个uint类型的值,并且这个变量的名称叫balances
  • uint 无符号类型
  • bool 布尔类型
  • string 字符串
  • int32 32位的整数类型
  • bytes32 32位字节大小的值
  • address 地址类型,在以太坊中专有,实际是一个20个字节大小的数据,也就是160位

表达式以及控制结构

pragma solidity ^0.4.19;

contract MyContract {
    // variable definition
    mapping(address => uint) public balances;
    uint appleQty;
    uint orangeQty;
    bool isSuccess;

    // constructor function
    function MyContract() public {
        balances[msg.sender] = 1000;
        appleQty = 10;
        orangeQty = 20;
        isSuccess=true;
    }

    // addition
    funciton Add() public view returns(uint) {
        uint r = appleQty + orangeQty;
        if(r > 100) {
            return r;
        } else {
            return 0;
        }
    }

    // cyclecalc
    function cyclecalc() public pure returns(uint) {
        uint r = 10;
        while (r >= 0) {
            r --;
        }
        return r;
    }
}

  • contract定义一个构造方法,和java中类似,没有返回值,名称和合约名称一样
  • 这就是为什么说Solidity中的合约相当于Java中的类
  • public说明这个方法为公共的,外部可以调用
  • 这里的msg.sender说明合约的调用者的地址,是指合约当前调用者地址,不是一个固定的
  • 这里是构造方法,只有合约在部署的时候,才可以执行一次,谁去部署合约,这个地址就是谁的(部署者)
  • Add方法里面有if判断
  • cyclecalc方法里面有循环处理
  • 这是Solidity中的一些基本表达和控制结构

异常处理

  • 数组越界、Gas不足、除0异常
  • 程序中可以手动抛出异常, 基于不同的场景下
pragma solidity ^0.4.19;

contract MyContract {
    function openDoor(uint paramValue) public payable returns(uint) {
        assert(paramValue > 0);
        return msg.value + paramValue;
    }
}
  • 上面程序中有一个参数paramValue, 这个值必须大于0,否则会出现异常
  • 使用assert进行异常捕获,这是一种异常处理的典型应用
  • 当然还有其他方式也可以处理异常
  • 异常处理在编写智能合约中,对条件的检查起到很重要的作用
  • 智能合约部署后不可篡改,另外智能合约会与某些资产发生关系,是关联的
  • 对于条件的校验是非常需要的
发布了444 篇原创文章 · 获赞 254 · 访问量 71万+

猜你喜欢

转载自blog.csdn.net/Tyro_java/article/details/104961870