以太坊智能合约开发2-Solidity语法学习
solidity是一個面向對象的靜態語言,很多語法與java等語言很像,都有繼承,抽象、多態等概念,這里只重點記錄Solidity中的特有的內容。ps:以下有什么說的不對的地方歡迎大家指正,共同進步!
合約(Contract)
? 在solidity中,contract就是java等其它語言的對象的概念,稱為合約,其中包含狀態變量、方法、modifier方法、事件、異常、結構體、枚舉。此外,也有抽象合約、庫(libraries))、接口(interface)的對象,抽象合約和接口的使用和其它面向對象的語言完全一致。
? 狀態變量其實和java中的成員變量,如果為public方法,會默認為getter方法。
方法(Function)
? 有構造函數:**constructor(uint){…}**和普通函數:function helper(uint x) public pure returns (uint) {},函數可以有多個返回值。一個合約只能由一個構造函數。其中函數的變量有有memory和storage兩種類型。
- storage的結構是在合約部署創建時,根據你的合約中狀態變量的聲明,就固定下來了,并且不能在將來的合約方法調用中改變這個結構。storage中的內容是可以通過交易來改變的。
- memory關鍵字告訴solidity應當在該函數運行時為變量創建一塊空間,使其大小和結構滿足函數運行的需要。
? memory就是值傳遞,storage就是引用傳遞,但是當我們的函數參數如果為storage類型時,函數的可見性必須為internal或者private。
方法的可見性
? 方法的可見性為四種,可以被定義為:external, public, internal和private。
- external: 外部函數是合約接口的一部分,這意味著它們可以從其他合約調用。
- public:公共函數是合約接口的一部分,可以通過內部調用或通過消息調用。
- internal:這些函數和狀態變量只能內部訪問(即在當前合約或由它派生的合約),而不使用被外部合約訪問。
- private:私有函數和狀態變量僅僅在定義該合約中可見, 在派生的合約中不可見。
方法的修飾符
? 修飾符可用于以聲明方式更改函數的行為
- view:承諾該方法只讀豬肝湯,不修改狀態,但是不強制
- pure:承諾該方法即不讀取狀態,也不會修改狀態,編譯器并沒有強制執行pure方法不是從狀態中讀取的
- payable:表示該合約可以接受eth
- override:表示重寫
- virtual:允許在派生合約中更改函數或修飾符的行為
- modifier修飾符:可以用來改變一個函數的行為。修改器是一種合約屬性,可被繼承,同時還可被派生的合約重寫,也可以接受參數,也可以有多個modifier修飾符。(https://new.qq.com/rain/a/20220106a04xad00)
事件(Event)
? 事件是以太坊EVM提供的一種日志基礎設施。事件可以用來做操作記錄,存儲為日志。也可以用來實現一些交互功能,比如通知UI,返回函數調用結果等。emit關鍵字就是觸發事件。
異常(Errors)
? Solidity 使用狀態恢復異常來處理錯誤。這樣的異常會撤消對當前調用(及其所有子調用)中狀態所做的所有更改,并向調用者標記錯誤。
- assert(bool condition)
- require(bool condition)、require(bool condition, string memory message)
- revert()、revert(string memory message)
- try/catch語句:使用 try/catch 語句捕獲外部調用中的失敗try關鍵字后面必須跟一個表示外部函數調用或合約創建的表達式 ( ) 。表達式內部的錯誤不會被捕獲
? 結構體和枚舉都是和其他語言保持一致,不在過多描述。
類型(Types)
? Solidity中類型有:
- bool:布爾類型
- byte:bytes0 ~ bytes32
- int/uint:整數,int可以表示負數,有int8,int16等,int和uint就是int256和uint256
- address
- 數組:和golang中的數組很像
- string
- mapping類型:就是哈希表。無法枚舉所有的鍵值
地址類型(address)
? 地址類型有多個內置方法,有
- balance:該地址的余額
- transfer:合約向該地址轉賬多少錢
- send:合約向該地址轉賬多少錢,單位默認是wei
語法的內置特性
- bytes.concat(...) returns (bytes memory):將可變數量的參數連接到一個字節數組
- string.concat(...) returns (string memory):將可變數量的參數連接到一個字符串數組
- block.basefee( uint):當前區塊的基本費用
- block.chainid( uint): 當前鏈 id
- block.coinbase( ): 當前區塊礦工地址``
- block.difficulty( uint): 當前區塊難度
- block.gaslimit( uint): 當前區塊gas限制
- block.number( uint): 當前區塊號
- block.timestamp( uint): 自 Unix 紀元以來的當前區塊時間戳(以秒為單位)
- gasleft() returns (uint256): 剩余氣體
- msg.data( bytes): 完整的通話數據
- msg.sender( address): 當前消息的發送者
- msg.sig( bytes4):calldata 的前四個字節(即函數標識符)
- msg.value( uint): 隨消息發送的 wei 數量
- tx.gasprice( uint): 交易的gas價格
- tx.origin( address): 交易的發送者(完整的調用鏈)
- blockhash(uint blockNumber) returns (bytes32): 給定區塊的哈希 - 僅適用于 256 個最近的區塊
- keccak256(bytes memory) returns (bytes32): 計算輸入的 Keccak-256 哈希
- sha256(bytes memory) returns (bytes32): 計算輸入的 SHA-256 哈希
- ripemd160(bytes memory) returns (bytes20): 計算輸入的 RIPEMD-160 散列
- ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) returns (address):從橢圓曲線簽名中恢復與公鑰關聯的地址,錯誤返回零
- this(當前合約的類型):當前合約
- super: 繼承層次中更高一級的合約
- selfdestruct(address payable recipient):銷毀當前合約,將其資金發送到給定地址,只有所有者才能銷毀
- type(C).name( string): 合約名稱
- type(C).creationCode( ):給定合約的創建字節碼
- type(C).runtimeCode( ):給定合約的運行時字節碼
- type(I).interfaceId( bytes4):包含給定接口的 EIP-165 接口標識符的值
- type(T).min( T):整數類型可表示的最小值T
- type(T).max( T):整數類型可表示的最大值T
?
總結
以上是生活随笔為你收集整理的以太坊智能合约开发2-Solidity语法学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 推荐系统 | 威尔逊区间法
- 下一篇: c语言setfocus作用,C语言Fin