Solidity - 智能合約優(yōu)化

目前也寫了很多智能合約了,經(jīng)過了幾次合約審計翠桦,總結(jié)一些值得優(yōu)化的點


拋出異常減少使用 require疆股,應(yīng)該使用自定義 error

剛開始寫錯誤回調(diào)一直使用 require 來阻截并拋出錯誤日志抒巢,圖個方便伐脖,但是花費的 Gas 相對應(yīng)的會升高,而使用自定義的 error 能大量節(jié)省 Gas 的消耗喷鸽,對開發(fā)人員來說众雷,編程方式也很簡單:

  • require(num != 1, 'ErrorMsg'); 消耗 2578 Gas

  • error ErrorMsg(uint256 num); 消耗 2557 Gas


error ErrorMsg(uint256 num); //error需要寫在合約的外面

contract TestContract {
  uint256 public num = 1;

  function test() public view
  {
    require(num != 1, 'ErrorMsg'); //替換成下面這個

    if(num == 1)
    {
      revert ErrorMsg(num);
    }
  }
}


使用枚舉管理狀態(tài)

在開發(fā)中,我習(xí)慣使用常量來管理一個記錄的狀態(tài)做祝,例如 STATUS_CANCELED = 0 & STATUS_STAKING = 1砾省,但這同樣會造成 Gas 的提升,因此使用 enum 枚舉來管理狀態(tài)會是個不錯的方式混槐。


enum Status (
  Canceled, //默認的值為 0
  Staking //默認的值為 1
)

{
  status: Status.Staking, //使用方式
}


少用 for 循環(huán)

之前常用 for 循環(huán)去查詢一個地址底下所有的 tokenId 信息编兄,但是如果 NFT Mint 數(shù)量很多時,需要循環(huán)很多次才能總結(jié)出結(jié)果声登,就會造成 Gas 的增高狠鸳。建議使用 Mapping 去管理數(shù)據(jù),用多個 Mapping 去控制地址所擁有的 TokenId 集合


mapping(address => uint256) public ownNum; //tokenId 所有用的數(shù)量
mapping(address => mapping(uint256 => uint256)) public tokenIds; //tokenId 所有用的數(shù)量


function mint() public
{
  uint256 tokenId = 1;
  _mint(tokenId); //mint方式
  ownNum[地址] ++;
  tokenIds[ownNum[地址]] = tokenId; //差不多這樣的意思
}

function getList(address _address) public
{
  //盡量減少多個循環(huán)的使用悯嗓,如果必須用到for的話要注意管理循環(huán)次數(shù)碰煌,減少Gas
  uint256 length = balanceOf(_address);
  uint256[] memory result = new uint256[](length);

  for (uint256 i = 0; i < length; i++)
      result[i] = tokenIds(_address, i);

  return result;
}


更新ing

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市绅作,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蛾派,老刑警劉巖俄认,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異洪乍,居然都是意外死亡眯杏,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門壳澳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岂贩,“玉大人,你說我怎么就攤上這事巷波∥颍” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵抹镊,是天一觀的道長锉屈。 經(jīng)常有香客問我,道長垮耳,這世上最難降的妖魔是什么颈渊? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任遂黍,我火速辦了婚禮,結(jié)果婚禮上俊嗽,老公的妹妹穿的比我還像新娘雾家。我一直安慰自己,他們只是感情好绍豁,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布芯咧。 她就那樣靜靜地躺著,像睡著了一般妹田。 火紅的嫁衣襯著肌膚如雪唬党。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天鬼佣,我揣著相機與錄音驶拱,去河邊找鬼。 笑死晶衷,一個胖子當(dāng)著我的面吹牛蓝纲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播晌纫,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼税迷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了锹漱?” 一聲冷哼從身側(cè)響起箭养,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎哥牍,沒想到半個月后毕泌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡嗅辣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年撼泛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片澡谭。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡愿题,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蛙奖,到底是詐尸還是另有隱情潘酗,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布雁仲,位于F島的核電站崎脉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏伯顶。R本人自食惡果不足惜囚灼,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一骆膝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧灶体,春花似錦阅签、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至樟结,卻和暖如春养交,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瓢宦。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工碎连, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人驮履。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓鱼辙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親玫镐。 傳聞我的和親對象是個殘疾皇子倒戏,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容