版本指令
pragma solidity ^0.4.19;
它告訴我們源代碼是爲[0.4.19,0.5.0] 版本編寫的
pragma solidity >=0.4.22 <0.7.0;
它告訴我們源代碼是爲[0.4.22,0.7.0] 版本編寫的
合約
contract 合約名字{}
值類型
int uint uint8/32/64...256
bool
fixed/ufixed 定點數
address 地址 .balance獲取餘額 .transfer轉移 判空 !=address(0)
類型轉換
隱式轉換
顯式轉換 :轉化後類型 新變量 = (轉化後類型)原變量;
uint轉bytes
function toBytes(uint256 x) returns (bytes b) {
b = new bytes(32);
assembly {
mstore(add(b, 32), x)
}
}
string轉bytes 顯示轉換
stirng轉bytes32
function stringToBytesVer2(string memory source) returns (bytes32 result) {
assembly {
result := mload(add(source, 32))
}
}
數據位置
Storage 永久數據,高成本
Memory 臨時數據,函數內生效
Calldata 不可修改的非持久性數據位
Stack 由EVM維護的非持久性數
數組
動態:未確定空間大小
靜態:確定空間大小
方法:push(返回值爲新的索引),length
初始化:uint a[3]=[1,2,3]
結構體
同類型的數據連續的存儲可以節省gas
映射
mapping(_KeyType => _ValueType)
特殊全局變量
msg.sender
指的是當前調⽤用者(或智能合約)的 address
錯誤處理
無腦用require就完事了
//assert 式異常消耗了所有可用的調用 gas ,而從 Metropolis 版本起 require 式的異常不會消耗任何 gas
assert(bool condition)
−如果不滿足條件,此方法調用將導致一個無效的操作碼,
對狀態所做的任何更改將被還原。
這個方法是用來處理內部錯誤的。
require(bool condition)
−如果不滿足條件,此方法調用將恢復到原始狀態。
此方法用於檢查輸入或外部組件的錯誤。
require(bool condition, string memory message)
−如果不滿足條件,此方法調用將恢復到原始狀態。
此方法用於檢查輸入或外部組件的錯誤。
它提供了一個提供自定義消息的選項。
revert()
−此方法將中止執行並將所做的更改還原爲執行前狀態。
revert(string memory reason)
−此方法將中止執行並將所做的更改還原爲執行前狀態。
它提供了一個提供自定義消息的選項。
字符串的哈希映射
keccak256(string)
函數語法
function + 函數的名字
+(傳遞給函數的參數,包括參數的名稱和類型)
+函數可見性
+函數修飾符
+returns (返回的類型,若有多個,以逗號分隔)
函數可見性 :public、private、internal、external
用於設定函數的可見範圍
public:public 是默認值,設定爲 public 的函數可以被其他合約和本合約內部調用。
external:類似於 public 函數,唯⼀一的區別在於不能在合約內部調用,除非在調用時申明關鍵字 this。
internal:internal 函數只能被合約內部的函數調用。
private:類似於 internal 函數,唯一的區別在於 private 函數不能被當前合約所派生的子合約調用。
函數修飾符:view/constant、pure、payable、modifier
影響函數的行爲
view/constant: 當函數被定義爲 view,意味着它不對任何狀態進行修改,只能讀取數據不能更改數據。
pure:pure 函數不會讀取或寫入任何數據。函數只能處理參數,返回值給調用方。
payable:payable 函數用於接受外部的支付。
modifier :可以像函數一樣接收參數,修飾符的最後一行爲 _;,表示修飾符調用結束後返回,並執行調用函數餘下的部分
構造函數
constructor(變量類型和變量名) 函數可見性 {
函數語句;
}
事件
聲明事件 event 事件名(元素類型 元素);
觸發事件 emit 事件名(元素類型 元素);
合約繼承
Solidity支持單繼承和多繼承
contract 合約名字 is 繼承的父類 { }
接口
在solidity 0.6.x 版本之後,接口類似於抽象合約,可以使用interface關鍵字創建
interface Calculator {
function getResult() external view returns(uint);
}
在之前的版本直接用contact代替interface