资讯专栏INFORMATION COLUMN

以太坊开发语言solidity入门

tigerZH / 3015人阅读

摘要:什么是以太坊是一种面向智能合约的高级语言,其语法与类似。如果希望快速进行以太坊开发,那请看我们精心打造的教程以太坊入门教程,主要介绍智能合约与应用开发,适合入门。

这篇关于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应用开发,适合入门。

汇智网原创翻译,转载请标明出处。这里是原文

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/24307.html

相关文章

  • SegmentFault 技术周刊 Vol.41 - 深入学习区块链

    摘要:和比特币协议有所不同的是,以太坊的设计十分灵活,极具适应性。超级账本区块链的商业应用超级账本超级账本是基金会下的众多项目中的一个。证书颁发机构负责签发撤 showImg(https://segmentfault.com/img/bV2ge9?w=900&h=385); 从比特币开始 一个故事告诉你比特币的原理及运作机制 这篇文章的定位会比较科普,尽量用类比的方法将比特币的基本原理讲出来...

    qianfeng 评论0 收藏0
  • 以太开发语言solidity入门

    摘要:什么是以太坊是一种面向智能合约的高级语言,其语法与类似。如果希望快速进行以太坊开发,那请看我们精心打造的教程以太坊入门教程,主要介绍智能合约与应用开发,适合入门。 这篇关于Solidity教程的博客展示了很多Solidity特性。本教程假定你对以太坊虚拟机和编程有一定的了解。 以太坊,世界计算机提供了一个非常强大的全球共享基础设施,使用名为Solidity的编程语言构建去中心化应用程序...

    hqman 评论0 收藏0
  • 以太是什么 - 以太开发入门指南

    摘要:以太坊是什么以太坊是一个建立在区块链技术之上,去中心化应用平台。运行环境以太坊虚拟机是以太坊中智能合约的运行环境。是由以太坊客户端提供的是典型的开发以太坊时使用的客户端,基于语言开发。 本文首发于深入浅出区块链社区原文链接:以太坊是什么 - 以太坊开发入门指南原文已更新,请读者前往原文阅读 很多同学已经跃跃欲试投入到区块链开发队伍当中来,可是又感觉无从下手,本文将基于以太坊平台,以通俗...

    tomlingtm 评论0 收藏0
  • 区块链技术学习指引

    摘要:引言给迷失在如何学习区块链技术的同学一个指引,区块链技术是随比特币诞生,因此要搞明白区块链技术,应该先了解下比特币。但区块链技术不单应用于比特币,还有非常多的现实应用场景,想做区块链应用开发,可进一步阅读以太坊系列。 本文始发于深入浅出区块链社区, 原文:区块链技术学习指引 原文已更新,请读者前往原文阅读 本章的文章越来越多,本文是一个索引帖,方便找到自己感兴趣的文章,你也可以使用左侧...

    Cristic 评论0 收藏0
  • 2018以太智能合约编程语言solidity的最佳IDEs

    摘要:使用基于以太坊的智能合约的集成开发环境。以太坊教程,主要介绍智能合约与应用开发,适合入门。以太坊,主要是介绍使用进行智能合约开发交互,进行账号创建交易转账代币开发以及过滤器和事件等内容。 Solidity是一种以智能合约为导向的编程语言。这是一种只有四年的年轻语言,旨在帮助开发基于以太坊数字货币的智能合约。 理解它官方文档应该是学习Solidity的最佳来源:solidity.read...

    darkerXi 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<