这篇关于Solidity教程的博客展现了不少Solidity特性。本教程假定你对以太坊虚拟机和编程有必定的了解。编程
以太坊,“世界计算机”提供了一个很是强大的全球共享基础设施,使用名为Solidity的编程语言构建去中心化应用程序。数组
让咱们开始咱们的Solidity教程,介绍Solidity。数据结构
以太坊Solidity是一种面向智能合约的高级语言,其语法与JavaScript相似。solidity是用于生成在EVM上执行的机器级代码的工具。solidity编译器获取高级代码并将其分解为更简单的指令。Solidity代码封装在Contracts中。并发
合约是以太坊去中心化应用程序的基本构建模块。全部变量和函数都是合约的一部分,这是全部项目的起点。一个名为MyFirst的空合约看起来像这样:app
version pragma ^0.4.19; contract MyFirst{ }
盯紧你的屏幕由于接下来在咱们的Solidity教程中咱们将开始编码......编程语言
源文件能够包含任意数量的合约定义,包括指令和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教程以前,应该知道以太坊有三个能够存储项目的区域。
对于几乎全部类型,都没法指定它们应存储的位置,由于它们在每次使用时都会被复制。
好了,既然你已经知道以太坊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函数将以太网发送到地址。
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具备很是简单的数学运算。如下与大多数编程语言相似:
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形式定义新类型的方法。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也有数组。
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;
映射能够看做是哈希表,它们被虚拟地初始化,使得每一个可能的键都存在并被映射到其字节表示全为零的值:类型的默认值。
映射声明为:
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应用开发,适合入门。
汇智网原创翻译,转载请标明出处。这里是原文