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