# Solidity智能合約文件結構
[TOC]
## 版本申明
```
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"
```
分別定義引入
```
import {symbol1 as alias, symbol2} from "filename"
```
非es6兼容的簡寫語法
```
import "filename" as symbolName
```
等同于上述
```
import * as symbolName from "filename"
```
**關于路徑**
引入文件路徑時要注意,非`.`打頭的路徑會被認為是絕對路徑,所以要引用同目錄下的文件使用
```
import "./x" as x
```
也不要使用下述方式,這樣會是在一個全局的目錄下
```
import "x" as x;
```
為什么會有這個區別,是因為這取決于編譯器,如果解析路徑,通常來說目錄層級結構并不與我們本地的文件一一對應,它非常有可能是通過ipfs,http,或git建立的一個網絡上的虛擬目錄。
## 編譯器解析引用文件機制
各編譯器提供了文件前綴映射機制。
1. 可以將一個域名下的文件映射到本地,從而從本地的某個文件中讀取
2. 提供對同一實現的不同版本的支持(可能某版本的實現前后不兼容,需要區分)
3. 如果前綴相同,取最長,
4. 有一個`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
```
另一個更復雜的例子,如果你使用一個更舊版本的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僅僅允許包含實際存在的文件。它必須存在于你重映射后目錄里,或其子目錄里。如果你想包含直接的絕對路徑包含,那么可以將命名空間重映射為`=\`
備注:如果有多個重映射指向了同一個文件,那么取最長的那個文件。
## browser-solidity編譯器:
browser-solidity編譯器默認會自動映射到github上,然后會自動從網絡上檢索文件。例如:你可以通過下述方式引入一個迭代包:
```
import "github.com/ethereum/dapp-bin/library/iterable_mapping.sol" as it_mapping
```
備注:未來可能會支持其它的源碼方式
## 代碼注釋
兩種方式,單行(`//`),多行使用(`/*…*/`)
_示例_
```
// this is a single-line comment
/*
this is a
mulit-line comment
*/
```
### 文檔注釋
寫文檔用。三個斜杠`///`或`/** … */`,可使用`Doxygen`語法,以支持生成對文檔的說明,參數驗證的注解,或者是在用戶調用這個函數時,彈出來的確認內容。
```
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 ) ;
}
}
```
- Solidity語言
- 入門說明
- Solidity智能合約文件結構
- 智能合約源文件的基本要素概覽
- 值類型
- 類型
- 布爾
- 整型
- 地址
- 字節數組
- 小數
- 字符串
- 十六進制字面量
- 枚舉
- 函數
- 引用類型
- 引用類型
- 數據位置
- 數組
- 數據結構
- 雜項
- 映射
- 左值運算符
- 類型間的轉換
- 類型推斷
- 單位
- 貨幣單位
- 時間單位
- 語言內置特性
- 特殊變量及函數
- 數學和加密函數
- 地址相關
- 進階
- 入參和出參
- 控制結構
- 函數調用
- 創建合約實例
- 表達式的執行順序
- 賦值
- 作用范圍和聲明
- 異常
- 內聯匯編
- 合約詳解
- 合約
- 可見性或權限控制
- 訪問函數
- 函數修改器
- 常狀態變量
- 回退函數
- 事件
- 繼承
- 接口
- 其它
- 庫
- 狀態變量的存儲模型
- 內存變量的存局
- 調用數據的布局