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