Solidity教程:初學Solidity
這篇關於Solidity教程的部落格展示了很多Solidity特性。本教程假定你對以太坊虛擬機器和程式設計有一定的瞭解。
以太坊,“世界計算機”提供了一個非常強大的全球共享基礎設施,使用名為Solidity的程式語言構建去中心化應用程式。
讓我們開始我們的Solidity教程,介紹Solidity。
什麼是Solidity?
以太坊Solidity是一種面向智慧合約的高階語言,其語法與JavaScript類似。solidity是用於生成在EVM上執行的機器級程式碼的工具。solidity編譯器獲取高階程式碼並將其分解為更簡單的指令。Solidity程式碼封裝在Contracts中。
以太坊合約中的solidity
合約是以太坊去中心化應用程式的基本構建模組。所有變數和函式都是合約的一部分,這是所有專案的起點。一個名為MyFirst的空合約看起來像這樣:
version pragma ^0.4.19; contract MyFirst{ }
盯緊你的螢幕因為接下來在我們的Solidity教程中我們將開始編碼……
Solidity檔案的佈局
原始檔可以包含任意數量的合約定義,包括指令和pragma指令。
Version Pragma
Version Pragma是定義程式碼使用的Solidity編譯器版本的宣告。
version pragma ^0.4.00;
注意:上面顯示的原始檔不會使用早於版本0.4.0的編譯器進行編譯,也不能在從版本0.5.0開始的編譯器上執行。
匯入其他原始檔
Ethereum Solidity支援與JavaScript中可用的匯入語句非常相似的匯入語句,儘管Solidity不知道 default export
的概念。
在全域性級別,可以使用以下形式的import語句:
import "filename";
上述語句將所有全域性符號從 filename
匯入當前全域性範圍。
import * as symbolName from "filename";
註釋
就像任何其他語言一樣,Solidity可以使用單行和多行註釋。
// This is a single-line comment. /* This is a multi-line comment */
現在,在我們進一步深入瞭解Solidity教程之前,應該知道以太坊有三個可以儲存專案的區域。
- 儲存Storage:所有合約狀態變數所在的位置。每個合約都有自己的儲存,並且在函式呼叫之間是持久的。
- 記憶體Memory:儲存臨時值並在(外部)函式呼叫之間擦除,並且使用起來更便宜。
- 堆疊Stack:儲存小的區域性變數並且幾乎可以免費使用,但只能儲存有限數量的值。
對於幾乎所有型別,都無法指定它們應儲存的位置,因為它們在每次使用時都會被複制。
好了,既然你已經知道以太坊Solidity中的儲存位置,那麼讓我告訴你一般的值型別。
solidity中的值型別
以下型別也稱為值型別,因為這些型別的變數將始終按值傳遞。
布林
關鍵詞:bool
值是常數,即true或false。
整型
關鍵字:int/uint(uint8到uint256,步長為8(無符號,最多為256位),int8為int256)
各種大小的有符號和無符號整數。
例:
contract MySample{ uint UnsignedInt =50; }
在上面的語句中,我們建立了一個名為InsignedInt的uint並將其設定為50。
地址
關鍵字:address
儲存一個20位元組的值(以太坊地址的大小)。地址型別也有 members
,並作為所有合約的基礎。
地址成員:balance與transfer
可以使用屬性balance查詢地址的餘額,並使用transfer函式將乙太網傳送到地址。
address x = 0x123; address myAddress = this; if(x.balance < 10 && myAddress.balance > = 10) x.transfer(10);
字串
String:字串文字用雙引號或單引號如“foo”或’bar’編寫。
用於任意長度的UTF資料。
string language ="Solidity";
這些值型別可以在包含運算子的表示式中相互互動。接下來,在我們的Solidity教程中,讓我告訴你各種運算子。
運算子
solidity的運算子與JavaScript相同。Solidity有四種類型的運算子:
算術運算子
Solidity具有非常簡單的數學運算。以下與大多數程式語言類似:
- 增加:x + y
- 減法:x - y
- 乘法:x * y
- 除法:x / y
- 取整/求餘:x%y
Solidity還提供了使用指數運算子的選項,具體如下:
uint x = 10 **3; // equal to 10^3 = 1000
增量運算子
增量運算子的穩定性:a++,a- ,++a,-a,a+=1,a=a+1
適用於其他程式語言的規則也是類似的。
按位運算子
以下是運算子:(按位OR)’|’,(按位異或),(按位求反)’~’,(按位右移)’>>’,(按位左移)’<<’
邏輯運算子
Solidity中的邏輯運算子:!(邏輯否定),&&(邏輯和),||(邏輯或),==(相等),!=(不相等)
例:
contract operators { // Arithmetic Operators // +,-,*,/, %, ** // Incremental Operators // a++, a--, a+=1, a=a+1,++a,--a; a=10; a= a++; //here, output will be 10, because the value is first returned and then then increment is done a=++a; //Logical Operators !, &&, ||, ==, != isOwner = true && false; var orValue= 0x02 | 0x01; // output would be 0x03 //Bitwise Operators~,>>, <<; function Operators() { // Initialize state variables here}}
現在有時需要更復雜的資料型別。為此,Solidity提供結構。
solidity資料結構
Solidity提供三種類型的資料結構:
結構Structs
Solidity提供了一種以Structs形式定義新型別的方法。Structs是自定義型別,可以對多個變數進行分組。
pragma solidity ^0.4.0; contract Ballot { struct Voter { // Struct uint weight1, weight2, weight3; bool voted; address delegate1, delegate2, delegate3, delegate4; string name; uint vote1, vote2, vote3, vote4, vote5; uint height1, height2, height3} }
注意:結構只能有16個成員,超過該成員可能會發生以下錯誤: Stack too Deep 堆疊太深。
結構允許建立具有多個屬性的更復雜的資料型別。
現在,如果你需要一些集合,比如說地址,那該怎麼辦?好吧,就像大多數語言一樣,Solidity也有陣列。
陣列Arrays
Solidity中的陣列可以具有編譯時固定大小,也可以是動態的。
uint[3] fixed;//array of fixed length 3 uint[] dynamic; //a dynamic array has no fixed size, it can keep growing
還可以建立一個結構陣列。使用以前建立的Voter結構:
Voter[] voting;
注意:將陣列宣告為public將自動為其建立getter方法。
Voter[] public voting;
對映mappings
對映可以看作是雜湊表,它們被虛擬地初始化,使得每個可能的鍵都存在並被對映到其位元組表示全為零的值:型別的預設值。
對映宣告為:
Mapping(_Keytype => _ValueType )
注意:_Keytype幾乎可以是任何型別,除了動態大小的陣列,合約,列舉和結構。
例:
contract MappingExample { mapping(address => uint) public balances; function update(uint newBalance) { balances[msg.sender] = newBalance;}} contract MappingUser { function f() returns (uint) { MappingExample m = new MappingExample(); m.update(100); return m.balances(this); }}
控制結構
除了switch和goto之外,JavaScript中的大多數控制結構都在Solidity中可用。
所以有:if,else,while,do,for,break,continue,return,? :,使用從C或JavaScript中已知的通常語義。
注意:沒有像C和JavaScript那樣從非布林型別到布林型別的型別轉換。
現在讓我們看看這些控制結構如何在Solidity中使用。
contract ControlStructure { address public a; function ControlStructure>){ // if-else can be used like this if(input1==2) a=1; else a=0; // while can be used like this while(input1>=0){ if(input1==5) continue; input1=input1-1; a++;} // for loop can be used like this for(uint i=0;i<=50;i++) { a++; if(a==4) break; } //do while can be used like this do { a--; } (while a>0); // Conditional Operator can be used like this bool IsTrue = (a == 1)?true: false; /*will show an error because there is no type conversion from non-boolean to boolean */ if(1) { }
繼續我們的Solidity教程部落格,讓我們談談合約中可執行的程式碼單元。這些被稱為函式。
函式
以下是在Solidity中宣告函式的方式。
function sampleFunc(string name, uint amount) { }
上面宣告的是一個空體函式,它有兩個引數:一個字串和一個uint。
可以這樣呼叫此函式:
sampleFunc("Shashank", 10000);
談到函式,Solidity還提供函式修飾符。
函式修飾符
它用於輕鬆更改函式的行為。甚至在進行函式呼叫之前也可以檢查這些條件,因為它們已在智慧合約的函式定義中宣告。
示例:如果要僅通過函式的所有者或建立者呼叫kill contract函式。
contract FunctionModifiers{ address public creator; function FunctionModifiers() { creator = msg.sender;} Modifier onlyCreator() { if(msg.sender!=creator){ throw; } _; //resumes the function wherever the access modifier is used } function killContract() onlyCreator{ //function will not execute if an exception occurs self-destruct(creator); }}
繼承
Solidity通過複製包含多型的程式碼來支援多重繼承。
contract Owned { address Owner ; function owned() { owner = msg.sender; }} contract Mortal is Owned {// 'is' keyword is used for inheritance function kill(){ self-destruct(owner);}} contract User is Owned, Mortal //Multiple inheritance { string public UserName; function User(string _name){ UserName = _name; }}
好吧,我覺得上面討論的概念足以讓你開始使用Solidity程式設計。
去寫程式碼吧!!
有了這個,我結束了這個Solidity Tutorial部落格。我希望你喜歡閱讀這篇部落格並發現它內容豐富。到目前為止,必須對Solidity Programming Language的理解有所瞭解。現在去練習吧。
如果希望快速進行以太坊開發,那請看我們精心打造的教程:以太坊入門教程,主要介紹智慧合約與dapp應用開發,適合入門。
其他區塊鏈教程如下:
- 以太坊開發進階教程,主要是介紹使用node.js、mongodb、區塊鏈、ipfs實現去中心化電商DApp實戰,適合進階。
- java以太坊開發教程,主要是針對java和android程式設計師進行區塊鏈以太坊開發的web3j詳解。
- python以太坊,主要是針對python工程師使用web3.py進行區塊鏈以太坊開發的詳解。
- php以太坊,主要是介紹使用php進行智慧合約開發互動,進行賬號建立、交易、轉賬、代幣開發以及過濾器和事件等內容。
- C#以太坊,主要講解如何使用C#開發基於.Net的以太坊應用,包括賬戶管理、狀態與交易、智慧合約開發與互動、過濾器和事件等。
- php比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在Php程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是Php工程師不可多得的比特幣開發學習課程。
- EOS入門教程,本課程幫助你快速入門EOS區塊鏈去中心化應用的開發,內容涵蓋EOS工具鏈、賬戶與錢包、發行代幣、智慧合約開發與部署、使用程式碼與智慧合約互動等核心知識點,最後綜合運用各知識點完成一個便籤DApp的開發。
匯智網原創翻譯,轉載請標明出處。這裡是 ofollow,noindex">原文