Solidity使用总结

1、int和uint(整形)

  • int(m):有符号整数
  • uint(m):无符号整数
  • m关键字取值为8~256步幅是8 ,表示在内存中2进制的位数,控制了整数的取值范围,不写默认为256。
  • uint和int分别是uint256和int256的别名。
  • m一定要是8的整数倍

2、Mapping(映射)

  • 映射类型,一种键值对的映射关系存储结构。定义方式为mapping(_KeyType => _KeyValue)。
  • 键类型允许除映射、变长数组、合约、枚举、结构体外的几乎所有类型()
  • 值类型没有任何限制,可以为任何类型包括映射类型。
  • 映射可以被视作为一个哈希表,所有可能的键会被虚拟化的创建,映射到一个类型的默认值(二进制的全零表示)。在映射表中,并不存储键的数据,仅仅存储它的keccak256哈希值,这个哈希值在查找值时需要用到。
  • 映射是没有长度的,也没有键集合或值集合的概念
  • 映射类型,仅能用来作为状态变量,或在内部函数中作为storage类型的引用
  • 可以通过将映射标记为public,来让Solidity创建一个访问器。通过提供一个键值做为参数来访问它,将返回对应的值。
  • 映射的值类型也可以是映射,使用访问器访问时,要提供这个映射值所对应的键,不断重复这个过程。
  • 映射不能return给外界,数组可以
    //映射存放投票者和dApp的列表
    mapping(address => voter) public voterMapping;
    mapping(address => dApp) public dAppMapping;
    //定义一个数组来遍历所有投票者
    address public dAppArray;

 

3、Event事件

  • 事件强调功能,一种行为
  • 事件可以用来操作记录,存储为日志。也可以用来实现交互,比如通知UI,返回函数调用结果
//设置监听事件
    event voteEvent(address from_addr, address to_addr, uint getVoteCount, uint voteValue);
    event sinUpEvent(address from_addr);
    event modifyEvent(address from_addr, address old_addr, address new_addr); //修改
    event transEvent(address from_addr, address to_addr, bool success); //交易

4、modifier

  • modifier即函数的修改器,可以用来改变一个函数的行为,控制函数的逻辑。修改器是一种合约属性,可以被继承和重写。
  • 例------设置投票者权限:
modifier validVoter(){
    require(msg.sender != 0 && voterMapping[msg.sender].voterAddress == 0x0);
    _;
}

function vote(address _appAddr, uint _dAppIndex) public validVoter{
         
        voterMapping[_appAddr] = voter(msg.sender,_dAppIndex,msg.value);
         
        dAppMapping[_appAddr].voteCount ;
         
        //dAppMapping[_appAddr].valueWei = dAppMapping[_appAddr].valueWei + msg.value;
        dAppMapping[_appAddr].valueWei += msg.value;
        emit voteEvent(msg.sender,_appAddr,dAppMapping[_appAddr].voteCount,dAppMapping[_dAppAddr].valueWei);
}

5、_;

 

  • 下划线_是一个占位符,代表了执行函数接下来的代码

 

6、require

modifier validVoter(){
        require(msg.sender != 0 && voterMapping[msg.sender].voterAddress == 0x0);
        _;
}
modifier validVoter(){
       if(msg.sender = 0 || voterMapping[msg.sender].voterAddress != 0x0)
       throw;
        _;
}
  • if()throw的写法是较为老式的写法,现在使用require()的写法较多。

7、emit

  • emit关键字来触发事件,这有助于分清功能和事件
  • 之前遭遇DAO攻击导致以太坊硬分叉
emit transEvent(msg.sender ,toAddr ,true)

8、view

function () [private|public|internal|external][modifier][pure|constant|view|payable] [returns ()]
  • 函数可见性分析:
  1. public - 任意访问
  2. private - 仅当前合约内
  3. internal - 仅当前合约及所继承的合约
  4. external - 仅外部访问(在内部也只能用外部访问方式访问)函数的限制访问
  • 函数的限制访问:作用是告诉编译器,函数不改变/不读取状态变量
  1. view的作用和constant一模一样,可以读取状态变量但是不能改
  2. constant:可以读取状态变量但是不能改
  3. pure则更为严格,pure修饰的函数不能改也不能读状态变量,智能操作函数内部变量,否则编译通不过。

 

 

你可能感兴趣的:(区块链)