Solidity智能合約的文件結(jié)構(gòu)

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ī)制。

  1. 可以將一個(gè)域名下的文件映射到本地,從而從本地的某個(gè)文件中讀取
  2. 提供對(duì)同一實(shí)現(xiàn)的不同版本的支持(可能某版本的實(shí)現(xiàn)前后不兼容,需要區(qū)分)
  3. 如果前綴相同,取最長(zhǎng),
  4. 有一個(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) ;

    }

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,527評(píng)論 19 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,848評(píng)論 25 709
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,261評(píng)論 6 342
  • 一、溫故而知新 1. 內(nèi)存不夠怎么辦 內(nèi)存簡(jiǎn)單分配策略的問題地址空間不隔離內(nèi)存使用效率低程序運(yùn)行的地址不確定 關(guān)于...
    SeanCST閱讀 8,117評(píng)論 0 27
  • 耳邊懸掛著多少往事 才能使你聽到我的呢喃 紅木前寂寞的座椅 何時(shí)才...
    蘭格里閱讀 95評(píng)論 0 0

友情鏈接更多精彩內(nèi)容