Solidity 語言學習(2)—— Solidity智慧合約檔案結構
版本申明
pragma solidity ^0.4.0;
說明:
1 版本要高於0.4才可以編譯
2 表示高於0.5的版本則不可編譯,第三位的版本號但可以變,留出來用做bug可以修復(如 0.4.1的編譯器有bug,可在0.4.2 修復,現有合約不用該程式碼)。
引用其他原始檔
全域性引入
import ”filename“;
自定義名稱空間引入
import * as symbolName from "filename"
非es6相容的簡寫語法
import "filename" as symbolName
等同於上述
import * as symbolName from ”filename“
關於路徑
引入檔案路徑時要注意,非 . 打頭的路徑會被認為是絕對路徑,所以要引用同目錄下的檔案使用
import “./x" as x
也不要使用下述方式,這樣會是在一個全域性的目錄下
import "x" as x;
為了會有這個區別,是因為這取決於編譯器,如果解析路徑,通常來說目錄層級結構並不與我們本地的檔案一一對應,它非常有可能是通過ipfs,http,或git建立的一個網路上的虛擬目錄。
編譯器解析引用檔案機制
各編譯器提供了檔案字首對映機制。
- 可以將一個域名下的檔案對映到本地,從而從本地的某個檔案中讀取
- 提供對同一實現的不同版本的支援(可能某版本的實現前後不相容,需要區分)
- 如果字首相同,取最長
- 有一個”fallback—remapping“機制,空串會對映到”/usr/local/include/solidify”
solc編譯器
命令列編譯器,通過下述命令名稱空間對映提供支援
context:prefix=target
上述的context: 和 =target 是可選的。所有 context 目錄下的以 prefix開頭的會被替換為 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
需要注意的是solc僅僅允許包含實際存在的檔案。它必須存在於你重對映後目錄裡,或其子目錄裡。如果你想包含直接的絕對路徑包含,那麼可以將名稱空間重對映為 =\(這裡不是很懂)
備註:如果有多個重對映指向同一個檔案,那麼取最長的那個檔案。
browser-solidity 編譯器 (現在是Remix)
browser-solidity 編譯器預設會自動對映到github上,然後自動從網路上檢索檔案。比如:可以通過下述方式引入一個迭代包:
import "github.com/ethereum/dapp-bin/library/iterable_mapping.sol" as it_mapping
程式碼註釋
兩種方式,單行 //
或多行 /*...*/
文件註釋
寫文件用.三個斜槓 ///
或者 /** ... */
,可使用Doxygen語法,以支援生成對文件的說明,引數驗證的註解,或者是在使用者呼叫這個函式時,彈出來的確認內容。
pragma solidity ^0.4.0;
/** @title Shape calculator. */
contract shapeCalculator {
/**
*@dev calculate a rectangle's surface and perimeter
*@param w width of the rectangles
*@param h height of the rectangles
*@return s surface of the rectangles
*@return p perimeter of the rectangles
*/
function rectangles(uint w, uint h) returns (uint s ,uint p){
s = w * h;
p = 2* ( w + h);
}
}