智能合約函式庫
你不需要從頭開始編寫專案中的每一個智能合約。有許多開源的智能合約函式庫可供使用,它們為你的專案提供可重複使用的建構區塊,讓你免於重新發明輪子。
先決條件
在深入了解智能合約函式庫之前,最好先對智能合約的結構有充分的了解。如果你還沒有這樣做,請前往智能合約剖析。
函式庫裡有什麼
你通常可以在智能合約函式庫中找到兩種建構區塊:可以新增到合約中的可重複使用行為,以及各種標準的實作。
行為
在編寫智能合約時,你很有可能會發現自己一遍又一遍地編寫類似的模式,例如指派一個 admin (管理員) 地址來執行合約中受保護的操作,或者在發生意外問題時新增一個緊急的 pause (暫停) 按鈕。
智能合約函式庫通常會以函式庫 (opens in a new tab)的形式,或透過 Solidity 中的繼承 (opens in a new tab),來提供這些行為的可重複使用實作。
舉例來說,以下是來自 歐本齊柏林合約函式庫 (opens in a new tab) 中 Ownable 合約 (opens in a new tab)的簡化版本,它將一個地址指定為合約的擁有者,並提供一個修飾符 (modifier) 來限制只有該擁有者才能存取某個方法。
contract Ownable {
address public owner;
constructor() internal {
owner = msg.sender;
}
modifier onlyOwner() {
require(owner == msg.sender, "Ownable: caller is not the owner");
_;
}
}
要在你的合約中使用像這樣的建構區塊,你需要先將其匯入,然後在自己的合約中繼承它。這將允許你使用基礎 Ownable 合約提供的修飾符來保護你自己的函式。
import ".../Ownable.sol"; // 匯入函式庫的路徑
contract MyContract is Ownable {
// 以下函式只能由擁有者呼叫
function secured() onlyOwner public {
msg.sender.transfer(1 ether);
}
}
另一個受歡迎的例子是 SafeMath (opens in a new tab) 或 DsMath (opens in a new tab)。這些是函式庫(與基礎合約相反),它們提供了帶有溢位檢查的算術函式,而這是語言本身未提供的。使用這些函式庫之一來取代原生算術運算是一個好習慣,可以保護你的合約免受溢位影響,因為溢位可能會帶來災難性的後果!
標準
為了促進可組合性與互操作性,以太坊社群以 ERC 的形式定義了多項標準。你可以在標準章節中閱讀更多相關資訊。
當將 ERC 納入你的合約時,尋找標準實作會是個好主意,而不是試圖自己開發。許多智能合約函式庫都包含了最受歡迎的 ERC 實作。例如,無處不在的 ERC-20 同質化代幣標準 可以在 HQ20 (opens in a new tab)、DappSys (opens in a new tab) 和 歐本齊柏林 (opens in a new tab) 中找到。此外,某些 ERC 也會提供規範實作作為 ERC 本身的一部分。
值得一提的是,有些 ERC 並非獨立存在,而是其他 ERC 的附加元件。例如,ERC-2612 (opens in a new tab) 為 ERC-20 新增了一個擴充功能,以提高其可用性。
如何新增函式庫
請務必參考你所引入之函式庫的文件,以取得如何將其納入專案的具體指示。有幾個 Solidity 合約函式庫是使用 npm 打包的,因此你可以直接 npm install 它們。大多數用於編譯合約的工具都會在你的 node_modules 中尋找智能合約函式庫,因此你可以執行以下操作:
// 這將從您的 node_modules 載入 @openzeppelin/contracts 函式庫
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
contract MyNFT is ERC721 {
constructor() ERC721("MyNFT", "MNFT") public { }
}
無論你使用哪種方法,在引入函式庫時,請務必留意語言版本。例如,如果你使用 Solidity 0.5 編寫合約,就不能使用適用於 Solidity 0.6 的函式庫。
何時使用
在專案中使用智能合約函式庫有幾個好處。首先也是最重要的是,它為你提供了可以納入系統中現成的建構區塊,從而節省了你的時間,而無需自己編寫程式碼。
安全性也是一大優勢。開源智能合約函式庫通常會受到嚴格的審查。由於許多專案都依賴它們,社群有強烈的動機對其進行持續的審查。在應用程式碼中發現錯誤的情況,比在可重複使用的合約函式庫中發現錯誤要常見得多。有些函式庫還會進行外部稽核 (opens in a new tab)以獲得額外的安全性。
然而,使用智能合約函式庫也伴隨著將你不熟悉的程式碼引入專案的風險。直接匯入合約並將其納入專案是很誘人的,但如果沒有充分了解該合約的作用,你可能會因為非預期的行為而無意中在系統中引入問題。請務必閱讀你所匯入之程式碼的文件,然後在將其納入專案之前審查程式碼本身!
最後,在決定是否引入函式庫時,請考慮其整體使用情況。被廣泛採用的函式庫具有社群規模較大、有更多人關注並尋找問題的優勢。在使用智能合約進行建構時,安全性應該是你的首要考量!
相關工具
歐本齊柏林合約 - 最受歡迎的安全智能合約開發函式庫。
DappSys - 安全、簡單、靈活的智能合約建構區塊。
HQ20 - 一個包含合約、函式庫和範例的 Solidity 專案,可協助你建構適用於現實世界的全功能分散式應用程式。
thirdweb Solidity SDK - 提供高效建構自訂智能合約所需的工具
相關教學
- 以太坊開發者的安全考量 – 關於建構智能合約時安全考量的教學,包含函式庫的使用。
- 了解 ERC-20 代幣智能合約 – 關於 ERC-20 標準的教學,由多個函式庫提供。
延伸閱讀
知道有什麼社群資源對你有幫助嗎?編輯此頁面並加入它!