這一系列教程中,我們會用最詳細的方式講解如何解析合約,配合Solidity官方教程,了解這些神合約為什麼能被眾多項目方和開發者接受及使用,並且在學習完這些後,了解如何寫出好的合約
Solidity編譯器鼓勵使用機器可讀的SPDX許可證標識符每個源檔都應以指示其許可證的註釋開頭
// SPDX-Licence-Identifier: MIT
有關如何使用SPDX許可證標識碼的詳細資訊,請參考SPDX網站,這邊會有一些許可證註釋開頭的其他用法,不過我們可以看到 Azuki.sol
和 ERC721A.sol
都只有用最開始提到的,這邊就不對其他種許可證多做解釋
我們可以且應該在 Solidity 源檔中使用版本編譯指示,以避免引入不相容更改的未來編譯器版本的編譯,版本編譯指示按如下方式使用:
pragma solidity ^0.8.0;
這表示 Azuki.sol
和 ERC721A.sol
都不會被早於版本 0.8.0 的編譯器進行編譯,並且也不能在從版本 0.9.0 開始的編譯器上工作(這個條件是由於在版本號前加上了 ^
)
如果想為編譯器指定更複雜的規則,可以參考這邊
通過使用 pragma abicoder v1
或 pragma abicoder v2
可以在 ABI 編碼器和解碼器的兩種實現之間進行選擇
新的 ABI 編碼器(abicoder v2)能夠對任意嵌套的數位和結構進行編碼和解碼。由於預設情況下將從 Solidity 0.8.0 開始啟動它,也可以選擇使用 pragma abicoder v1;
選擇舊編碼器
Azuki.sol
和 ERC721A.sol
都使用abicoder v2,新編碼器支援的類型集是舊編碼器支援的類型的嚴格超集,使用它的合同可以與不受限制的合同進行交互
Solidity 支援導入語句,以使用模組化的代碼,語法類似於 JavaScript 中導入的代碼(從 ES6 開始),不過Solidity 不支援 export default
的概念
在 Azuki.sol
中使用:
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "./ERC721A.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
在 ERC721A.sol
中使用:
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/utils/Context.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/utils/introspection/ERC165.sol";
可以看到其匯入了openzeppelin的 Ownable.sol
, ReentrancyGuard.sol
, Strings.sol
等常用合約,讀者可以分別到以下連結閱讀合約解析:
使用 //
進行單行註釋、 /*...*/
進行多行註釋,這邊通常會用來解釋代碼,尤其是在一些模板類型的原碼,像是 ERC721A.sol
(算是優化版的 ERC721),我們可以看到他使用了非常多的註釋,方便使用這個合約的開發者了解這個合約的使用辦法,反之, Azuki.sol
就沒有這麼多的註釋
今天的內容就到這邊,後面我們會從各個面向繼續解讀Azuki合約