Solidity基础变量总结

状态变量:
  是指在函数之外声明的变量,默认是storage类型,被永久地保存在合约中。也就是说它们被写入以太币区块链中. 想象成写入一个数据库。
 
无符号整数
 1 uint = uint256
 2 uint8
 3 uint16
 4 uint32
 5 转换:uint16 a = uint16(45);
 6 溢出:
 7   uint8 num = 2^8 - 1 = 255 8   num + 1 = 0; // 这就是溢出
 9 下溢:
10   uint8 num = 0;
11   num - 1 = 255;//这就是下溢出
12 
13 使用库:SafeMath可以有效防止上面的情况发生;
乘方操作: 5**2=25
 
string
 
数组
静态数组:uint[2] arr; //固定长度为2的静态数组
动态数组:uint[] arr; //动态数组,长度不固定,可以动态添加
添加新元素:arr.push(6)
 
结构体 struct:类似于其他编程语言
1 struct Sandwich { 
2     string name; 
3     string status; 
4 }
5 
6 // 声明
7 Sandwich[] sandwiches;
 
 
address
  以太坊区块链由account(账户)组成,类似于银行账户。每个账户都有一个地址,就像银行账号,用于相互转账。
  address(0):address(0)代表 https://etherscan.io/address/0x0000000000000000000000000000000000000000 这个地址。
  至于为什么不让owner授权address(0)成为新的owner,别人是这么解释的:
  so, i think it is because kitties are ERC20 tokens, in order to avoid some falesome behavior of the contract, it is not allowed to send kitties to address(0) which is owner of ERC20 standard contract
  我的理解是CryptoKitties里面调用了ERC20合约(对,合约可以调用任何已经发布了的合约里面的public函数)。而ERC20合约的地址在address(0)。为了避免出现混乱吧。
 
constant:常量
 
mapping:类似于字典(dict)的键值对
//对于金融应用程序,将用户的余额保存在一个 uint类型的变量中: mapping (address => uint) public accountBalance; //或者可以用来通过userId 存储/查找的用户名 mapping (uint => string) userIdToName;
 
 
require:当不满足某些条件时抛出错误,并停止执行:
1 function sayHiToVitalik(string _name) public returns (string) { 
2 // 比较 _name 是否等于 "Vitalik". 如果不成立,抛出异常并终止程序 
3 // (敲黑板: Solidity 并不支持原生的字符串比较, 我们只能通过比较 
4 // 两字符串的 keccak256 哈希值来进行判断) 
5 require(keccak256(_name) == keccak256("Vitalik")); // 如果返回 true, 运行如下语句 
6 
7 return "Hi!"; }
8 
9 //ps:因此在调用函数之前,用 require 验证前置条件时非常必要的。
 
storage:永久存储在区块链的变量,需要花费大量的gas
ps:在函数外声明的变量默认为 storage 类型,并永久写入区块链,某些特殊情况需要在函数内部手动声明。
 
memory:临时存储的变量,外部函数对某合约调用完成时,内存型变量即被移除。花费少量的gas。所以能用memory处理就坚决不适用storage
ps:在函数内部声明的变量默认是 memory 类型,函数调用结束后消失
 
时间单位
  Solidity 还包含秒(seconds),分钟(minutes),小时(hours),天(days),周(weeks) 和 年(years) 等时间单位。它们都会转换成对应的秒数放入 uint 中。
  所以 1分钟 就是 60,1小时是 3600(60秒×60分钟),1天是86400(24小时×60分钟×60秒),以此类推。
 
一些全局变量
this:指的是当前合约的地址
 
msg.sender:当前调用者(或智能合约)的address
ps:在solidity中,功能执行始终需要从外部调用者开始。一个合约只会在区块链上什么也不能做,除非有人调用其中的函数。所以msg.sender总是存在的。
 
msg.value:一种可以查看向合约发送了多少以太的方法,如:0.001 ether
1 ether = 10^18 wei;
 
this.balance:将返回当前合约存储了多少以太。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

猜你喜欢

转载自www.cnblogs.com/deandnnn/p/9108523.html