第一行代码:以太坊(2)-使用Solidity语言开发和测试智能合约
智能合约是以太坊的核心之一,用户可以利用智能合约实现更灵活的代币以及其他DApp。不过在深入讲解如何开发智能合约之前,需要先介绍一下以太坊中用于开发智能合约的Solidity语言,以及相关的开发和测试环境。
智能合约就是运行在以太坊上的程序。客户端可以通过Web3.js API调用智能合约,而智能合约本身又可以直接访问以太坊网络,也就是说,智能合约前面连接着客户端,后面连接着以太坊网络,起到了承前启后的作用,而且通过智能合约,可以让整个以太坊网络更灵活,可控性更强。其实智能合约的作用相当于微软Office中的VBA,一个功能强大的领域脚本语言。智能合约的开发语言是Solidity,那么Solidity是什么呢?应该如何在以太坊网络上运行用Solidity语言编写的智能合约呢?本文将会揭晓这些问题的答案。
1. 什么是Solidity语言
Solidity是一种用于编写智能合约的高级语言,运行在Ethereum虚拟机(以太坊虚拟机,EVM)之上。那么Solidity到底是怎样一种编程语言呢?或者说Solidity语言的主要特性是什么呢?请继续往下看。
Solidity语言的语法接近于JavaScript,是一种面向对象的语言。但作为一种真正意义上运行在网络上的去中心智能合约,它又有很多的不同,下面列举一些Solidity语言的主要特性。
- 以太坊底层是基于帐户的,因此在Solidity语言中有一个特殊的Address数据类型。用于定位用户,定位合约,定位合约的代码(合约本身也是一个帐户)。
- 由于Solidity语言内嵌框架是支持支付的,所以提供了一些关键字,如payable,可以在语言层面直接支持支付。
- Solidity语言可以将数据存储在区块链上,数据的每一个状态都可以永久存储,所以需要确定变量使用的是内存,还是区块。
- 运行环境是在去中心化的网络上,会比较强调合约或函数执行的调用的方式。因为原来一个简单的函数调用变为了一个网络上的节点中的代码执行。
- 最后一个非常大的不同则是Solidity语言的异常机制,一旦出现异常,所有的执行都将会被回撤,这主要是为了保证智能合约执行的原子性,以避免中间状态出现的数据不一致。有点类似于数据库中的事务回滚。
2. 用Solidity语言开发智能合约
Solidity是一种图灵完备的编程语言,所以编程的方式与Java、C++类似。不过Solidity语言中并没有类的概念,但有一个合约的概念,用关键字contract表示。任何一个Solidity程序,都必须至少有一个合约(contract)。在合约中可以编写Solidity函数,类似于类中的方法。Solidity源代码文件的扩展名是sol,下面的例子给出了一个简单的使用Solidity语言编写的智能合约的例子,以便读者对Solidity语言和智能合约有一个感性的认识。
下面的例子给出了一个名为Calc的智能合约程序,在该智能合约中有一个add函数,用于将两个无符号整数相加,并返回相加的结果。
pragma solidity ^0.4.0;
contract Calc{
function add(uint a,uint b) returns (uint){
return a + b;
}
}
尽管现在还没有正式讲解Solidity语言和智能合约,不过从这段简单的智能合约代码也可以了解Solidity语言的结构。首先,智能合约的第1行需要使用pragma solidity指定Solidity编译器的最低版本,本例是0.4.0,也就是说,要编译这段Solidity程序,Solidity编译器的版本不能低于0.4.0。要记住,在版本号前面要加上“^”。
接下来就是用contract关键字声明智能合约,语法与类非常接近,智能合约的名字跟在contract关键字后面,智能合约中的代码用一对花括号括起来。
最后是在智能合约中声明若干个函数,函数的语法与JavaScript类似(都是使用function关键字声明函数),不过也不完全相同,因为Solidity是强类型的编程语言,而JavaScript是弱类型的编程语言。也就是说,声明Solidity变量需要指定数据类型,如本例的uint,表示无符号整数类型。函数的返回值类型需要在函数声明的结尾通过returns关键字指定。如本例的returns(uint),函数返回值与C风格的编程语言相同,仍然使用return语句指定函数返回值。Solidity语言的每一条语句后面都要跟分号(;)。
3. 使用Remix运行智能合约
学习编写智能合约最重要的一步就是运行智能合约,否则无法知道我们编写的智能合约程序是否正确。在正常情况下,应该将智能合约部署在以太坊网络上,然后通过以太坊客户端调用,不过现在还没有讲如何将智能合约部署到以太坊网络上,以及如何调用智能合约。所以目前只能使用最简单的方式测试智能合约。以太坊官方提供了一个在线的智能合约编写和测试环境:Remix,通过这个工具,可以用不同的方式测试智能合约。
在浏览器地址栏输入如下的Url后,会进入Remix页面。
Remix页面主要包含如下4部分。
- 智能合约列表区域,位于Remix页面的左侧,如果第一次使用Remix,这个区域只有browser和config两个节点,如果以前使用Remix创建过智能合约,会在browser节点下方显示曾经创建过的智能合约文件(.sol文件)。
- 代码区域,位于Remix页面的中上部,用于编写智能合约代码。
- 日志区域,位于Remix页面的中下部,运行智能合约后,会将日志信息输出到这一区域。
- 设置区域,位于Remix页面右侧,在这一区域可进行各种设置,如将智能合约部署在以太坊网络上,运行智能合约等。
除了这4部分外,在Remix页面左上角还有一排按钮,其中最左侧的加号按钮用于新建智能合约,最右侧的加号和减号按钮分别用于增加和减少智能合约代码的字号。Remix页面的整体布局如下图所示。

接下来单击Remix页面左上角的加号按钮,会弹出一个如下图所示的页面,在“File Name”文本框输入“Calc.sol”,然后单击“OK”按钮创建新的智能合约。

将上一节给出的智能合约代码输入代码区域,可以点击加号和减号按钮将代码字体调整到自己感觉舒服的程度,效果如下图所示。在设置区域会出现一些警告,并不需要管它们。

在设置区域切换到“Run”页面,所有的设置保持默认值即可,然后点击中间的“Deploy”部署Calc合约。成功部署Calc合约后,会在“Run”页面下方根据Calc合约中的函数显示相应的按钮,如本例中只有一个add函数,并且该函数有两个参数,所以在“Run”页面下方会出现一个“add”按钮,在按钮旁边的文本框输入“3,4”,表示add函数的两个参数值,如下图所示。

最后单击“add”按钮执行add函数,会在日志区域显示相应的信息,然后单击日志区域输出信息的向下箭头,会在日志区域显示一个表格,在“decoded output”行会显示add函数的返回值(计算结果),如下图所示。

通过本节的若干步骤,终于成功运行了Calc智能合约的add函数,并获得了add函数的返回值(本例是7),不过这个智能合约程序并没有部署在以太坊网络上,而是在本地运行的,也就是说,本节其实是通过模拟的方式运行了本地合约,这种运行方式只能测试智能合约中的函数的逻辑是否正确,并不能将以太坊客户端、以太坊网络和智能合约放到一起联调,所以在实际的场景中,需要将智能合约部署到以太坊网络上才能完整地对其进行测试。
第一行代码:以太坊(2)-使用Solidity语言开发和测试智能合约的更多相关文章
- 用solidity语言开发代币智能合约
智能合约开发是以太坊编程的核心之一,而代币是区块链应用的关键环节,下面我们来用solidity语言开发一个代币合约的实例,希望对大家有帮助. 以太坊的应用被称为去中心化应用(DApp),DApp的开发 ...
- 以太坊系列之十六: 使用golang与智能合约进行交互
以太坊系列之十六: 使用golang与智能合约进行交互 以太坊系列之十六: 使用golang与智能合约进行交互 此例子的目录结构 token contract 智能合约的golang wrapper ...
- 以太坊系列之十六:golang进行智能合约开发
以太坊系列之十六: 使用golang与智能合约进行交互 以太坊系列之十六: 使用golang与智能合约进行交互 此例子的目录结构 token contract 智能合约的golang wrapper ...
- 《第一行代码》学习笔记2-Android开发特色
1.四大组件:活动(Activity),服务(Service),广播接收器(Broadcast Receiver),内容提供器(Content Provider). Activity:应用中看得到的东 ...
- HTML5 & CSS3初学者指南(1) – 编写第一行代码
介绍 网络时代已经到来.现在对人们来说,每天上网冲浪已经成为一种最为常见的行为. 在网页浏览器中输入一段文本地址,就像http://www.codeproject.com,等待一下,网页就加载到浏览器 ...
- 安卓开发学习经历2--《第一行代码》coolweather项目SQL语句同一个“陷阱”掉两次 注意转义字符等特殊字符正确书写 关于Id字段自增加体会
今天,在运行<第一行代码>coolweather第二阶段代码,又一次报错,还是神奇地与昨天相似,提示,city_id字段不存在,这里我有两种理解,一种是sql语句出错了,另外一种是没有获取 ...
- 安卓开发学习历程1——《第一行代码》coolweather项目setOnItemClickListener函数,Sql语句修改对模拟app程序机影响
今天,将<第一行代码>最后实战的coolweather项目,认真做了一遍. 今晚,在书中第一阶段开发代码认眞在Android studio敲完,发现setOnItemClickListen ...
- 【java学习系列】 Android第一本书《第一行代码》
开始Java的学习,从Android,开始吧.<第一代码>开始阅读和调试demo例子. 下面是 <第一行代码>的思维导图:
- 《第一行代码——Android》
<第一行代码——Android> 基本信息 作者: 郭霖 丛书名: 图灵原创 出版社:人民邮电出版社 ISBN:9787115362865 上架时间:2014-7-14 出版日期:2014 ...
随机推荐
- web前端(12)—— 页面布局2
本篇博文,主要就讲定位的问题,也就是页面布局里最重要的,本篇博文不出意外的话,也是css的最后一篇博文了 定位,position属性 定位有三种: 相对定位 绝对定位 固定定位 相对定位,positi ...
- 自动化测试基础篇--Selenium简单的163邮箱登录实例
摘自https://www.cnblogs.com/sanzangTst/p/7472556.html 前面几篇内容一直讲解Selenium Python的基本使用方法.学习了什么是selenium: ...
- Lua无法排序的问题(Key需要是连续的)
排序的Key需要是连续的 local x = {[1]={x=6}, [2]={x=5}, [3]={x=7}, [5]={x=2}, [6]={x=8}, [7]={x=5}} ---从小到大排序 ...
- Python 面向对象的特性2-----继承
面向对象的三大特性 1.封装 根据职责将属性和方法封装到一个抽象的类中,然后类创建一个实实在在的对象,有了对象以后,就可以访问到对象内部的属性,或者让对象来调用一个已经封装好的方法. 2.继承 实现代 ...
- 安装Window 10系统------计算机经验
为什么这次安装window10系统呢?不是和window7系统的安装方法一样么?如果你是这样的想的话,是不完全对的,因为window10系统的安装有些繁杂,需要耐心.下面我就准备了官方原版的windo ...
- php curl参数详解之post方法
利用记录的URL参数解释,写一个post方法: <?php function do_post($url, $data) { $ch = curl_init(); //设置CURLOPT_RETU ...
- ASP.NET -- WebForm -- .aspx与.aspx.cs文件
ASP.NET -- WebForm -- .aspx与.aspx.cs文件 1. ASP.NET -- WebForm(C#)文件 .aspx文件:是Html页面,页面的布局,样式在该文件中设计. ...
- June 9. 2018, Week 23rd, Saturday
I know nothing except the fact of my ignorance. 除了自己的无知,我一无所知. Believe it or not, true wisdom exists ...
- python3编写网络爬虫17-验证码识别
一.验证码识别 1.图形验证码的识别 识别图形验证码需要 tesserocr 库 OCR技术识别(光学字符识别,是指通过扫描字符,然后通过其形状将其翻译成电子文本的过程.)例如 中国知网注册页面 ht ...
- Ubuntu 普通用户无法启动Google chrome
删除 /home/你的用户名/.config/google-chrome文件,再打开就好了 root@ecos:cd /home/ecos/.config root@ecos:~/.config# r ...