solidity系列教程<九>庫(library)的使用

庫與合約類似,它也部署在一個指定的地址上(僅被部署一次耕漱,當代碼在不同的合約可反復使用)

因為庫合約是一個獨立的代碼做粤,它僅可以訪問主調(diào)合約明確提供的狀態(tài)變量,否則事秀,沒辦法法去知道這些狀態(tài)變量彤断。

對比普通合約來說,庫存在以下的限制(這些限制將來也可能在將來的版本被解除):

  • 無狀態(tài)變量(state variables)秽晚。
  • 不能繼承或被繼承
  • 不能接收以太幣
  • 不能銷毀一個庫

庫有許多使用場景瓦糟。兩個主要的場景如下:

  • 如果有許多合約,它們有一些共同代碼赴蝇,則可以把共同代碼部署成一個庫菩浙。這將節(jié)省gas,因為gas也依賴于合約的規(guī)模。因此劲蜻,可以把庫想象成使用其合約的父合約陆淀。使用父合約(而非庫)切分共同代碼不會節(jié)省gas,因為在Solidity中先嬉,繼承通過復制代碼工作轧苫。
  • 庫可用于給數(shù)據(jù)類型添加成員函數(shù)。(using for)

第一種使用庫

pragma solidity ^0.4.16;

library Set {
  // 定義了一個結(jié)構(gòu)體疫蔓,保存主調(diào)函數(shù)的數(shù)據(jù)(本身并未實際存儲的數(shù)據(jù))含懊。
  struct Data { mapping(uint => bool) flags; }

  // self是一個存儲類型的引用(傳入的會是一個引用,而不是拷貝的值)衅胀,這是庫函數(shù)的特點岔乔。
  // 參數(shù)名定為self 也是一個慣例,就像調(diào)用一個對象的方法一樣.
  function insert(Data storage self, uint value)
      public
      returns (bool)
  {
      if (self.flags[value])
          return false; // 已存在
      self.flags[value] = true;
      return true;
  }

  function remove(Data storage self, uint value)
      public
      returns (bool)
  {
      if (!self.flags[value])
          return false; 
      self.flags[value] = false;
      return true;
  }

  function contains(Data storage self, uint value)
      public
      view
      returns (bool)
  {
      return self.flags[value];
  }
}

contract C {
    Set.Data knownValues;

    function register(uint value) public {
        // 庫函數(shù)不需要實例化就可以調(diào)用滚躯,因為實例就是當前的合約
        require(Set.insert(knownValues, value));
    }
    // 在這個合約中雏门,如果需要的話可以直接訪問knownValues.flags,
}

using for:
指令using A for B;用來把庫函數(shù)(從庫A)關(guān)聯(lián)到類型B掸掏。這些函數(shù)將會把調(diào)用函數(shù)的實例作為第一個參數(shù)茁影。語法類似,python中的self變量一樣丧凤。例如:A庫有函數(shù) add(B b1, B b2)募闲,則使用Using A for B指令后,如果有B b1就可以使用b1.add(b2)愿待。

using A for * 表示庫A中的函數(shù)可以關(guān)聯(lián)到任意的類型上蝇更。

使用Using for的方式來對基本類型(elementary types)進行擴展:

pragma solidity ^0.4.16;

library Search {
    function indexOf(uint[] storage self, uint value)
        public
        view
        returns (uint)
    {
        for (uint i = 0; i < self.length; i++)
            if (self[i] == value) return i;
        return uint(-1);
    }
}

contract C {
    using Search for uint[];
    uint[] data;

    function append(uint value) public {
        data.push(value);
    }

    function replace(uint _old, uint _new) public {
        // 進行庫調(diào)用
        uint index = data.indexOf(_old);
        if (index == uint(-1))
            data.push(_new);
        else
            data[index] = _new;
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市呼盆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蚁廓,老刑警劉巖访圃,帶你破解...
    沈念sama閱讀 222,946評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異相嵌,居然都是意外死亡腿时,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評論 3 399
  • 文/潘曉璐 我一進店門饭宾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來批糟,“玉大人,你說我怎么就攤上這事看铆』斩Γ” “怎么了?”我有些...
    開封第一講書人閱讀 169,716評論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長否淤。 經(jīng)常有香客問我悄但,道長,這世上最難降的妖魔是什么石抡? 我笑而不...
    開封第一講書人閱讀 60,222評論 1 300
  • 正文 為了忘掉前任檐嚣,我火速辦了婚禮,結(jié)果婚禮上啰扛,老公的妹妹穿的比我還像新娘嚎京。我一直安慰自己,他們只是感情好隐解,可當我...
    茶點故事閱讀 69,223評論 6 398
  • 文/花漫 我一把揭開白布鞍帝。 她就那樣靜靜地躺著,像睡著了一般厢漩。 火紅的嫁衣襯著肌膚如雪膜眠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,807評論 1 314
  • 那天溜嗜,我揣著相機與錄音宵膨,去河邊找鬼。 笑死炸宵,一個胖子當著我的面吹牛辟躏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播土全,決...
    沈念sama閱讀 41,235評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼捎琐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了裹匙?” 一聲冷哼從身側(cè)響起瑞凑,我...
    開封第一講書人閱讀 40,189評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎概页,沒想到半個月后籽御,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,712評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡惰匙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,775評論 3 343
  • 正文 我和宋清朗相戀三年技掏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片项鬼。...
    茶點故事閱讀 40,926評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡哑梳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绘盟,到底是詐尸還是另有隱情鸠真,我是刑警寧澤悯仙,帶...
    沈念sama閱讀 36,580評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站弧哎,受9級特大地震影響雁比,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜撤嫩,卻給世界環(huán)境...
    茶點故事閱讀 42,259評論 3 336
  • 文/蒙蒙 一偎捎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧序攘,春花似錦茴她、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瞄沙,卻和暖如春己沛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背距境。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評論 1 274
  • 我被黑心中介騙來泰國打工申尼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人垫桂。 一個月前我還...
    沈念sama閱讀 49,368評論 3 379
  • 正文 我出身青樓师幕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親诬滩。 傳聞我的和親對象是個殘疾皇子霹粥,可洞房花燭夜當晚...
    茶點故事閱讀 45,930評論 2 361

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