Solidity基础(3)--类型详解(值类型)

本章节主要详细介绍solidity中值类型的属性信息以及注意点

包括:Boolean,Integer,Address,定长字节数组,Enums


1. Boolean类型

bool:可以取值true和false
对应的运算符同java相同包括:!逻辑非,&&逻辑与,||逻辑或,==等于,!= 不等于,其中 &&,|| 为短路运算符

2. Integer类型

int/uint:有符号/无符号整型,支持从uint8到uint256及int8到int256。int和uint默认值为int256和uint256

 1.有符号:表示任何规定范围内的整数(例如:int8范围是-127-127)
 2. 无符号:只能表示非负数(例如:uint8范围是0-255)

支持运算符操作

  比较运算符:<= , < , == , != , >= , > 比较结果的返回值为bool类型
  位运算符:& ,|,^(异或),~(非)
  数学运算:+,-,,/,%(取余),*(次方) ,<<(左移) , >>(右移)

补充说明

(1).var声明:var类型表示第一次使用时所表示的类型
(2).除法截断:整数的除法会被截断(例如:1/4结果为0),但是使用字面量的方式不会被截断

pragma solidity ^0.4.0;
contract IntegerTest{
    function get() returns (int){
        int a = 1;
        int b = 4;
        var c = 1 / 4 * 4;//未截断
    return c;
    }
}

3.Address 地址类型

表示一个账户的地址,在以太坊中地址的长度为20字节,一字节8位,一个address就是160位,所以address可以用uint160表示
* 支持运算符:>,<,==,>=,<=,!=,
* 地址类型的成员:
属性:balance
函数:transfer(),send(),call(),callcode(),delegatecall()

(1).balance:它能得到以Wei为单位的地址类型的余额。

pragma solidity ^0.4.0;
contract addressTest{
    function getBalance(address addr) returns (uint){
        return addr.balance;
    }
}

(2) . transfer(uint256 amount):向地址类型发送数量为amount的Wei,失败时抛出异常,不可调节。

(3) .send(uint256 amount) returns (bool):向地址类型 发送数量为 amount 的 Wei,失败时返回 false,不可调节。

补充:send 与transfer对应,但send更底层。如果执行失败,transfer不会因异常停止,而send会返回false。send() 执行有一些风险:如果调用栈的深度超过1024或gas耗光,交易都会失败。因此,为了保证安全,必须检查send的返回值,如果交易失败,会回退以太币。如果用transfer会更好。

(4) .call(…) returns (bool):发出低级函数 CALL,失败时返回 false,发送所有可用 gas,可调节。

(5) .callcode(…) returns (bool):发出低级函数 CALLCODE,失败时返回 false,发送所有可用 gas,可调节。

(6) .delegatecall(…) returns (bool):发出低级函数 DELEGATECALL,失败时返回 false,发送所有可用 gas,可调节。
上面的这三个方法call(),callcode(),delegatecall()都是底层的消息传递调用,最好仅在万不得已才进行使用,因为他们破坏了Solidity的类型安全。

(1).msg.sender:表示当前调用方法时的发起人,调用方法的人很多,如何判断合约的拥有者?在第一次部署的时候进行定义,即在构造函数中定义:

contract Test {
    address public _owner;
    function Test() {
        _owner = msg.sender;
    }
}

(2).合约地址:合约部署后,会有一个合约地址,合约地址表示合约本身,可以用this表示

  contract Test {
    address public _owner;
    function Test() {
        _owner = msg.sender;
    }
     function returnContractAddress() constant returns (address) {
        return this;
    }
}

4.定长字节数组(固定大小字节数组)

定义方式bytesN,其中N可取1~32中的任意整数,bytes1代表只能存储一个字节。一旦声明,其内部的字节长度不可修改,内部字节不可修改
* 运算符
比较:<=,<,==,!=,>=,>,返回值为bool类型。
位运算符:&,|,^(异或),~非
支持序号的访问,与大多数语言一样,取值范围[0, n),其中n表示长度。

注:
可以通过.length返回字节个数,可以通过索引读取对应索引的字节

5.枚举(Enums)

枚举类型是在Solidity中的一种用户自定义类型。

enum ActionChoices { GoLeft, GoRight, GoStraight, SitStill }

ActionChoices可以理解为一个自定义的整型,当枚举数量不够多时默认类型为uint8,此例子中可以理解成uint8,当枚举数量足够多时,他会自动变成uint16

6.函数

  • 可以将一个函数赋值给一个变量,一个函数类型的变量。
  • 还可以将一个函数作为参数进行传递。
  • 也可以在函数调用中返回一个函数。

:函数调用方式有两种;internal和external。(这里的external是调用方式,不要访问权限中的那个混淆)
* 内部函数(internal) –默认是这种类型
因为不能在当前合约的上下文环境以外的地方执行,内部函数只能在当前合约内被使用。如在当前的代码块内,包括内部库函数,和继承的函数中。

  • 外部函数(External)–调用此函数需要用this:这个this是指合约
    外部函数由地址和函数方法签名两部分组成。可作为外部函数调用的参数,或者由外部函数调用返回。

    pragma solidity ^0.4.5;
    contract FuntionTest{
        function internalFunc() internal{}
        function externalFunc() external{}
        function callFunc(){
            //直接使用内部的方式调用
            internalFunc();
            //不能在内部调用一个外部函数,会报编译错误。
            // externalFunc();
            //不能通过`external`的方式调用一个`internal`
            //this.internalFunc();
            //使用`this`以`external`的方式调用一个外部函数
            this.externalFunc();
        }
    }
    contract FunctionTest1{
    function externalCall(FuntionTest ft){
        //调用另一个合约的外部函数
        ft.externalFunc();
        //不能调用另一个合约的内部函数
        //ft.internalFunc();
        }
    }
    

补:回退函数 fallback:

每一个合约有且仅有一个没有名字的函数。这个函数无参数,也无返回值。当调用的函数找不到时,就会调用默认的fallback函数

pragma solidity ^0.4.0;
contract SimpleFallback{
  function(){
    //fallback function
  }
}

你可能感兴趣的:(solidity)