【Solidity】1.一个Solidity源文件的布局 - 深入理解Solidity
一個Solidity源文件的布局
源文件可以包含任意數量的合約定義,include指令和pragma偽指令。
Pragma 版本
源文件可以(并且應該)使用所謂的版本編譯指示進行注釋,以拒絕隨后可能引入不兼容更改的編譯器版本進行編譯。 我們嘗試將這些更改保持在絕對最小值,尤其是在語義變化也需要更改語法的情況下引入更改,但這并不總是可能的。 因此,至少對于包含突破性更改的版本,讀取更改日志總是一個好主意,這些版本將始終具有0.x.0或x.0.0格式的版本。
版本pragma使用如下:
pragma solidity ^0.4.0;
這樣一個源文件不會使用比版本0.4.0之前的編譯器編譯,并且它也不會在從0.5.0版本開始的編譯器(第二個條件通過使用^添加)起作用。 這個想法是,直到版本0.5.0才會有變化,所以我們可以隨時確定我們的代碼將按照我們打算的方式進行編譯。 我們不會修復編譯器的確切版本,因此修補程序版本仍然可能。
可以為編譯器版本指定更復雜的規則,表達式遵循由npm使用的規則。
導入其他源文件
語法和語義
Solidity支持與JavaScript中可用的導入語句(來自ES6)的引用語句,盡管Solidity不知道“default export”的概念。
在全局層面,您可以使用以下形式的導入語句:
import "filename";
此語句從“filename”(以及導入的符號)導入所有全局符號到當前全局范圍(與ES6不同,但與Solidity相反)。
import * as symbolName from "filename";
…創建一個新的全局符號symbolName,其成員都是來自“filename”的全局符號。
import {symbol1 as alias, symbol2} from "filename";
…創建新的全局符號alias和symbol2,分別從“filename”引用symbol1和symbol2。
另一種語法不是ES6的一部分,但可能很便于:
import "filename" as symbolName;
相當于import * as symbolName from "filename";
路徑
在上文中,文件名始終被視為具有/作為目錄分隔符的路徑.?.作為當前目錄和..作為父目錄。 當.?或..后跟一個字符,除了/,它不被認為是當前或父目錄。 所有路徑名稱都被視為絕對路徑,除非它們以當前的路徑開頭.?或父目錄...
要從與當前文件相同的目錄導入文件x,請使用導入“./x”作為x?;. 如果使用導入“x”作為x; 相反,可以引用不同的文件(在全局“包含目錄”中)。
這取決于編譯器(見下文)如何實際解析路徑。 一般來說,目錄層次結構不需要嚴格地映射到本地文件系統上,它也可以映射到通過例如文件發現的資源比如 ipfs,http或git。
在實際編譯器中使用
當調用編譯器時,不僅可以指定如何發現路徑的第一個元素,而且可以指定路徑前綴重新映射,?github.com/ethereum/dapp-bin/library被重新映射到/usr/local/dapp-bin/library,編譯器將從那里讀取文件。 如果可以應用多重重新映射,則首先嘗試使用最長密鑰。 這允許一個“回退-重新映射”與例如 “”映射到“/usr/local/ include/solidity”。 此外,這些重新映射可以依賴于上下文,它允許您配置包導入例如 不同版本的同名庫。
solc:
對于solc(命令行編譯器),這些重新映射作為上下文提供:prefix = target參數,其中context和and = target部分都是可選的(在這種情況下,target默認為前綴)。 所有重新映射的值都是常規文件(包括它們的依賴項)。 這個機制是完全向后兼容的(只要沒有文件名包含=或:),因此不會發生變化。 導入以前綴開頭的文件的目錄上下文文件中的所有導入將通過將目標替換為前綴來重定向。
例如,如果您將本地github.com/ethereum/dapp-bin/克隆到/usr/local/ dapp-bin,則可以在源文件中使用以下內容:
import "github.com/ethereum/dapp-bin/library/iterable_mapping.sol" as it_mapping;
然后運行編譯器
solc github.com/ethereum/dapp-bin/=/usr/local/dapp-bin/ source.sol
作為一個更復雜的例子,假設你依靠一些使用非常舊版本的dapp-bin的模塊。 在/usr/local/ dapp-bin_old中檢出舊版本的dapp-bin,然后可以使用
solc module1:github.com/ethereum/dapp-bin/=/usr/local/dapp-bin/ \
所以module2中的所有導入都指向舊版本,但是在module1中導入獲取新版本。
請注意,solc僅允許您包含某些目錄中的文件:它們必須位于顯式指定的源文件之一或重映射目標的目錄(或子目錄)中的目錄(或子目錄)中。 如果要允許直接絕對包含,只需添加重新映射=/。
如果存在導致有效文件的多個重新映射,則選擇具有最長公共前綴的重映射。
Remix:
Remix為github提供自動重新映射,并且還可以通過網絡自動檢索文件:您可以通過例如導入迭代映射。
import "github.com/ethereum/dapp-bin/library/iterable_mapping.sol" as it_mapping;
其他源代碼提供者可能會在將來被添加。
注釋
單行注釋(//)和多行注釋(/.../)是可行的。
// 單行注釋.
/*
多行注釋
*/
另外還有另一種類型的評論叫做natspec注釋,文檔還沒有被寫入。 它們是用三斜杠(///)或雙星號塊(/?* …?/)編寫的,它們應該直接在函數聲明或語句上方使用。 您可以在這些注釋中使用Doxygen風格的標簽來記錄功能,注釋條件以進行正式驗證,并提供確認文本,當用戶嘗試調用功能時,該文本將顯示給用戶。
在下面的例子中,我們記錄了合同的標題,兩個輸入參數的說明和兩個返回的值。
pragma solidity ^0.4.0;
/* @title Shape calculator. /
contract shapeCalculator {
}
總結
以上是生活随笔為你收集整理的【Solidity】1.一个Solidity源文件的布局 - 深入理解Solidity的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mysql的锁
- 下一篇: Netflix混沌工程手册Part 2: