欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

面向老程序員的Solidity知識(shí)點(diǎn)有哪些

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

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

1

EVM和字節(jié)碼

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

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

  • truffle develop

  • 部署MyCoin合約,deploy

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

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

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

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

2

執(zhí)行代價(jià)

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

  • 賬戶轉(zhuǎn)賬

  • 部署合約

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

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

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

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

3

賬戶

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

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

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

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

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

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

4

合約語(yǔ)法

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

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

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

函數(shù)可以返回一個(gè)值或多個(gè)值,同時(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í)行流程的機(jī)會(huì),一般用來做驗(yàn)證和檢查。其中“_”用來將控制流返還給被修改的函數(shù),如下例:

modifier onlySeller() { // Modifier

    require(

        msg.sender == seller,

        "Only seller can call this."

    ); 

   _;}

function abort() public onlySeller { // Modifier usage

    // ...

}

幾個(gè)重要的修改器:

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

  • view或pure,表示函數(shù)不會(huì)改變以太坊狀態(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會(huì)為其自動(dòng)產(chǎn)生getter

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

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

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

合約支持多重繼承。

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

  • storage,持久化,存儲(chǔ)于整個(gè)以太坊

  • 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)生獨(dú)立副本,即相互更改不受引用。

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

  • memory變量之間賦值

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

    引用類型,指向同一地址

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

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

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

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

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

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

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

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

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

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

  • 不能繼承或被繼承

  • 不能接收以太

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

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

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

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

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

  • revert(),直接拋出異常

5

常見模式

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

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

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

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

常見的編碼套路有:

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

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

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

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

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

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

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

  • 使用代理合約。

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

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

文章題目:面向老程序員的Solidity知識(shí)點(diǎn)有哪些
文章路徑:http://www.chinadenli.net/article8/pisgip.html

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

廣告

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

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