2021-9-9 前端達(dá)人
智能合約并非現(xiàn)實(shí)中常見(jiàn)的合同,而是存在區(qū)塊鏈上,可以被觸發(fā)執(zhí)行的一段程序代碼,這些代碼實(shí)現(xiàn)了某種預(yù)定的規(guī)則,是存在于區(qū)塊鏈執(zhí)行環(huán)境中的“自治代理”。智能合約需要被觸發(fā),代碼才會(huì)執(zhí)行,不被觸發(fā)他的狀態(tài)將會(huì)始終保持一個(gè)狀態(tài),并且部署后的智能合約將不可被修改。智能合約語(yǔ)言的語(yǔ)法和js腳本語(yǔ)言很像,因此有過(guò)js開(kāi)發(fā)經(jīng)驗(yàn)的小伙伴們學(xué)習(xí)起來(lái)會(huì)很快。
我們都知道“預(yù)先善其事、必先利其器”的道理,現(xiàn)實(shí)中織布是需要織布機(jī)才能完成織布,同樣的我們的智能合約學(xué)習(xí)也是要有編程工具的使用的。我們本套課程都將以 remix 為編程工具進(jìn)行講解課程。remix 就是我們手里的織布機(jī),能織出什么布就看我們這些使用 remix 的程序員了。
地址為(http://remix.ethereum.org/)可以直接在瀏覽器中開(kāi)發(fā),很方便,只要有一個(gè) google chrome 谷歌瀏覽器就可以開(kāi)發(fā)了。
remix 有幾個(gè)主要的常用面板,分別是文件面板、編譯器、運(yùn)行器、以及占用最大一部分的文本編輯器組成。
文件面板:我們可以在這個(gè)面板進(jìn)行創(chuàng)建文件、選擇文件等管理文件的操作。
編譯器:我們可以將sol文件進(jìn)行編譯,編譯不通過(guò)將不能執(zhí)行合約,并且可以得到code.json以及abi.json。我們可以將他們?cè)谥С謘ol語(yǔ)言的公鏈上運(yùn)行。
運(yùn)行器:可以將sol智能合約部署在eth鏈上,并且能對(duì)合約的方法進(jìn)行調(diào)用等操作。
文本編輯器:我們的代碼就是寫(xiě)在這個(gè)位置的,后面基本大部分時(shí)間你將面對(duì)的是這個(gè)頁(yè)面。
下面的智能合約是我們第一個(gè)合約程序,因此我們命名為 “FirstContract.sol” 文件名
pragma solidity ^0.6.0;
// first contract
contract FirstContract {
// first method
function firstMethod() public pure returns (string memory) {
return 'I am first method !!!';
}
}
上面代碼很多小伙伴應(yīng)該不是很懂什么意思,不懂沒(méi)關(guān)系,我來(lái)給大家一行一行講解。
pragma solidity ^0.6.0;
這一行是說(shuō)明使用solidity 0.6.0版本寫(xiě)的,可以運(yùn)行在0.6.0到0.7.0之間的版本上。
contract FirstContract {
這一句是定義一個(gè)叫 FirstContract 名稱的合約。
function firstMethod() public pure returns (string memory){
這一行是定義一個(gè)方法叫做 firstMethod, 該方法有返回值,類(lèi)型是 string 類(lèi)型的。
return ‘I am first method !!!’;
這一行是這個(gè)方法將會(huì)返回 “I am first method !!!”。
看起來(lái)可能還是會(huì)有小伙伴們有不明白的地方,但是我們先只教這么多,關(guān)于什么是string,string 就是字符串的意思,字符串你就可以當(dāng)作是任意的abcde這些字母等還有標(biāo)點(diǎn)符號(hào)寫(xiě)在了單引號(hào)或者雙引號(hào)中。這就是字符串最通俗易懂的解釋了,小伙伴們,大家可以動(dòng)手試試自定義一些字符串讓他返回。
在solidity中,合約有點(diǎn)類(lèi)似面向?qū)ο笳Z(yǔ)言中的類(lèi),每個(gè)合約中包含狀態(tài)變量、函數(shù)、函數(shù)變量、函數(shù)修飾器、事件、結(jié)構(gòu)、和枚舉類(lèi)的聲明,合約也可以繼承其他的合約。大家可能對(duì)類(lèi)和類(lèi)中的結(jié)構(gòu)的概念沒(méi)有什么了解,我簡(jiǎn)單給大家舉個(gè)例子。一個(gè)類(lèi)可以比作是汽車(chē),汽車(chē)?yán)锩娴挠途褪亲兞?,然后油門(mén)、剎車(chē)等就是函數(shù),我們踩油門(mén)相當(dāng)于調(diào)用類(lèi)中的函數(shù),汽車(chē)動(dòng)起來(lái),油減少,相當(dāng)于變量值改變了。
我們來(lái)根據(jù)上面的描述寫(xiě)一個(gè)汽車(chē)的合約。先使用remix 創(chuàng)建一個(gè)CarContract1.sol文件,然后設(shè)定一個(gè)CarContract1名字的合約。汽車(chē)有了,還要有一個(gè)油箱,設(shè)定一個(gè)變量_gasoline,作為油箱。然后我們?cè)俳o汽車(chē)加一個(gè)油門(mén),寫(xiě)一個(gè)startUp函數(shù)作為油門(mén)。現(xiàn)在有了油箱但是不知道有多少油,再加gatGasoline函數(shù)作為一個(gè)儀表盤(pán)。咱們只有油箱沒(méi)有油汽車(chē)也跑不了,在加一個(gè)加油的接口,給汽車(chē)加油,使用addGasoline函數(shù)進(jìn)行加油。下面就是我們完整的小汽車(chē)的代碼。
CarContract1.sol
pragma solidity ^0.6.0;
contract CarContract1 {
uint256 _gasoline;
function startUp() public {
require(_gasoline >= 1, "gasoline is not haved");
_gasoline = _gasoline - 1;
}
function getGasoline() public view returns(uint256 gasoline) {
return _gasoline;
}
function addGasoline(uint256 gasoline) public {
_gasoline = _gasoline + gasoline;
}
}
小汽車(chē)合約中的_gasoline就是我們定義的狀態(tài)變量,類(lèi)型是 uint256 類(lèi)型。 該變量是存儲(chǔ)在鏈上的,也就是說(shuō)他的數(shù)據(jù)是被保存起來(lái)的,每次改動(dòng)都會(huì)記錄下來(lái)。因此我們?cè)谶M(jìn)行調(diào)用 addGasoline 函數(shù)時(shí),會(huì)給這個(gè)小汽車(chē)加油成功,_gasoline 的值會(huì)變化,同樣的我們調(diào)用 startUp 函數(shù)時(shí),_gasoline 的值也會(huì)變化。
在CarContract1小汽車(chē)中,startUp()、getGasoline()、addGasoline(uint256 gasoline) 都是函數(shù)。這些函數(shù)有的是沒(méi)有參數(shù)的,又叫無(wú)參函數(shù),比如:startUp()、getGasoline()。有的是有參數(shù)的,就叫有參函數(shù),比如:addGasoline(uint256 gasoline)。這些函數(shù),有的有返回值,有的沒(méi)有返回值,根據(jù)具體場(chǎng)景來(lái)定,一般call操作都是有返回值的,call操作不會(huì)改變合約狀態(tài)。只有send操作,才會(huì)進(jìn)行改變合約的狀態(tài)。
3、 函數(shù)變量
我們都知道加不同的型號(hào)汽油會(huì)有不一樣的效果,我們來(lái)給汽車(chē)換下不同的型號(hào)汽油,在汽車(chē)上我們放置一個(gè)桶名字是_bucket,用來(lái)裝另一個(gè)型號(hào)的汽油。如果我們自己的兩個(gè)容器里面有一個(gè)是空的,我們可以直接進(jìn)行轉(zhuǎn)換汽油。但是我們自己的兩個(gè)容器中都有油的時(shí)候,兩個(gè)容器很明顯不能進(jìn)行交換汽油,這個(gè)時(shí)候我們需要向隔壁的老李借一個(gè)桶 __tempBucket,這樣三個(gè)容器就能進(jìn)行轉(zhuǎn)換油箱里面的汽油和桶里面的汽油進(jìn)行對(duì)換了,換完以后把桶還回去。
我們進(jìn)行在進(jìn)行造一個(gè)新的小汽車(chē)名字是CarContract2,增加一個(gè)桶,設(shè)定變量為_(kāi)bucket,作為桶。還需要記錄當(dāng)前汽車(chē)的油的型號(hào)。設(shè)定變量 _gasolineType 為當(dāng)前油類(lèi)型,默認(rèn)是 1類(lèi)型。設(shè)定一個(gè)函數(shù) changeGasolineType,進(jìn)行交換汽油類(lèi)型,在設(shè)定一個(gè)函數(shù)進(jìn)行查看當(dāng)前汽車(chē)的類(lèi)型 getGasolineType 。至此我們小汽車(chē)升級(jí)成功。
CarContract2.sol
pragma solidity ^0.6.0;
contract CarContract2 {
uint256 _gasoline;
uint256 _bucket;
int _gasolineType = 1;
function startUp() public {
require(_gasoline >= 1, "gasoline is not haved");
_gasoline = _gasoline - 1;
}
function getGasoline() public view returns(uint256 gasoline) {
return _gasoline;
}
function addGasoline(uint256 gasoline) public {
_gasoline += gasoline;
}
function changeGasolineType() public {
require(_gasoline != 0 || _bucket != 0, "can not change");
if (_gasoline == 0) {
_gasoline = _bucket;
_bucket = 0;
} else if (_bucket == 0) {
_bucket = _gasoline;
_gasoline = 0;
} else {
uint256 __tempBucket = _gasoline;
_gasoline = _bucket;
_bucket = __tempBucket;
}
_gasolineType = -1 * _gasolineType;
}
function getGasolineType() public view returns(int gasolineType) {
return _gasolineType;
}
}
上面的小汽車(chē)2代正式出爐,我來(lái)給大家講下做了那些升級(jí),首先我們的changeGasolineType內(nèi)部定義了 __tempBucket 變量,該變量就是函數(shù)變量,是臨時(shí)創(chuàng)建的并且不會(huì)被記錄在鏈上的變量,也就是我們用完就還給隔壁老李了,還回去的時(shí)候桶是空的。
我們的小汽車(chē)還是很簡(jiǎn)單,我們?cè)诮o他加一點(diǎn)東西,規(guī)定小汽車(chē)要想啟動(dòng)必須關(guān)閉車(chē)門(mén)。
下面我們?cè)僖淮涡薷奈覀兊男∑?chē),加一個(gè)_doorStatus狀態(tài)變量作為我們的車(chē)門(mén)狀態(tài)。再加連個(gè)函數(shù)getDoorStatus()、changeDoorStatus(),用來(lái)控制開(kāi)門(mén)/關(guān)門(mén)并且查看門(mén)的狀態(tài)。并且加入一個(gè)whenDoorClose()作為我們的判斷器。
pragma solidity ^0.6.0;
contract CarContract3 {
uint256 _gasoline;
uint256 _bucket;
int _gasolineType = 1;
bool _doorStatus;
modifier whenDoorClose() {
require(!_doorStatus, "door is not close");
_;
}
function startUp() public whenDoorClose {
require(_gasoline >= 1, "gasoline is not haved");
_gasoline = _gasoline - 1;
}
function getGasoline() public view returns(uint256 gasoline) {
return _gasoline;
}
function addGasoline(uint256 gasoline) public {
_gasoline += gasoline;
}
function changeGasoline() public {
require(_gasoline != 0 || _bucket != 0, "can not change");
if (_gasoline == 0) {
_gasoline = _bucket;
_bucket = 0;
} else if (_bucket == 0) {
_bucket = _gasoline;
_gasoline = 0;
} else {
uint256 __tempBucket = _gasoline;
_gasoline = _bucket;
_bucket = __tempBucket;
}
_gasolineType = -1 * _gasolineType;
}
function getGasolineType() public view returns(int gasolineType) {
return _gasolineType;
}
function getDoorStatus() public view returns(bool doorStatus) {
return _doorStatus;
}
function changeDoorStatus() public {
_doorStatus = ! _doorStatus;
}
}
上面我們的3代小汽車(chē)已經(jīng)完成了,whenDoorClose() 就是我們定義的函數(shù)修飾器 使用modifier 來(lái)定義的。
每次都到?jīng)]有油了才去加油,我們加一個(gè)功能,當(dāng)行駛時(shí)油量低于5的時(shí)候我們要進(jìn)行預(yù)警。
我們加入一個(gè) gasolineAlarm 事件,該事件有一個(gè)參數(shù),當(dāng)前的油量。這樣我們?cè)趩?dòng)的函數(shù)中加入這個(gè)事件的調(diào)用,判斷本次使用后的油量是否小于等于5,是的話進(jìn)行調(diào)用該事件
pragma solidity ^0.6.0;
contract CarContract4 {
uint256 _gasoline;
uint256 _bucket;
int _gasolineType = 1;
bool _doorStatus;
modifier whenDoorClose() {
require(!_doorStatus, "door is not close");
_;
}
event gasolineAlarm(uint256 gasoline);
function startUp() public whenDoorClose {
require(_gasoline >= 1, "gasoline is not haved");
_gasoline = _gasoline - 1;
if (_gasoline <= 5) {
emit gasolineAlarm(_gasoline);
}
}
function getGasoline() public view returns(uint256 gasoline) {
return _gasoline;
}
function addGasoline(uint256 gasoline) public {
_gasoline += gasoline;
}
function changeGasoline() public {
require(_gasoline != 0 || _bucket != 0, "can not change");
if (_gasoline == 0) {
_gasoline = _bucket;
_bucket = 0;
} else if (_bucket == 0) {
_bucket = _gasoline;
_gasoline = 0;
} else {
uint256 __tempBucket = _gasoline;
_gasoline = _bucket;
_bucket = __tempBucket;
}
_gasolineType = -1 * _gasolineType;
}
function getGasolineType() public view returns(int gasolineType) {
return _gasolineType;
}
function getDoorStatus() public view returns(bool doorStatus) {
return _doorStatus;
}
function changeDoorStatus() public {
_doorStatus = ! _doorStatus;
}
}
我們已經(jīng)更新到第四代小汽車(chē)了,四代小汽車(chē)的gasolineAlarm 就是我們定義的事件,事件是會(huì)在虛擬機(jī)上記錄一條日志的,我么可以通過(guò)查詢?nèi)罩镜姆绞降玫绞录?nèi)容。
我們的汽車(chē)感覺(jué)成熟了,這個(gè)時(shí)候我們要給我們的汽車(chē)打上一些特性,比如顏色,比如車(chē)輪數(shù),比如車(chē)門(mén)數(shù)等等。
我們?cè)谛∑?chē)?yán)锩婕尤隒arInfo結(jié)構(gòu)體,里面可以定義color顏色,wheelNum 車(chē)輪數(shù)等等,然后我們加入設(shè)置和獲取的函數(shù):setCarInfo()、getCarInfo(), 這樣我們的小汽車(chē)就有了一些參數(shù)了。
pragma solidity ^0.6.0;
contract CarContract5 {
uint256 _gasoline;
uint256 _bucket;
int _gasolineType = 1;
bool _doorStatus;
struct CarInfo {
string color;
uint8 wheelNum;
}
CarInfo _carInfo;
modifier whenDoorClose() {
require(!_doorStatus, "door is not close");
_;
}
event gasolineAlarm(uint256 gasoline);
function startUp() public whenDoorClose {
require(_gasoline >= 1, "gasoline is not haved");
_gasoline = _gasoline - 1;
if (_gasoline <= 5) {
emit gasolineAlarm(_gasoline);
}
}
function getGasoline() public view returns(uint256 gasoline) {
return _gasoline;
}
function addGasoline(uint256 gasoline) public {
_gasoline += gasoline;
}
function changeGasoline() public {
require(_gasoline != 0 || _bucket != 0, "can not change");
if (_gasoline == 0) {
_gasoline = _bucket;
_bucket = 0;
} else if (_bucket == 0) {
_bucket = _gasoline;
_gasoline = 0;
} else {
uint256 __tempBucket = _gasoline;
_gasoline = _bucket;
_bucket = __tempBucket;
}
_gasolineType = -1 * _gasolineType;
}
function getGasolineType() public view returns(int gasolineType) {
return _gasolineType;
}
function getDoorStatus() public view returns(bool doorStatus) {
return _doorStatus;
}
function changeDoorStatus() public {
_doorStatus = ! _doorStatus;
}
function setCarInfo(string memory color, uint8 wheelNum) public {
_carInfo.color = color;
_carInfo.wheelNum = wheelNum;
//_carInfo = CarInfo(color, wheelNum);
}
function getCarInfo() public view returns(string memory color, int wheelNum) {
color = _carInfo.color;
wheelNum = _carInfo.wheelNum;
}
}
我們的5代小汽車(chē)加入了CarInfo就是結(jié)構(gòu)體,結(jié)構(gòu)體中不能進(jìn)行設(shè)置初值,我們能把一類(lèi)的屬性等進(jìn)行分類(lèi)的放在結(jié)構(gòu)體中,可以充當(dāng)我們的數(shù)據(jù)模型。
我們的小汽車(chē)想要開(kāi)門(mén),需要打開(kāi)車(chē)鎖,車(chē)鎖是一種狀態(tài),開(kāi)/關(guān)。
我們加入枚舉類(lèi)DoorSwitch,定義兩個(gè)狀態(tài)open,close 。在定義whenDoorSwitch函數(shù)修飾器,進(jìn)行判斷。
pragma solidity ^0.6.0;
contract CarContract6 {
uint256 _gasoline;
uint256 _bucket;
int _gasolineType = 1;
bool _doorStatus;
enum DoorSwitch{ open, close }
DoorSwitch _doorSwitch;
struct CarInfo {
string color;
uint8 wheelNum;
}
CarInfo _carInfo;
modifier whenDoorClose() {
require(!_doorStatus, "door is not close");
_;
}
modifier whenDoorSwitch() {
if (!_doorStatus) {
require(_doorSwitch == DoorSwitch.open, "door switch is close");
}
_;
}
event gasolineAlarm(uint256 gasoline);
function startUp() public whenDoorClose {
require(_gasoline >= 1, "gasoline is not haved");
_gasoline = _gasoline - 1;
if (_gasoline <= 5) {
emit gasolineAlarm(_gasoline);
}
}
function getGasoline() public view returns(uint256 gasoline) {
return _gasoline;
}
function addGasoline(uint256 gasoline) public {
_gasoline += gasoline;
}
function changeGasoline() public {
require(_gasoline != 0 || _bucket != 0, "can not change");
if (_gasoline == 0) {
_gasoline = _bucket;
_bucket = 0;
} else if (_bucket == 0) {
_bucket = _gasoline;
_gasoline = 0;
} else {
uint256 __tempBucket = _gasoline;
_gasoline = _bucket;
_bucket = __tempBucket;
}
_gasolineType = -1 * _gasolineType;
}
function getGasolineType() public view returns(int gasolineType) {
return _gasolineType;
}
function getDoorStatus() public view returns(bool doorStatus) {
return _doorStatus;
}
function changeDoorStatus() public {
_doorStatus = ! _doorStatus;
}
function setCarInfo(string memory color, uint8 wheelNum) public {
_carInfo.color = color;
_carInfo.wheelNum = wheelNum;
//_carInfo = CarInfo(color, wheelNum);
}
function getCarInfo() public view returns(string memory color, int wheelNum) {
color = _carInfo.color;
wheelNum = _carInfo.wheelNum;
}
function setDoorSwitch(DoorSwitch doorSwitch) public {
_doorSwitch = doorSwitch;
}
}
我們已經(jīng)更新到6代小汽車(chē)了,在6代小汽車(chē)中我們加入了DoorSwitch車(chē)門(mén)的開(kāi)關(guān),使用的就是枚舉定義的,在實(shí)際項(xiàng)目中枚舉定義的話,一般使用在狀態(tài)和類(lèi)型的定義上,方便進(jìn)行管理。
到此我們的小汽車(chē)已經(jīng)完成了,經(jīng)歷了6代的更新,相信大家對(duì)于本節(jié)課程有空了一定的了解了。智能合約包含的狀態(tài)變量、函數(shù)、函數(shù)變量、函數(shù)修飾器、事件、結(jié)構(gòu)、枚舉類(lèi)都已經(jīng)在制作和升級(jí)小汽車(chē)中使用了。
在solidity中有專(zhuān)門(mén)的數(shù)據(jù)類(lèi)型,什么是數(shù)據(jù)類(lèi)型呢,我們可以認(rèn)為數(shù)字是類(lèi)型,是否是類(lèi)型,地址是類(lèi)型等。在solidity中存在以下常用的類(lèi)型,uint/int、bool、 address、 mapping、bytes、string、fixed/ufixed 常用的類(lèi)型。
pragma solidity ^0.6.0;
contract Test {
uint v1 = 1;
int v2 = -2;
bool v3 = true;
address v4 = 0x8a5fa31F2bf83812ECd8E5Ef1878dD12bBaDb40C;
mapping(uint => uint) v5;
bytes v6 = "0x123";
string v7 = "asd";
fixed v8 = 1.3;
ufixed v9 = 1.2;
}
uint/int 類(lèi)型都是整型,也就是都是整數(shù)。1、2、3、4類(lèi)似的數(shù)沒(méi)有小數(shù)點(diǎn)。區(qū)別是uint是沒(méi)有符號(hào)的。看代碼中的 v1 就是無(wú)符號(hào)整數(shù),v2就是有符號(hào)整數(shù)。默認(rèn)是0
bool 中文是布爾類(lèi)型,表示是/否的類(lèi)型。v3就是bool類(lèi)型,只有兩個(gè)值 true/false,默認(rèn)是false
address是地址類(lèi)型,存儲(chǔ)地址的,賬戶地址,合約地址等,都可以。
映射類(lèi)型示例中的代碼不是很全,我來(lái)解釋下,實(shí)際上他是一個(gè)key-value模型,也就是一個(gè)key對(duì)應(yīng)一個(gè)value。比如我們說(shuō)小明,我們就是到小明這個(gè)人。就是這個(gè)道理。
定長(zhǎng)數(shù)組,就是說(shuō)他的長(zhǎng)度是固定的,不能改變,設(shè)定是多少就是多少。
字符串類(lèi)型,可以放字符串,長(zhǎng)度是255位二級(jí)制數(shù)。
浮點(diǎn)類(lèi)型,就是帶有小數(shù)點(diǎn)的,1.2、1.4、1.9這類(lèi)數(shù)值。也是分為有無(wú)符號(hào)項(xiàng)。
在solidity中可以使用以下控制結(jié)構(gòu),有 if,else,while,for,break,continue,return,? : 我們來(lái)以此介紹這些結(jié)構(gòu)。
大家肯定好奇什么是if else語(yǔ)句。他就是我們說(shuō)的如果 否者。也就是說(shuō)如果我怎么樣否者我怎么樣。注意else只能與if一同使用,大家一起來(lái)看下面代碼:
pragma solidity ^0.6.0;
contract Test {
uint256 temp;
function test1(bool doorSwitch) public {
if (doorSwitch) {
temp = 1;
}
}
function test2(bool doorSwitch) public {
if (doorSwitch) {
temp = 1;
}
temp = 2;
}
function test3(bool doorSwitch) public {
if (doorSwitch) {
temp = 1;
} else {
temp = 2;
}
}
function getTemp() public view returns(uint256){
return temp;
}
}
上面代碼中我們定義了三個(gè)測(cè)試方法,以及一個(gè)獲取temp值的方法。第一個(gè)測(cè)試方法表示如果我們傳進(jìn)去的doorSwitch是true,門(mén)是開(kāi)的,那么temp就等于1,否者doorSwitch等于false的話temp值不變。第二個(gè)測(cè)試方法表示如果我們傳進(jìn)去的doorSwitch是true,門(mén)是開(kāi)的,那么temp就先等于1,然后等于2,否者doorSwitch等于false的話temp直接等于2。第三個(gè)測(cè)試方法表示如果我們傳進(jìn)去的doorSwitch是true,門(mén)是開(kāi)的,那么temp就等于1,否者doorSwitch等于false的話temp等于2。
while 語(yǔ)句是循環(huán)語(yǔ)句,表示滿足條件就一直循環(huán),一般我么會(huì)和break來(lái)使用,當(dāng)達(dá)到某種情況進(jìn)行跳出循環(huán),可以讓循環(huán)體自動(dòng)結(jié)束循環(huán)。
pragma solidity ^0.6.0;
contract Test {
function test1() public {
int a = 1;
while(true) {
if (a == 5) {
break;
}
a++;
}
}
function test2() public {
int a = 1;
while(a != 5) {
a++;
}
}
}
上面兩個(gè)函數(shù)內(nèi)部都有一個(gè)循環(huán),實(shí)際上兩個(gè)循環(huán)的效果是一樣的,有一些細(xì)微的差別,需要根據(jù)具體業(yè)務(wù)場(chǎng)景分析了,不建議使用while 一不小心死循環(huán)就不好玩了。
for循環(huán)概念直接上代碼大家好理解些。
pragma solidity ^0.6.0;
contract Test {
function test1() public {
for(uint8 i = 0; i < 10; i ++) {
...
}
}
}
上面就是一個(gè)常用的for循環(huán)使用方式,循環(huán)10次 “…” 的內(nèi)容。
continue語(yǔ)句是跳過(guò)本次循環(huán)進(jìn)入下一次循環(huán),來(lái)看代碼:
pragma solidity ^0.6.0;
contract Test {
function test1() public {
for(uint8 i = 0; i < 10; i ++) {
if (i == 3) {
continue;
}
...
}
}
}
上面的代碼是如果i = 3后跳過(guò)這次循環(huán)。
return 是返回的命令當(dāng)遇到return時(shí)就是表示結(jié)束了??创a:
pragma solidity ^0.6.0;
contract Test {
function test1() public {
for(uint8 i = 0; i < 10; i ++) {
if (i == 3) {
return;
}
...
}
}
}
上面的代碼可以看出,運(yùn)行到i = 3時(shí),程序直接結(jié)束。
到此我們的控制語(yǔ)句基本學(xué)習(xí)結(jié)束。這些概念每個(gè)語(yǔ)言都差不多,所以很重要。多練小伙伴!
學(xué)習(xí)完上面的課程大家對(duì)于智能合約基本已經(jīng)學(xué)習(xí)好了,但是還是缺乏使用,只是知道有啥東西,什么時(shí)候用不知道,這個(gè)時(shí)候需要大家進(jìn)行鍛煉了,多寫(xiě)一些小東西練習(xí)。
分享此文一切功德,皆悉回向給文章原作者及眾讀者.
免責(zé)聲明:藍(lán)藍(lán)設(shè)計(jì)尊重原作者,文章的版權(quán)歸原作者。如涉及版權(quán)問(wèn)題,請(qǐng)及時(shí)與我們?nèi)〉寐?lián)系,我們立即更正或刪除。
來(lái)源:csdn
作者:淡淡的夏日憂傷
藍(lán)藍(lán)設(shè)計(jì)( www.yvirxh.cn )是一家專(zhuān)注而深入的界面設(shè)計(jì)公司,為期望卓越的國(guó)內(nèi)外企業(yè)提供卓越的UI界面設(shè)計(jì)、BS界面設(shè)計(jì) 、 cs界面設(shè)計(jì) 、 ipad界面設(shè)計(jì) 、 包裝設(shè)計(jì) 、 圖標(biāo)定制 、 用戶體驗(yàn) 、交互設(shè)計(jì)、 網(wǎng)站建設(shè) 、平面設(shè)計(jì)服務(wù)
藍(lán)藍(lán)設(shè)計(jì)的小編 http://www.yvirxh.cn