Solidty語法總結

版本指令

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章