區(qū)塊鏈全棧以太坊(三)合約編寫

準(zhǔn)備

開發(fā)工具 Remix

實(shí)例代碼PatrickAlphaC/simple-storage-fcc (github.com)

solidity

部署后,每一個(gè)合約都有一個(gè)地址。(就像賬戶地址)

部署一個(gè)合約其實(shí)就是發(fā)送一個(gè)交易。

remix_deploy.png

一、代碼

 //contract 就類似于java的class
 contract SimpleStorage {
    //public 實(shí)際上就是創(chuàng)建了一個(gè)getter函數(shù)。
    //隱式的定義為storage
    uint256 public favNumber=0;
    function store(uint256 _favNumber) public {
        favNumber = _favNumber;
    }

    function retrieve() public view returns(uint256) {
        return favNumber;
    }
 }

二、訪問權(quán)限

合理的設(shè)置訪問權(quán)限才能避免漏洞。

public/private

public 實(shí)際上就是創(chuàng)建了一個(gè)getter函數(shù)favNumber(),

private表示這個(gè)合約是唯一可以調(diào)用favNumber()的合約。

external

只對合約外部可見

internala

只有這個(gè)合約或者繼承他的合約可以讀取。

三、storage/state

四、函數(shù)標(biāo)識

solidity_func1.png

紅色store調(diào)用會產(chǎn)生gas,表示有修改合約狀態(tài),

只有更改合約狀態(tài)的時(shí)候才支付gas(transaction cost,不是execution cost),發(fā)生交易。

view

只會讀取這個(gè)合約的狀態(tài)(比如favNumber)。

view函數(shù)不允許修改任何狀態(tài),不會產(chǎn)生gas。

當(dāng) retrieve()被store調(diào)用時(shí),那他就需要支付retrieve() 的execution cost gas

pure

連合約狀態(tài)都沒讀取,只做簡單的內(nèi)存運(yùn)算

pure函數(shù)也不允許修改任何狀態(tài)。

不允許讀取區(qū)塊鏈 數(shù)據(jù)(所以不能)。

總結(jié)

調(diào)用view函數(shù)是免費(fèi)的,除非你在消耗gas的函數(shù)中調(diào)用它。

五、變量的數(shù)據(jù)位置

函數(shù)入?yún)ⅰ⒕植孔兞?需要指定變量的數(shù)據(jù)位置(memory,calldata),如

solidity_var1.png
solidity_var2.png

memory和calldata意味著這個(gè)變量只是暫時(shí)存在,只在調(diào)用此addPerson()函數(shù)的交易期間暫時(shí)存在。

storage 存儲變量甚至存在于正在執(zhí)行的函數(shù)之外。

memory

可以被修改的臨時(shí)變量,string,數(shù)組,結(jié)構(gòu),映射才需要加memory。

uint 不用加meory,默認(rèn)就是。


solidity_var4.png
solidity_var5.png

calldata

類似memory,但是不可以修改的臨時(shí)變量

solidity_var3.png

storage

如 全局變量uint256 public favNumber=0; 隱式的定義為storage。

六、部署

部署到NetaMask錢包正在連接的測試網(wǎng)絡(luò)

solidity_dep1.png
solidity_dep2.png

確保先用測試水龍頭領(lǐng)取一些代筆,部署需要支付gas。

點(diǎn)擊部署,此時(shí)MetaMask插件會有提示,點(diǎn)擊打開

solidity_dep3.png

點(diǎn)擊確認(rèn)

solidity_dep4.png

點(diǎn)擊 view on etherscan

solidity_dep5.png

可以看到,合約已經(jīng)通過 account1賬號部署到測試鏈上。

from就是account1地址。

to就是 剛剛創(chuàng)建的合約地址,可以點(diǎn)擊打開。

可以看到gas limit 和gas usage比單純發(fā)送以太幣(23000gas)高得多。

solidity_dep6.png
solidity_dep7.png

可以看到該合約下面的第一個(gè)交易:創(chuàng)建合約。

可以在Remix上點(diǎn)擊按鈕,在測試網(wǎng)絡(luò)上做一遍測試。

點(diǎn)擊retrieve這種view函數(shù)不需要gas,所以瀏覽器MetaMask插件不會彈出。

點(diǎn)擊store這種會修改區(qū)塊鏈的函數(shù)需要gas,所以瀏覽器MetaMask插件會彈出來確認(rèn)(在etherscan上能看到store這個(gè)交易)。

solidity_dep8.png
solidity_dep9.png
solidity_dep10.png

測試鏈的部署可能需要等待挺久時(shí)間,所以一開始先在本地

的RemixVM(Shanghai)上調(diào)試,然后再部署到測試鏈Injected Provider。

添加兩個(gè)用戶addPerson ,需要MetaMask彈窗兩次確認(rèn)才可以執(zhí)行。結(jié)果如下:


solidity_dep12.png
solidity_dep11.png

七、切換測試網(wǎng)絡(luò)

MetaMask里切換就行,Remix會自動感應(yīng)。

八、按鈕顏色類型

藍(lán)色:view方法,不會修改鏈內(nèi)容,免費(fèi)。

橙色:有修改鏈內(nèi)容,支付gas。

紅色:有轉(zhuǎn)賬行為 payable,方法內(nèi)會用到 msg.value。

例如 FundMe 的fund() 函數(shù)。

如果只是接收幣,還是橙色如 withDraw

九、繼承、重寫

  1. 用is 表示繼承,重寫時(shí) 父類 virtual ,子類 override。
  2. 支持多繼承。
 contract SimpleStorage {
    function store(uint256 _favoriteNumber) public virtual {
        favoriteNumber = _favoriteNumber;
        retrieve();
    }
}

import "./SimpleStorage.sol";
contract ExtraStorage is SimpleStorage {
    function store(uint256 _favoriteNumber) public override      {
        favoriteNumber = _favoriteNumber + 5;
    }
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容