1. 程式人生 > >Solidity 官方文件中文版(四)

Solidity 官方文件中文版(四)

Solidity智慧合約檔案結構

版本申明


pragma solidity ^0.4.0;

說明:
1 版本要高於0.4才可以編譯
號表示高於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) ;

    }

}

感謝您的支援