溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Solidity的基礎(chǔ)特性是什么

發(fā)布時間:2021-12-07 15:13:12 來源:億速云 閱讀:170 作者:iii 欄目:互聯(lián)網(wǎng)科技

這篇文章主要講解了“Solidity的基礎(chǔ)特性是什么”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Solidity的基礎(chǔ)特性是什么”吧!

智能合約代碼結(jié)構(gòu)

任何編程語言都有其規(guī)范的代碼結(jié)構(gòu),用于表達在一個代碼文件中如何組織和編寫代碼,Solidity也一樣。

本節(jié),我們將通過一個簡單的合約示例,來了解智能合約的代碼結(jié)構(gòu)。 智能合約編寫階段將從Solidity基礎(chǔ)特性、高級特性、設(shè)計模式以及編程攻略分別展開,帶讀者認識Solidity并掌握其運用,更好地進行智能合約開發(fā)。

Solidity的基礎(chǔ)特性是什么

和java不同的是,構(gòu)造函數(shù)不支持重載,只能指定一個構(gòu)造函數(shù)。

函數(shù)

函數(shù)被用來讀寫狀態(tài)變量。對變量的修改將會被包含在交易中,經(jīng)區(qū)塊鏈網(wǎng)絡(luò)確認后才生效。生效后,修改會被永久的保存在區(qū)塊鏈賬本中。

函數(shù)簽名定義了函數(shù)名、輸入輸出參數(shù)、訪問修飾符、自定義修飾符。

function setState(uint value) public onlyAdmin;

函數(shù)還可以返回多個返回值:

Solidity的基礎(chǔ)特性是什么

如果在view函數(shù)中嘗試修改狀態(tài)變量,或者在pure函數(shù)中訪問狀態(tài)變量,編譯器均會報錯。

事件

事件類似于日志,會被記錄到區(qū)塊鏈中,客戶端可以通過web3訂閱這些事件。

定義事件

event SetState(uint value);

構(gòu)造事件

emit SetState(value);

這里有幾點需要注意:

  • 事件的名稱可以任意指定,不一定要和函數(shù)名掛鉤,但推薦兩者掛鉤,以便清晰地表達發(fā)生的事情.

  • 構(gòu)造事件時,也可不寫emit,但因為事件和函數(shù)無論是名稱還是參數(shù)都高度相關(guān),這樣操作很容易筆誤將事件寫成函數(shù)調(diào)用,因此不推薦。

Solidity的基礎(chǔ)特性是什么

值得注意的是,定義在修飾符中的下劃線“_”,表示函數(shù)的調(diào)用,指代的是開發(fā)者用修飾符修飾的函數(shù)。在本例中,表達的是setState函數(shù)調(diào)用的意思。

智能合約的運行

了解了上述的智能合約示例的結(jié)構(gòu),就可以直接上手運行,運行合約的方式有多種,大家可以任意采取其中一種:

  • 方法一:可以使用FISCO BCOS控制臺的方式來部署合約

  • 方法二:使用FISCO BCOS開源項目WeBASE提供的在線ide WEBASE-front運行

  • 方法三:通過在線ide remix來進行合約的部署與運行

本例中使用remix作為運行示例。

編譯

首先,在remix的文件ide中鍵入代碼后,通過編譯按鈕來編譯。成功后會在按鈕上出現(xiàn)一個綠色對勾:

Solidity的基礎(chǔ)特性是什么

setState

合約部署后,我們來調(diào)用setState(4)。在執(zhí)行成功后,會產(chǎn)生一條交易收據(jù),里面包含了交易的執(zhí)行信息。

Solidity的基礎(chǔ)特性是什么

getState

調(diào)用getState后,可以直接看到所得到的值為4,正好是我們先前setState所傳入的值:

Solidity的基礎(chǔ)特性是什么

定長bytes系列

Solidity提供了bytes1到bytes32的類型,它們是固定長度的字節(jié)數(shù)組。

用戶可以讀取定長bytes的內(nèi)容。

Solidity的基礎(chǔ)特性是什么

這里有一個關(guān)鍵細節(jié),Solidity采取大端序編碼,高地址存的是整數(shù)的小端。例如,b[0]是低地址端,它存整數(shù)的高端,所以值為0;取b[31]才是1。

Solidity的基礎(chǔ)特性是什么

要注意的是,當(dāng)將string轉(zhuǎn)換成bytes時,數(shù)據(jù)內(nèi)容本身不會被拷貝,如上文中,str和b變量指向的都是同一個字符串a(chǎn)bc。

address

address表示賬戶地址,它由私鑰間接生成,是一個20字節(jié)的數(shù)據(jù)。同樣,它也可以被轉(zhuǎn)換為bytes20。

Solidity的基礎(chǔ)特性是什么

數(shù)組

如果數(shù)組是狀態(tài)變量,那么支持push等操作:

Solidity的基礎(chǔ)特性是什么

struct

Solidity允許開發(fā)者自定義結(jié)構(gòu)對象。結(jié)構(gòu)體既可以作為狀態(tài)變量存儲,也可以在函數(shù)中作為局部變量存在。

全局變量

示例合約代碼的構(gòu)造函數(shù)中,包含msg.sender。它屬于全局變量。在智能合約中,全局變量或全局方法可用于獲取和當(dāng)前區(qū)塊、交易相關(guān)的一些基本信息,如塊高、塊時間、合約調(diào)用者等。

比較常用的全局變量是msg變量,表示調(diào)用上下文,常見的全局變量有以下幾種:

  • msg.sender:合約的直接調(diào)用者。

由于是直接調(diào)用者,所以當(dāng)處于 用戶A->合約1->合約2 調(diào)用鏈下,若在合約2內(nèi)使用msg.sender,得到的會是合約1的地址。如果想獲取用戶A,可以用tx.origin.

  • tx.origin:交易的"始作俑者",整個調(diào)用鏈的起點。

  • msg.calldata:包含完整的調(diào)用信息,包括函數(shù)標識、參數(shù)等。calldata的前4字節(jié)就是函數(shù)標識,與msg.sig相同。

  • msg.sig:msg.calldata的前4字節(jié),用于標識函數(shù)。

  • block.number:表示當(dāng)前所在的區(qū)塊高度。

  • now:表示當(dāng)前的時間戳。也可以用block.timestamp表示。

感謝各位的閱讀,以上就是“Solidity的基礎(chǔ)特性是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Solidity的基礎(chǔ)特性是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI