參考文章:一文速覽2022十大智能合約開(kāi)發(fā)工具
資料地址:WTF學(xué)院
Solidity極簡(jiǎn)入門(mén)
HelloWorld
remix:在線(xiàn)智能合約開(kāi)發(fā)IDE(Integrated Development Environment,集成開(kāi)發(fā)環(huán)境),可以在瀏覽器中快速部署測(cè)試智能合約。
合約HelloWorld:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
contract HelloWeb3{
string public hi = "Hello World!";
}
事項(xiàng) | 說(shuō)明 |
---|---|
代碼所用的軟件許可(license) | 不寫(xiě)許可的話(huà)編譯時(shí)會(huì)警告(warning) |
聲明源文件所用的solidity版本 | 將不允許小于 0.8.4 版本或大于等于 0.9.0 版本的編譯器編譯 |
Solidity語(yǔ)句分隔符 | 以 ; 結(jié)尾 |
在合約目錄新建 HelloWorld.sol,點(diǎn)擊編譯然后再點(diǎn)擊部署。部署在測(cè)試鏈上以后,點(diǎn)擊我們的變量名就能調(diào)用成功。
數(shù)值類(lèi)型
類(lèi)型 | 說(shuō)明 |
---|---|
數(shù)值類(lèi)型 | 布爾型bool |
整數(shù)型 | 包括整數(shù)int、正整數(shù)uint、大正整數(shù)uint256 |
地址類(lèi)型address和payable | 其中payable的地址擁有balance和transfer()兩個(gè)成員 |
定長(zhǎng)字節(jié)數(shù)組 | byte, bytes8, bytes32,其中數(shù)字是長(zhǎng)度 |
枚舉enum | 類(lèi)似python的集合類(lèi)型,enum ActionSet { Buy, Hold, Sell } |
- | 可以顯式的和uint相互轉(zhuǎn)換,并會(huì)檢查轉(zhuǎn)換的正整數(shù)是否在枚舉的長(zhǎng)度內(nèi) |
三種函數(shù)類(lèi)型
[pure|view|payable]
:決定函數(shù)權(quán)限/功能的關(guān)鍵字。payable(可支付的)很好理解,帶著它的函數(shù),運(yùn)行的時(shí)候可以給合約轉(zhuǎn)入ETH。
合約的狀態(tài)變量存儲(chǔ)在鏈上,gas fee
很貴,如果不改變鏈上狀態(tài),就不用付gas。包含pure跟view關(guān)鍵字的函數(shù)是不改寫(xiě)鏈上狀態(tài)的,因此用戶(hù)直接調(diào)用他們是不需要付gas的(合約中非pure/view函數(shù)調(diào)用它們則會(huì)改寫(xiě)鏈上狀態(tài),需要付gas)。
在以太坊中,以下語(yǔ)句被視為修改鏈上狀態(tài):
- 寫(xiě)入狀態(tài)變量。
- 釋放事件。
- 創(chuàng)建其他合同。
- 使用selfdestruct.
- 通過(guò)調(diào)用發(fā)送以太幣。
- 調(diào)用任何未標(biāo)記view或pure的函數(shù)。
- 使用低級(jí)調(diào)用(low-level calls)。
- 使用包含某些操作碼的內(nèi)聯(lián)匯編。
小結(jié):
-
pure
類(lèi)型的函數(shù)不能讀取也不能寫(xiě)入存儲(chǔ)在鏈上的狀態(tài)變量,只能傳入形參進(jìn)行處理。 -
view
類(lèi)型的函數(shù)能讀取但也不能寫(xiě)入狀態(tài)變量,可以調(diào)用合約變量返回給一個(gè)新的變量。
函數(shù)輸出
函數(shù)輸出包括:返回多種變量、命名式返回、以及利用解構(gòu)式賦值讀取全部和部分返回值。
Solidity有兩個(gè)關(guān)鍵字與函數(shù)輸出相關(guān):return和returns,區(qū)別在于:
- returns加在函數(shù)名后面,用于聲明返回的變量類(lèi)型及變量名;
- return用于函數(shù)主體中,返回指定的變量。
命名式返回:通過(guò)在 returns
標(biāo)明返回變量的名稱(chēng),solidity 會(huì)自動(dòng)初始化并返回這些變量,無(wú)需 return 語(yǔ)句。
解構(gòu)式賦值:solidity使用解構(gòu)式賦值的規(guī)則,支持讀取函數(shù)的全部或部分返回值。
變量作用域
引用類(lèi)型(Reference Type):包括數(shù)組(array),結(jié)構(gòu)體(struct)和映射(mapping),這類(lèi)變量占空間大,賦值時(shí)候直接傳遞地址(類(lèi)似指針)。由于這類(lèi)變量比較復(fù)雜,占用存儲(chǔ)空間大,我們?cè)谑褂脮r(shí)必須要聲明數(shù)據(jù)存儲(chǔ)的位置。
solidity數(shù)據(jù)存儲(chǔ)位置有三類(lèi):storage,memory和calldata。不同存儲(chǔ)位置的gas成本不同。
storage類(lèi)型的數(shù)據(jù)存在鏈上,類(lèi)似計(jì)算機(jī)的硬盤(pán),消耗gas多;memory和calldata類(lèi)型的臨時(shí)存在內(nèi)存里,消耗gas少。大致用法:
- storage:合約里的狀態(tài)變量默認(rèn)都是storage,存儲(chǔ)在鏈上。
- memory:函數(shù)里的參數(shù)和臨時(shí)變量一般用memory,存儲(chǔ)在內(nèi)存中,不上鏈。
- calldata:和memory類(lèi)似,存儲(chǔ)在內(nèi)存中,不上鏈。與memory的不同點(diǎn)在于calldata變量不能修改(immutable),一般用于函數(shù)的參數(shù)。
賦值規(guī)則:只有兩種同類(lèi)型變量的賦值是創(chuàng)建地址引用
- storage(合約的狀態(tài)變量)賦值給本地storage(函數(shù)里的)時(shí)候,會(huì)創(chuàng)建引用,改變新變量會(huì)影響原變量。
- storage賦值給memory,會(huì)創(chuàng)建獨(dú)立的復(fù)本,修改其中一個(gè)不會(huì)影響另一個(gè);反之亦然。
- memory賦值給memory,會(huì)創(chuàng)建引用,改變新變量會(huì)影響原變量。
- 其他情況,變量賦值給storage,會(huì)創(chuàng)建獨(dú)立的復(fù)本,修改其中一個(gè)不會(huì)影響另一個(gè)
變量的作用域:按作用域劃分有三種,分別是狀態(tài)變量(state variable),局部變量(local variable)和全局變量(global variable)
- 狀態(tài)變量是數(shù)據(jù)存儲(chǔ)在鏈上的變量,所有合約內(nèi)函數(shù)都可以訪問(wèn) ,gas消耗高。狀態(tài)變量在合約內(nèi)、函數(shù)外聲明
- 局部變量是僅在函數(shù)執(zhí)行過(guò)程中有效的變量,函數(shù)退出后,變量無(wú)效。局部變量的數(shù)據(jù)存儲(chǔ)在內(nèi)存里,不上鏈,gas低
- 全局變量是指 solidity 的預(yù)留關(guān)鍵字
引用類(lèi)型
數(shù)組 Array 分為固定長(zhǎng)度數(shù)組和可變長(zhǎng)度數(shù)組兩種:
- 固定長(zhǎng)度數(shù)組:在聲明時(shí)指定數(shù)組的長(zhǎng)度。用T[k]的格式聲明
- 可變長(zhǎng)度數(shù)組(動(dòng)態(tài)數(shù)組):在聲明時(shí)不指定數(shù)組的長(zhǎng)度。用T[]的格式聲明
創(chuàng)建數(shù)組有一些固定規(guī)則:
- 對(duì)于memory修飾的動(dòng)態(tài)數(shù)組,可以用new操作符來(lái)創(chuàng)建,但是必須聲明長(zhǎng)度,并且聲明后長(zhǎng)度不能改變,例如
new uint[](5)
- 數(shù)組字面常數(shù)(Array Literals)是寫(xiě)作表達(dá)式形式的數(shù)組,用方括號(hào)包著來(lái)初始化array的一種方式
數(shù)組成員:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-493015.html
length: 數(shù)組有一個(gè)包含元素?cái)?shù)量的length成員,memory數(shù)組的長(zhǎng)度在創(chuàng)建后是固定的。
push(): 動(dòng)態(tài)數(shù)組和bytes擁有push()成員,可以在數(shù)組最后添加一個(gè)0元素。
push(x): 動(dòng)態(tài)數(shù)組和bytes擁有push(x)成員,可以在數(shù)組最后添加一個(gè)x元素。
pop(): 動(dòng)態(tài)數(shù)組和bytes擁有pop()成員,可以移除數(shù)組最后一個(gè)元素。
結(jié)構(gòu)體:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-493015.html
// 結(jié)構(gòu)體
struct Student{
uint256 id;
uint256 score;
}
到了這里,關(guān)于【區(qū)塊鏈-智能合約工程師】第二篇:Solidity入門(mén)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!