Solidity智能合約文件結(jié)構(gòu)
版本申明
pragma solidity ^0.4.0;
說明:
1 版本要高于0.4才可以編譯
2 ^號(hào)表示高于0.5的版本則不可編譯,第三位的版本號(hào)但可以變,留出來用做bug可以修復(fù)(如0.4.1的編譯器有bug,可在0.4.2修復(fù),現(xiàn)有合約不用改代碼)。
引用其它源文件
- 全局引入 *
import “filename”;
- 自定義命名空間引入 *
import * as symbolName from “filename”
分別定義引入
import {symbol1 as alias, symbol2} from “filename”
非es6兼容的簡(jiǎn)寫語法
import “filename” as symbolName
等同于上述
import * as symbolName from “filename”
關(guān)于路徑
引入文件路徑時(shí)要注意,非.
打頭的路徑會(huì)被認(rèn)為是絕對(duì)路徑,所以要引用同目錄下的文件使用
import “./x” as x
也不要使用下述方式,這樣會(huì)是在一個(gè)全局的目錄下
import “x” as x;
為什么會(huì)有這個(gè)區(qū)別,是因?yàn)檫@取決于編譯器,如果解析路徑,通常來說目錄層級(jí)結(jié)構(gòu)并不與我們本地的文件一一對(duì)應(yīng),它非常有可能是通過ipfs,http,或git建立的一個(gè)網(wǎng)絡(luò)上的虛擬目錄。
編譯器解析引用文件機(jī)制
各編譯器提供了文件前綴映射機(jī)制。
- 可以將一個(gè)域名下的文件映射到本地,從而從本地的某個(gè)文件中讀取
- 提供對(duì)同一實(shí)現(xiàn)的不同版本的支持(可能某版本的實(shí)現(xiàn)前后不兼容,需要區(qū)分)
- 如果前綴相同,取最長(zhǎng),
- 有一個(gè)”fallback-remapping”機(jī)制,空串會(huì)映射到“/usr/local/include/solidify”
solc編譯器
命令行編譯器,通過下述命令命名空間映射提供支持
context:prefix=target
上述的context:
和=target
是可選的。所有context
目錄下的以prefix
開頭的會(huì)被替換為target
。
舉例來說,如果你將github.com/ethereum/dapp-bin
拷到本地的/usr/local/dapp-bin
,并使用下述方式使用文件
import “github.com/ethereum/dapp-bin/library/iterable_mapping.sol” as it_mapping;
要編譯這個(gè)文件,使用下述命令:
solc github.com/ethereum/dapp-bin=/usr/local/dapp-bin source.sol
另一個(gè)更復(fù)雜的例子,如果你使用一個(gè)更舊版本的dapp-bin,舊版本在/url/local/dapp-bin_old,那么,你可以使用下述命令編譯
solc module1:github.com/ethereum/dapp-bin=/usr/local/dapp-bin \
modeule2:github.com/ethereum/dapp-bin=/usr/local/dapp-bin_old \
source.sol
需要注意的是solc僅僅允許包含實(shí)際存在的文件。它必須存在于你重映射后目錄里,或其子目錄里。如果你想包含直接的絕對(duì)路徑包含,那么可以將命名空間重映射為=\
備注:如果有多個(gè)重映射指向了同一個(gè)文件,那么取最長(zhǎng)的那個(gè)文件。
browser-solidity編譯器:
browser-solidity編譯器默認(rèn)會(huì)自動(dòng)映射到github上,然后會(huì)自動(dòng)從網(wǎng)絡(luò)上檢索文件。例如:你可以通過下述方式引入一個(gè)迭代包:
import “github.com/ethereum/dapp-bin/library/iterable_mapping.sol” as it_mapping
備注:未來可能會(huì)支持其它的源碼方式
代碼注釋
兩種方式,單行(//
),多行使用(/*…*/
)
示例
// this is a single-line comment
/*
this is a
mulit-line comment
*/
文檔注釋
寫文檔用。三個(gè)斜杠///
或/** … */
,可使用Doxygen
語法,以支持生成對(duì)文檔的說明,參數(shù)驗(yàn)證的注解,或者是在用戶調(diào)用這個(gè)函數(shù)時(shí),彈出來的確認(rèn)內(nèi)容。
示例
pragma solidity ^0.4.0;
/** @title Shape calculator.*/
contract shapeCalculator{
/**
*@dev calculate a rectangle's suface 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) ;
}
}