日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

以太坊智能合约开发2-Solidity语法学习

發(fā)布時(shí)間:2023/12/8 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 以太坊智能合约开发2-Solidity语法学习 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。