狀態變量:
是指在函數以外聲明的變量,默認是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:將返回當前合約存儲了多少以太。