Solidity語言學習筆記————31、智慧合約的基本檔案結構概述
Solidity智慧合約檔案結構
編譯器版本宣告:
pragma solidity ^0.4.0;
說明:
pragma是一個版本雜注的編譯命令,它告知編譯器如何處理原始碼的指令,這裡告訴編譯器原始碼使用的是不低於solidity04.0的但不高於0.5.0版本的編譯器編寫的。
引用其他原始檔
- 全域性引入
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建立的一個網路上的虛擬目錄。
編譯器解析引用檔案機制
各編譯器提供了檔案字首對映機制。
- 可以將一個域名下的檔案對映到本地,從而從本地的某個檔案中讀取
- 提供對同一實現的不同版本的支援(可能是某版本的實習前後不相容,需要區分)
- 如果字首相同,取最長
- 有一個“faceback-remapping”機制,空串會對映到“/usr/local/include/solidity”
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,舊版本在“/usr/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) ;
}
}
智慧合約原始檔的基本要素
- 合約類似面嚮物件語言中的類。
- 支援繼承
每個合約中可包含狀態變數(State Variables),函式(function)、函式修飾符(Function modifiers)、事件(Event)、結構型別(struct types)、列舉型別(Enum Types)
狀態變數(state Variable)
變數值會永遠存在在合約中的儲存空間中。
pragma solidity ^0.4.0;
// simple store example
contract simpleStorage{
uint valueStore; //state variable
}
詳情見“型別(type)”一節,關於所有支援的型別和變數相關的可見性(Visibility and Accessors).
函式(Function)
智慧合約中的一個可執行單元
pragma solidity ^0.4.0;
contract simpleMath{
//Simple add function,try a divide action?
function add(uint x, uint y) returns (uint z){
z = x + y;
}
}
上述例項展示了一個簡單的加法函式。
函式呼叫可以設定為內部(internal)和外部(External)的。同時對於其他合同的不同級別的可見性和訪問控制(Visibility and Accessors)。具體的情況詳見後面型別中關於函式的章節。
函式修飾符(Function Modifiers)
函式修飾符用於增強語義。主要有public、private、internal、external等,在之後的內容中會細細講述的。
事件(Events)
事件是以太坊虛擬機器(EVM)日誌基礎設施的一個便利介面。用於獲取當前發生的事件。
例項:
pragma solidity ^0.4.0;
contract SimpleAuction {
event aNewHigherBid(address bidder, uint amount);
function bid(uint bidValue) external {
aNewHigherBid(msg.sender, msg.value);
}
}
關於事件如何宣告以及如何使用,在之後的內容中會詳細的介紹到。
結構體型別(Struct types)
自定義的將幾個變數組合在一起形成的新的資料型別。
例項:
pragma solidity ^0.4.0;
contract Company {
//user defined `Employee` struct type
//group with serveral variables
struct employee{
string name;
uint age;
uint salary;
}
//User defined `manager` struct type
//group with serveral variables
struct manager{
employee employ;
string title;
}
}
列舉型別
特殊的自定義型別,型別的所有值可以列舉的情況。詳見後續的章節。
例項:
pragma solidity ^0.4.0;
contract Home {
enum Switch{On,Off}
}
參考內容:Solidity翻譯文件
相關文章
- Solidity語言學習筆記————32、建立合約Solid筆記
- Solidity語言學習筆記————35、抽象合約和介面Solid筆記抽象
- Solidity語言學習筆記————44、合約的後設資料Solid筆記
- Solidity語言學習筆記————15、結構體StructSolid筆記結構體Struct
- Solidity語言學習筆記————3、Remix的基本使用Solid筆記REM
- Solidity語言學習筆記————1、初識Solidity語言Solid筆記
- Solidity語言學習筆記————17、原始檔對映Solid筆記
- Solidity語言學習筆記————38、Solidity彙編Solid筆記
- 智慧合約語言 Solidity 教程系列8 - Solidity APISolidAPI
- 智慧合約語言 Solidity 教程系列8 – Solidity APISolidAPI
- Solidity語言學習筆記————36、 庫Solid筆記
- Solidity語言學習筆記————37、Using forSolid筆記
- Solidity語言學習筆記————4、常量Solid筆記
- 智慧合約語言Solidity的最佳VSCode 外掛SolidVSCode
- Solidity語言學習筆記————33、事件(Events)Solid筆記事件
- Solidity語言學習筆記————12、陣列Solid筆記陣列
- Solidity語言學習筆記————34、繼承Solid筆記繼承
- Linux 學習筆記--目錄結構及檔案基本操作Linux筆記
- Solidity語言學習筆記————43、安全考量Solid筆記
- Solidity語言學習筆記————42、提示和技巧Solid筆記
- Solidity語言學習筆記————28、純函式Solid筆記函式
- Solidity語言學習筆記————26、回退函式Solid筆記函式
- Solidity語言學習筆記————16、對映MappingSolid筆記APP
- 用solidity語言開發代幣智慧合約Solid
- 智慧合約從入門到精通:Solidity組合語言Solid組合語言
- Solidity語言學習筆記————41、記憶體佈局Solid筆記記憶體
- Solidity語言學習筆記————39、獨立彙編Solid筆記
- Solidity語言學習筆記————25、作用域和宣告Solid筆記
- Solidity語言學習筆記————27、檢視函式Solid筆記函式
- Solidity語言學習筆記————10、布林型、整型Solid筆記
- Solidity語言學習筆記————18、字串和函式Solid筆記字串函式
- Solidity語言學習筆記————14、左值運算子Solid筆記
- Solidity語言學習筆記————9、左值運算子Solid筆記
- Solidity語言學習筆記————5、全域性變數Solid筆記變數
- Solidity語言學習筆記————2、使用編譯器Solid筆記編譯
- Solidity語言學習筆記————30、函式過載Solid筆記函式
- Solidity語言學習筆記————26、Assert, Require, Revert 和 ExceptionsSolid筆記UIException
- Solidity語言學習筆記————22、可見性和GettersSolid筆記