面向老程序員的Solidity知識點有哪些

這篇文章主要介紹“面向老程序員的Solidity知識點有哪些”,在日常操作中,相信很多人在面向老程序員的Solidity知識點有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”面向老程序員的Solidity知識點有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計、做網(wǎng)站服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)新絳免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了近千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。

1

EVM和字節(jié)碼

與Java代碼類似,Solidity代碼會先被編譯成字節(jié)碼,然后再由EVM負(fù)責(zé)執(zhí)行。從邏輯上來講,可以將以太坊視為一臺計算機,其中的每個EVM節(jié)點類似在計算機中執(zhí)行的進(jìn)程,分布式賬本則是這臺計算機的存儲。

一旦部署成功,其代碼會被復(fù)制到以太坊上其他節(jié)點,并可以通過命令查看其源碼。以Truffle開發(fā)環(huán)境為例:

  • truffle develop

  • 部署MyCoin合約,deploy

  • MyCoin.at(地址),從其返回的json對象中的source屬性即可看到合約代碼。

合約部署之后就無法更新,這就給開發(fā)者帶來了相當(dāng)大的挑戰(zhàn):

  • 如何開發(fā)出高質(zhì)量的合約,盡可能的沒有Bug?

  • 如何設(shè)計可升級的合約?

2

執(zhí)行代價

說到程序執(zhí)行的代價,一般指的都是花多少內(nèi)存、存儲和CPU時間。但執(zhí)行以太坊上的代碼,除了這些通常意義的代價之外,還需要真金白銀。這是因為以太坊上的交易確認(rèn)都是需要花錢的!它們主要是那些改變以太坊狀態(tài)的操作,如:

  • 賬戶轉(zhuǎn)賬

  • 部署合約

  • 合約內(nèi)的寫操作

而且,與其他系統(tǒng)不同,這些操作的執(zhí)行結(jié)果并不會立刻生效。它們會以交易的形式提交到交易池中等待礦工確認(rèn),這便是交易費的由來。并且,這個價格也不是一個固定值,它隨著市場行情的波動上下浮動。如果你的交易長時間沒有結(jié)果,那么可以看看是否是因為交易費過低。

關(guān)于交易費的行情,可以從最新的交易(https://etherscan.io/txs)中了解。

這也給開發(fā)者帶來了挑戰(zhàn):如何在實現(xiàn)功能的前提下盡可能的降低交易成本?

3

賬戶

要在以太坊上進(jìn)行操作,必需要有以太坊賬戶。當(dāng)前有兩類賬戶類型:

  • 外部賬戶,可簡單認(rèn)為是“人類用戶”,有私鑰和余額,交易發(fā)送前會用私鑰先簽名。

  • 合約賬戶,合約部署之后,會隨之對應(yīng)有一個賬戶,由余額和相應(yīng)的合約狀態(tài)數(shù)據(jù)。它由外部消息來觸發(fā)執(zhí)行。觸發(fā)源來自外部賬戶或其他合約賬戶。

這里也帶來了一些關(guān)于安全性方面的概念轉(zhuǎn)變:

  • 私鑰是終極秘密,一定是本地存儲,否則都是不安全的。

  • 由于合約是公開的,誰都可以發(fā)起執(zhí)行。如果要實現(xiàn)“只有xxx才能執(zhí)行本合約”,必需要在合約內(nèi)部代碼中進(jìn)行控制。

4

合約語法

合約類似Java中的類,但與類不同之處在于,它的構(gòu)造函數(shù)只會被調(diào)用一次,即部署合約的時候。

合約的狀態(tài)變量相當(dāng)于類的實例變量,但同樣是持久化的。并且,mapping只能聲明成狀態(tài)變量但可在函數(shù)內(nèi)引用。

變量類型同樣也分值類型和引用類型,其中引用類型包括:數(shù)組和結(jié)構(gòu)體,后者給自定義類型提供方案。

函數(shù)可以返回一個值或多個值,同時可以指定返回的變量。如:

function arithmetic(uint _a, uint _b)

    public

    pure

    returns (uint o_sum, uint o_product)

{

    o_sum = _a + _b;

    o_product = _a * _b;

}

函數(shù)修改器(Modifier)類似AOP中的攔截器,提供了修改函數(shù)執(zhí)行流程的機會,一般用來做驗證和檢查。其中“_”用來將控制流返還給被修改的函數(shù),如下例:

modifier onlySeller() { // Modifier

    require(

        msg.sender == seller,

        "Only seller can call this."

    ); 

   _;}

function abort() public onlySeller { // Modifier usage

    // ...

}

幾個重要的修改器:

  • payable,接收以太的函數(shù)必需加上

  • view或pure,表示函數(shù)不會改變以太坊狀態(tài)

事件提供了讓外部應(yīng)用了解合約狀態(tài)變化的途徑,一般使用流程是:

  • 合約內(nèi)部發(fā)出事件

  • 外部應(yīng)用利用web3監(jiān)聽事件

可見性:

  • external,僅適用于函數(shù),表示其可被外部合約或交易調(diào)用,但不能被內(nèi)部調(diào)用。

  • public

    函數(shù)缺省的可見性,可被內(nèi)部調(diào)用和通過消息調(diào)用,

    狀態(tài)變量,EVM會為其自動產(chǎn)生getter

  • internal,函數(shù)和狀態(tài)變量可被當(dāng)前合約和其子合約調(diào)用

    狀態(tài)變量的缺省可見性

  • private,函數(shù)和狀態(tài)變量僅被當(dāng)前合約調(diào)用

合約支持多重繼承。

EVM提供了4種數(shù)據(jù)位置用來存放數(shù)據(jù):

  • storage,持久化,存儲于整個以太坊

  • memory,函數(shù)的本地內(nèi)存,非持久化

  • calldata,函數(shù)入?yún)?,非持久?/p>

  • stack,EVM的調(diào)用棧

規(guī)則:

  • 狀態(tài)變量:storage

  • external函數(shù)入?yún)ⅲ篶alldata

  • 函數(shù)入?yún)ⅲ簃emory

  • 函數(shù)局部變量:

    引用類型,缺省為storage,但可被覆蓋

    值類型,memory,不可被覆蓋

    mapping類型,指向外部的狀態(tài)變量

  • 狀態(tài)變量之間賦值,將產(chǎn)生獨立副本,即相互更改不受引用。

  • storage和memory變量之間相互賦值,總產(chǎn)生獨立副本。

  • memory變量之間賦值

    值類型,產(chǎn)生獨立副本

    引用類型,指向同一地址

由于合約執(zhí)行是有成本的,需要警惕循環(huán)語句。

對于多重繼承的合約,需要明確指明順序,如:

contract X {}contract A is X {}contract C is A, X {}

fallback函數(shù)沒有函數(shù)名,無法直接調(diào)用,但在兩個情況下會被觸發(fā):

  • 合約中無任何函數(shù)匹配調(diào)用者發(fā)過來的請求時

  • 合約接收以太時,此時,fallback函數(shù)需使用payable

由于其無法被外部調(diào)用,EVM限制其只能最多消耗2300的gas,若超過,則fallback函數(shù)失敗。因此,記得要測試合約的fallback函數(shù)是否會超過這個限制。

并且,fallback是安全事故的高發(fā)地,需要對其進(jìn)行必要的安全相關(guān)的測試。

接口和抽象合約跟Java中的接口和抽象類差別不大,庫(library)是一段可復(fù)用的代碼,在調(diào)用它的合約上下文內(nèi)執(zhí)行:

  • 它不能用狀態(tài)變量

  • 不能繼承或被繼承

  • 不能接收以太

合約拋出異常之后,狀態(tài)回滾,當(dāng)前有3種方式:

  • require(表達(dá)式),若表達(dá)式為false,則拋出異常,未使用的gas退回

  • 適合驗證函數(shù)的入?yún)?/p>

  • assert(表達(dá)式),同上,但未使用的gas不會退回,將全部被消耗

  • 適合驗證內(nèi)部狀態(tài)

  • revert(),直接拋出異常

5

常見模式

鑒于以太坊應(yīng)用的以下特點,編寫solidity代碼時需要非常小心:

  • 執(zhí)行消耗真金白銀

  • 合約公開可見,即使是private

  • 合約不可篡改,一旦發(fā)布無法變更

常見的編碼套路有:

  • 對于支付,優(yōu)先采用“取款”,而不是“轉(zhuǎn)賬”(即send或transfer),避免接收合約惡意fallback函數(shù)。

  • 對于支付,采用CDI模式,避免重入問題。即:

    檢查 -> 更改本合約狀態(tài) ->支付。

  • 善用Modifier進(jìn)行權(quán)限控制。

  • 使用mapping類型保存合約數(shù)據(jù),甚至為了方便升級,單獨分離出兩類:

    數(shù)據(jù)合約,僅包含mapping,保留操作mapping的函數(shù),客觀上類似數(shù)據(jù)表。

    控制合約,僅包含邏輯控制,通過數(shù)據(jù)合約的接口操作數(shù)據(jù)。若邏輯有問題,只需升級本合約即可,數(shù)據(jù)仍然得以保留。

  • 使用代理合約。

最后,也是最省事的方式:使用成熟類庫,如OpenZeppelin。

到此,關(guān)于“面向老程序員的Solidity知識點有哪些”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

文章題目:面向老程序員的Solidity知識點有哪些
文章路徑:http://muchs.cn/article8/pisgip.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、關(guān)鍵詞優(yōu)化、建站公司、用戶體驗、企業(yè)建站、網(wǎng)站營銷

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化