本文主要內容來自:https://solidity-cn.readthedocs.io/zh/latest/
智能合約可以簡單的理解為一段可執行的程式片段,具體的代碼經過 Solidity 撰寫之后,發布到區塊鏈上。然后會被礦工打包記錄在某一個區塊中,當需要呼叫這個智能合約的方法時只需要向這個智能合約的地址發送一筆交易即可。
因為智能合約觸發的條件和運行邏輯都已經被撰寫在代碼里,存盤在區塊鏈上,所以可以最大程度的排除人為因素的干擾。
虛擬機 EVM 是智能合約的運行環境。它不僅是沙盒封裝的,而且是完全隔離的,也就是說在 EVM 中運行代碼是無法訪問網路、檔案系統和其他行程的。甚至智能合約之間的訪問也是受限的。
Solidity 是一門面向合約的、為實作智能合約而創建的高級編程語言。
Solidity是靜態型別語言,支持繼承、庫和復雜的用戶定義型別等特性。
一、Solidity 源檔案結構
源檔案中可以包含任意多個合約定義、匯入指令和雜注指令。
1.1 版本雜注
為了避免未來被可能引入不兼容變更的編譯器所編譯,源檔案可以(也應該)被所謂的版本雜注pragma 所注解。 因此需要以一種當修改語意時必須同步修改語法的方式引入變更,當然這有時候也難以做到。 因此,至少對含重大變更的版本,通讀變更日志永遠是好辦法。 這些版本的版本號始終是 0.x.0 或者 x.0.0 的形式。
pragma solidity ^0.4.0;
這樣,源檔案將既不允許低于 0.4.0 版本的編譯器編譯, 也不允許高于(包含) 0.5.0 版本的編譯器編譯(第二個條件因使用 ^ 被添加)。 這種做法的考慮是,編譯器在 0.5.0 版本之前不會有重大變更,所以可確保源代碼始終按預期被編譯。 上面例子中不固定編譯器的具體版本號,因此編譯器的補丁版也可以使用。
可以使用更復雜的規則來指定編譯器的版本,運算式遵循npm版本語意。
1.2 匯入其他源檔案
在全域層面上,可使用如下格式的匯入陳述句:
import "filename";
此陳述句將從 “filename” 中匯入所有的全域符號到當前全域作用域中(不同于 ES6,Solidity 是向后兼容的)。
import * as symbolName from "filename";
...創建一個新的全域符號 symbolName,其成員均來自 "filename" 中全域符號。
import {symbol1 as alias, symbol2} from "filename";
...創建新的全域符號 alias 和 symbol2,分別從 "filename" 參考 symbol1 和 symbol2 。
```
import "filename" as symbolName;
//這條陳述句等同于
import * as symbolName from "filename";
```
1.3 注釋
```
可以使用單行注釋(//)和多行注釋(/*...*/)
// 這是一個單行注釋。
/*
這是一個
多行注釋。
*/
```
此外,有另一種注釋稱為 natspec 注釋,其檔案還尚未撰寫。 它們是用三個反斜杠(///)或雙星號開頭的塊(/** ... */)書寫,它們應該直接在函式宣告或陳述句上使用。
在下面的例子中,我們記錄了合約的標題、兩個入參和兩個回傳值的說明:
```
pragma solidity ^0.4.0;
/** @title 形狀計算器。 */
contract shapeCalculator {
/** @dev 求矩形表明面積與周長。
* @param w 矩形寬度。
* @param h 矩形高度。
* @return s 求得表面積。
* @return p 求得周長。
*/
function rectangle(uint w, uint h) returns (uint s, uint p) {
s = w * h;
p = 2 * (w + h);
}
}
```
二、合約結構
在 Solidity 中,合約類似于面向物件編程語言中的類。 每個合約中可以包含狀態變數、函式、函式修飾符、事件、結構型別、和列舉型別的宣告,且合約可以從其他合約繼承。
2.1 狀態變數
狀態變數是永久地存盤在合約存盤中的值。
```
pragma solidity ^0.4.0;
contract SimpleStorage {
uint storedData; // 狀態變數
// ...
}
```
2.2 函式
函式是合約中代碼的可執行單元。
```
pragma solidity ^0.4.0;
contract SimpleAuction {
function bid() public payable { // 函式
// ...
}
}
```
函式呼叫可發生在合約內部或外部,且函式對其他合約有不同程度的可見性。
2.3 函式修飾器
函式修飾器可以用來以宣告的方式改良函式語意。
```
pragma solidity ^0.4.22;
contract Purchase {
address public seller;
modifier onlySeller() { // 修飾器
require(
msg.sender == seller,
"Only seller can call this."
);
_;
}
function abort() public onlySeller { // Modifier usage
// ...
}
}
```
2.4 事件
事件是能方便地呼叫以太坊虛擬機日志功能的介面。
```
pragma solidity ^0.4.21;
contract SimpleAuction {
event HighestBidIncreased(address bidder, uint amount); // 事件
function bid() public payable {
// ...
emit HighestBidIncreased(msg.sender, msg.value); // 觸發事件
}
}
```
2.5 結構型別
結構是可以將幾個變數分組的自定義型別。
```
pragma solidity ^0.4.0;
contract Ballot {
struct Voter { // 結構
uint weight;
bool voted;
address delegate;
uint vote;
}
}
```
2.6 列舉型別
列舉可用來創建由一定數量的“常量值”構成的自定義型別。
```
pragma solidity ^0.4.0;
contract Purchase {
enum State { Created, Locked, Inactive } // 列舉
}
```
————————————————
著作權宣告:本文作者為「Li_Yu_Qing」
uj5u.com熱心網友回復:
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/28605.html
標籤:區塊鏈技術
下一篇:區塊鏈的未來到底是黑暗還是光明?
