以太坊開發語言solidity入門

這篇關於Solidity教程的博客展現了不少Solidity特性。本教程假定你對以太坊虛擬機和編程有必定的瞭解。編程

以太坊,「世界計算機」提供了一個很是強大的全球共享基礎設施,使用名爲Solidity的編程語言構建去中心化應用程序。數組

讓咱們開始咱們的Solidity教程,介紹Solidity。數據結構

什麼是Solidity?

以太坊Solidity是一種面向智能合約的高級語言,其語法與JavaScript相似。solidity是用於生成在EVM上執行的機器級代碼的工具。solidity編譯器獲取高級代碼並將其分解爲更簡單的指令。Solidity代碼封裝在Contracts中。併發

以太坊合約中的solidity

合約是以太坊去中心化應用程序的基本構建模塊。全部變量和函數都是合約的一部分,這是全部項目的起點。一個名爲MyFirst的空合約看起來像這樣:app

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開始的編譯器上運行。oop

導入其餘源文件

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應用開發,適合入門。

匯智網原創翻譯,轉載請標明出處。這裏是原文

相關文章
相關標籤/搜索