赞
踩
pragma(版本杂注)
import
import “filename”;
import * as symbolName from “filename”;
import {symbol1 as alias, symbol2} from “filename”;
import “filename” as symbolName;
布尔(bool):可能的取值为字符常量值true或false
整型(int/uint):分别表示有符号和无符号的不同位数的整型变量:支持关键字 uint8到uint256(无符号,从8位到256位)以及int8 到int256,以8位为步长递增
定长浮点型(fixed/ufixed):表示各种大小的有符号和无符号的定长浮点型:在关键字ufixedMxN和fixedMxN中,M表示该类型占用的位数,N表示可用的小数位数(M需被8整除,N限于0-80)
地址(address):存储一个20字节的值(以太坊地址大小)
定长字节数组:关键字有bytes1,bytes2,bytes3,…,bytes32
枚举(enum):一种用户可以定义类型的方法,与C语言类似,默认从0开始递增,一般用来模拟合约的状态
函数(function):一种表示函数的类型
数组(Array)
数组可以在声明时指定长度(定长数组),也可以动态调整大小(变长数组、
动态数组)
对于存储型(storage)的数组来说,元素类型可以是任意的(即元素也可以是数组类型,映射类型或者结构体):对于内存型(memory)的数组来说,元素类型不能是映射(mapping)类型
结构(Struct)
address
address payable(v0.5后引入)
两者区别和转换
<address>.balance (uint256)
<address payable>.transfer(uint256 amount)
<address payable>.send(uint256 amount) returns (bool)
<address>.call(bytes memory) returns (bool, bytes memory)
<address>.delegatecall(bytes memory) returns (bool, bytes memory)
<address>.staticcall(bytes memory) returns (bool, bytes memory)
balance 和transfer
address payable x= address(0x123);
address myAddress = address(this);
if(x.balance <10&& myAddress.balance >= 10)
x.transfer(10);
send
call
nameReg.call.gas(1000000).value(1ether)(abi.encodeWithSignature("register(string)","MyName"));
定长字符数组
pragma solidity >=0.4.0 <0.6.0;
contract Purchase {
enum State { Created, Locked, inactive }
}
数组示例
pragma solidity >=0.4.16 <0.6.0;
contract C {
function f(uint len) public pure {
uint[] memory a = new uint[](7); //一开始得指定大小,7为大小
bytes memory b = new bytes(len);//一样,没赋值,默认全为0
assert(a.length == 7); //assert 后面判断一定得为true否则报错
assert(b.length == len);
a[6]= 8;
}
}
pragma solidity >=0.4.0 <0.6.0;contract Ballot {
struct Voter {
uint weight;
bool voted;
uint vote;
}
}
pragma solidity >=0.4.0 <0.6.0;
contract MappingExample {
mapping(address => uint) public balances;
function update(uint newBalance) public {
balances[msg.sender] = newBalance;
}}
contract MappingUser {
function f() public returns (uint) {
MappingExample m = new MappingExample();
m.update(100);
return m.balances(address(this));
}}
强制指定的数据位置
默认数据位置
特别要求
实例
实例1
/一个简单的例子
pragma solidity ^0.4.0;
contract C {
uint[] data1;
uint[] data2;
function appendOne() public {
append(data1);
}
function appendTwo() public {
append(data2);
}
function append(uint[] storage d) internal{ //这里d是对data1的引用,而不是复制一份数据
d.push(1);
}
}
实例2
///下面代码包含一个错误
pragma solidity ^0.4.0;
contract C {
uint someVariable;//默认值为0
uint[] data;
function f() public {
uint[] x;//长度可变的数组(局部变量,未初始,指向全局,storage(局部变量默认))
x.push(2);//这里面会改变someVariable的值,这是由于这里的x是一个指针,没有初始化,只会指向存储空间的0位置,即指向someVariable,每次push,someVariable+1,而不是2,是由于由于这里的Push不是简单放值,而是长度,然后根据这个长度和x的位置进行哈希得到x对应的值,即hash(位置+长度)=2
data = x;
}
}
实例3
push和.length用法
//下面代码编译错误,push和.length用法 pragma solidity ^0.4.0; contract C { uint[] x; function f(uint[] memoryArray) public { x= memoryArray; //memory类型和storage类型之间可以互相传值, //但memory向storage赋值,则是完整的拷贝,storage向状态变量(强制要求storage) //,只有赋值,则会改变里面内容,相当于拷贝,storage向局部变量(默认storage),则会相当于引用, //memory到Memory一般是引用,但只要涉及到状态变量,就一定是拷贝 uint[] y = x; //引用,y是指针 y[7]; y.length = 2;//令长度为2 delete x; y= memoryArray;//y是指针,不能直接指向, delete y; g(x); h(x); } function g(uint[] storage storageArray) internal {} function h(uint[] memoryArray) public {} }
函数的可见性可以指定为external,public,internal或者private;对于状态变量,不能设置为external,默认是internal。
函数状态可变性
以下情况被认为是修改状态:
以下被认为是从状态中进行读取:
Modifier示例
pragma solidity >=0.4.22 <0.6.0;
contract Purchase {
address public seller;
modifier onlySeller() {//Modifier,执行某函数前先执行modifier
require( msg.sender == seller, "Only seller can call." );//require要求为真,若假,则抛出异常
_;//占位符,代表函数执行的位置,可放在require上面
}
function abort() public view onlySeller {
//Modifier usage
//...
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。