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)
字符串
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 {
js脚本编程入门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中使⽤。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。