Solidity之旅十七-庫 [library]

BSN研習社發表於2024-01-05

01

庫(library)

作為開發者的您,想必對專案中重複使用的工具函式,抽取到一個公共中,以便可以在您專案中的其它位置可呼叫。

而Solidity與您所 熟知的沒有什麼不同,它也是用來實現可重複呼叫,且還能省gas fee。

閒話少敘,切入正題。讓我們來看看Solidity library吧!

雖然Solidity的library看起來和合約(contract)有些類似,但它並不是一個合約,它包含了可能多個消費者合約共有的功能,這有助於避免冗餘。

來看看Solidity 對library的約束:

1、無狀態 

Solidity中的庫是一個無狀態實體。它本質上意味著,與合約不同,您不能在一個庫中定義狀態變數。更簡單地說,庫函式不允許改變或修改合約的狀態。

 2、僅供檢視的函式

呼叫庫函式不會消耗gas,因為它不會修改合約的狀態。換句話說,一個庫只能實現pure函式或view函式。

3、內部函式

一個庫不能從外部範圍呼叫。其他合約顯然可以呼叫它們,但它們不能從部署的外部訪問。

4、不能繼承

因為庫是一個獨立的實體,它不能繼承任何其他的庫或合約。一個庫不能被任何其他實體/庫/合同繼承。

5、沒有回退或支付功能

一個庫不能實現回退或支付功能。

(將來有可能會解除這些限制)

02

如何建立 library(庫)

在瞭解了關於庫的一些概念後,讓我們來建立一個library。

想要在Solidity建立庫,需使用library關鍵字。

//SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.0;

library MyLibrary {
    function add(uint a, uint b) public pure returns(uint) {
        return a + b;
    }
}

using … for … 使用庫

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.0;

import "./library_example.sol";  //匯入庫

contract UseLibraryExample {
    
    using MyLibrary for uint;

    function getSum(uint firstNumber, uint secondNumber) public pure returns(uint) {
        return firstNumber.add(secondNumber); //您對這句可能產生了困惑
    }
  
}

為了在合約中使用任何庫,我們需要首先告訴合約該庫可以操作哪種資料型別。我們透過在合同中加入使用來操作;行來實現。

例如,library MyLibrary中的函式add對uint進行操作,因為它把uint a作為它的第一個引數。

為了便於理解,您可以簡單地,假設您的庫函式成為uint資料型別本身的一部分,並在其物件中隨時可用。

最後,當庫函式成為資料型別本身的一部分時,我們可以在其物件上呼叫該方法,如我們上面的契約所示,即firstNumber.add(secondNumber); 。

注意,庫函式的第一個引數成為函式被呼叫的物件。其餘的和後續的引數仍然在函式呼叫中。

版權宣告:本文為CSDN博主「甄齊才」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。

原文連結:

https://blog.csdn.net/coco2d_x2014/article/details/128431596

    文章來源:CSDN博主「甄齊才」

   文章原標題:《玩以太坊鏈上專案的必備技能(庫 [library]-Solidity之旅十七)》

   旨在傳播區塊鏈相關技術,如有侵權請與我們聯絡刪除。


來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70012206/viewspace-3002798/,如需轉載,請註明出處,否則將追究法律責任。

相關文章