準(zhǔn)備
開發(fā)工具 Remix
實(shí)例代碼PatrickAlphaC/simple-storage-fcc (github.com)
solidity
部署后,每一個(gè)合約都有一個(gè)地址。(就像賬戶地址)
部署一個(gè)合約其實(shí)就是發(fā)送一個(gè)交易。

一、代碼
//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)識

紅色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),如


memory和calldata意味著這個(gè)變量只是暫時(shí)存在,只在調(diào)用此addPerson()函數(shù)的交易期間暫時(shí)存在。
storage 存儲變量甚至存在于正在執(zhí)行的函數(shù)之外。
memory
可以被修改的臨時(shí)變量,string,數(shù)組,結(jié)構(gòu),映射才需要加memory。
uint 不用加meory,默認(rèn)就是。


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

storage
如 全局變量uint256 public favNumber=0; 隱式的定義為storage。
六、部署
部署到NetaMask錢包正在連接的測試網(wǎng)絡(luò)上


確保先用測試水龍頭領(lǐng)取一些代筆,部署需要支付gas。
點(diǎn)擊部署,此時(shí)MetaMask插件會有提示,點(diǎn)擊打開

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

點(diǎn)擊 view on etherscan

可以看到,合約已經(jīng)通過 account1賬號部署到測試鏈上。
from就是account1地址。
to就是 剛剛創(chuàng)建的合約地址,可以點(diǎn)擊打開。
可以看到gas limit 和gas usage比單純發(fā)送以太幣(23000gas)高得多。


可以看到該合約下面的第一個(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è)交易)。



測試鏈的部署可能需要等待挺久時(shí)間,所以一開始先在本地
的RemixVM(Shanghai)上調(diào)試,然后再部署到測試鏈Injected Provider。
添加兩個(gè)用戶addPerson ,需要MetaMask彈窗兩次確認(rèn)才可以執(zhí)行。結(jié)果如下:


七、切換測試網(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
九、繼承、重寫
- 用is 表示繼承,重寫時(shí) 父類 virtual ,子類 override。
- 支持多繼承。
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;
}
}