Solidity 合約開發要掌握的特性和關鍵詞記錄

2021-10-07 23:52:32 字數 4090 閱讀 3594

2.省gas秘籍

最近看了一些solidity開發資料,目前latest是0.6.12,記性不好,記錄一下。

變數相關

型別備註

uint

無符號整數

uint 預設為 uint256的縮寫

對映鍵值對儲存key/val,可巢狀

address

位址型別

一般是兩種型別:使用者或者合約,自帶成員函式 transfer 和 send等,更多成員函式

struct

結構體可以有多個屬性,類似go的struct

enum

列舉通常由多個常量值構成的自定義型別

storage

引用型別

永久儲存在鏈上,類似硬碟

memory

引用型別

臨時儲存,外部函式對某合約呼叫完時**,類似記憶體

calldata

引用型別

唯讀,用來儲存函式傳的引數,方便的在函式內引用而不占用空間。0.6.9之前只能外部呼叫

delete

初始化為0

solidity沒有null和undefined的概念,注意:delete陣列某個索引後可能留空位置。

bytes

定長位元組陣列

類似byte,bytes能「緊打包」,將元素連續存起來,意味使用gas更低。

strings

特殊陣列

與bytes相同,但不允許用長度或索引來訪問。

更多請檢視solidity文件:全域性變數 、保留關鍵字、修飾符、函式可見性 速查表

函式相關

型別備註

event

事件合約和區塊鏈的通訊機制,前端可觸發event方法做出反應。

emit

觸發事件

事件的呼叫方法

indexed

事件索引

最多三個,特殊資料結構,前端能通過filter篩選事件,普通的是日誌資料結構。

payable

函式型別

表示可以接受eth的函式

internal

函式型別

內部,類似private,繼承關係可使用。

external

函式型別

外部,類似public,不能在繼承關係中使用。

view

函式修飾符

表示函式唯讀不改,不會消耗gas

pure

函式修飾符

表示函式只做計算不讀不改,不會消耗gas

virtual

函式型別

函式重寫,介面缺省會進行標記virtual,private不能使用該標記。

override

函式型別

函式重寫,配合父合約標記的virtual函式使用

abstract

抽象合約

定於與現實分離,用於提高擴充套件性,消除**重複

inte***ce

介面不實現任何函式,只制定介面,其他合約繼承後需要實現

library

庫兩種使用方法,一種是using for,一種是直接例項化,自動新增庫所有方法給乙個資料型別

is繼承

可用「,」多繼承,存在鑽石問題,注意順序載入:base,base-a,base-a-a這樣寫。

import

匯入可以匯入其他sol檔案

constructor()

建構函式

初始化合約呼叫一次的函式

modifier

函式修飾符

修飾已有的函式,並且能自定義條件函式。

receive()

特殊函式

乙個合約只有乙個接收以太函式,在沒有payable修飾符還轉賬情況下自動呼叫。

fallback()

回退函式

externall型別,呼叫不存在的函式時呼叫,但是轉賬型別交易如果不加payable會報異常。

全域性變數

型別備註

ether

費用單位

以太單位,類似還有wei、 finney、 szabo

now時間單位

當前時間戳,因為是32位,會有2038問題。類似還有seconds、minutes、hours、days、weeks、years(0.5.0因閏年已移除)

msg.sender

全域性變數

當前呼叫者的address

msg.value

全域性變數

當前交易的wei數量

tx.gasprice

全域性變數

交易的 gas **

block.number

全域性變數

當前區塊號

更多請檢視solidity文件:特殊變數和函式

方法名描述

備註require()

錯誤處理

不滿足條件就撤銷更改,0.5版新增第二個引數可以丟擲message

assert()

錯誤處理

和 require 類似,require失敗會返回剩下的gas,assert則不會,出現嚴重錯誤時使用。

keccak256()

數學和密碼學函式

偽隨機的雜湊函式,更多數學和密碼學函式

uint8()

型別強轉

uint8 c = a * uint8(b); 類似的有uint256,uint16,但是uint8不能轉到uint256。

arr.push()

陣列成員方法

在尾部加入新元素,類似的還有length、pop

生成隨機數

0-100的隨機數

非安全,可能被算力強的節點利用,只打包對自己有利的區塊發布到鏈上:uint random = uint(keccak256(now, msg.sender, randnonce)) % 100

型別備註

5 ** 2

乘方操作

x 的 y次方,5 ** 2 = 25

變數名含"_"

私有變數名

一種習慣,區別全域性變數

public

函式修飾符

缺省會提供getter方法

uint

動態陣列

類似的有uint[10]固定陣列,person結構體陣列

return (a,b,c)

函式引數和返回

批量返回函式值和接受值 跟 go類似

_;佔位符

modifier中的_; 表示「被修飾的函式開始執行」

0x0黑洞位址

沒有私鑰的位址,常用來燒幣,主動報廢一些token。

庫名描述

備註safemath

安全數**算

可防止 overflow 和 underflow 的加減乘除

safecast

安全型別轉換

和safemath類似,防止轉換時的 overflow 和 underflow

ownable

訪問許可權

合約的主人才可以呼叫哦

roles

角色控制、訪問層次

比ownable多了個角色概念,可以進行許可權分組了。

erc20

代幣標準

普通代幣的一些定義

erc721

代幣標準

用於加密收藏品,有不可分割、不可互換、整單位交易等特性。

address

位址檢測

讓我看看你是個合約,還是使用者

具體描述參考:openzeppelin 7個最常使用的合約

view的定義是唯讀不改,不會真正改變鏈上任何資料。因此使用者從外部呼叫乙個view修飾的函式,不會產生任何gas。

如果 乙個 view 函式有進行 內部呼叫,雖然不屬於同乙個合約,但依舊會產生gas。因為呼叫的函式會生成事務,要進行節點驗證產生成本。所以只有外部呼叫view是免費的。

struct minime
在struct裡使用合適的uint型別,並且把同樣型別的變數放一起(即在 struct 中將把變數按照型別依次放置), 這樣能讓solidity空間最小化。

用uint8代替uint256並不會節省空間,因為solidity會預設使用256保留。

參考:

Solidity 發布代幣合約

pragma solidity 0.4.24 contract token function transfer address to,uint256 value public 簡單的發布代幣合約。another 另乙個合約 介面 pragma solidity 0.4.20 contract erc...

solidity合約呼叫合約方法的方式

1.通過介面的形式 pragma solidity 0.7.0 0.8.0 spdx license identifier mit inte ce irc20 contract attack function despoit public payable tract.withdraw 1 ether...

solidity智慧型合約程式設計基礎

基礎語法 一 1 函式定義 function 函式名 引數型別 引數1,引數型別 引數2 訪問許可權 讀取資料型別函式 returns 返回資料型別 訪問許可權 public private 一般private許可權的話,引數命名前面加乙個 例如 name 讀取資料型別函式 view函式 唯讀且不可...