Solidity语言
IDE:https://remix.ethereum.org
合约文件结构:
版本申明、import、合约(状态变量、函数、结构类型、事件、函数修改器)、代码注释
结构举例:
//^表示从0.4.0版本到0.5.0版本
pragma solidity ^0.4.0;
//import
import "s2.sol";
//This is a test Contract
//合约
contract Test{
//状态变量
uint a;
//函数
function setA(uint x) public owner{
a = x;
emit Set_A(x);
}
//事件
event Set_A(uint a);
//结构类型
struct Position{
int lat;
int lng;
}
//函数修改器(类比python中的装饰器)
modifier owner(){
require(msg.sender == owerAddr);
//函数插入至_这里
_;
}
}
类型:
值类型(value type)、引用类型(reference type)
值类型:
布尔类型:
true/false
! && || == !=
pragma solidity ^0.4.0;
contract Test{
bool boola = true;
bool boolb = false;
function testbool1() public returns(bool){
return boola && boolb;
}
function testbool2() public returns(bool){
return boola || boolb;
}
}
整型:
int/uint
int——有符号的整型
uint——无符号的整型
int8-int256
<= < == != >= >
& | ^ ~
+ - 一元+ 一元0- * / % ** << >>
pragma solidity ^0.4.0;
contract Test{
uint a;
int b = 20;
int c = 30;
function testadd() public constant returns(int){
if(b > c){
return b + c;
} else if(b == c){
return b * c;
} else{
return b >> 2;
}
-1 >> 2;
}
}
常量(literals):
数字、字符串常量、十六进制常量、地址常量
常量不会有溢出
string没有结尾符/0
十六进制常量:hex"abcd",可以转化为字节数组byte2
地址类型:
address:表示一个账户地址(20字节)
balance:余额,属性
transfer():交易函数
pragma solidity ^0.4.16;
contract AddrTest{
function deposit() public payable {
//可以存款需要payable
}
function getBalance() public constant returns (uint) {
return this.balance;
}
function transferEther(address towho) public {
towho.transfer(10);
}
}
地址常量:
满足地址合法性检查
引用类型:
数据位置:
memory、storage
数组:
T[k]:元素类型[固定长度]
T[]:长度动态调整的数组
bytes string
string可以转为bytes,bytes类似byte[]
成员:length、push()
pragma solidity ^0.4.16;
contract ArrayTest{
uint[] public u = [1,2,3];
string s = "abcdefg";
function h() public constant returns (uint){
return bytes(s).length;
}
function f() public constant returns (bytes){
return bytes(s);
}
function newM(uint len) constant public returns (uint){
uint[] memory a = new uint[](len);
bytes memory b = new bytes(len);
return a.length;
}
function g(uint[3] _data) public constant {
}
}
结构体:
struct Funder{
address addr;
uint amount;
}
function newFunder() public {
funder = Funder({addr:msg.sender,amount:10});
}
映射(Mappings):
mapping(address=>uint)
mapping(address => uint) public balances;
function updateBalance(uint newBalance) public{
balances[msg.sender] = newBalance;
}
全局变量及函数:
有关区块和交易、有关错误处理、有关数字及加密、有关地址和合约
msg.sender(address) //获取交易地址
msg.value(uint) //获取交易以太币,单位Wei
block.coinbase(address) //当前块的地址
block.difficulty(uint) //当前块的难度
block.number(uint) //当前块的区号
block.timestamp(uint) //当前块的时间戳
now(uint) //当前块的时间戳
tx.gasprice(uint) //当前块的价格
pragma solidity ^0.4.16;
contract ArrayTest{
//构造函数设定payable
constructor() payable{
}
function testApi() public constant returns(uint){
return msg.value; //获取交易以太币,单位Wei
}
}
个人主页:www.unconstraint.cn