第一行代码:以太坊(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页面。

https://remix.ethereum.org

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),不过这个智能合约程序并没有部署在以太坊网络上,而是在本地运行的,也就是说,本节其实是通过模拟的方式运行了本地合约,这种运行方式只能测试智能合约中的函数的逻辑是否正确,并不能将以太坊客户端、以太坊网络和智能合约放到一起联调,所以在实际的场景中,需要将智能合约部署到以太坊网络上才能完整地对其进行测试。

《第一行代码:以太坊》开始转载了

原文地址:http://blog.51cto.com/androidguy/2298429

时间: 2024-08-11 09:56:11

第一行代码:以太坊(2)-使用Solidity语言开发和测试智能合约的相关文章

第一行代码:以太坊(3)-使用更多的工具编写和测试智能合约

<第一行代码:以太坊>开始连载了 在上文中已经使用了Remix环境运行和测试了本书编写的第一个智能合约程序,不过编写和测试智能合约的测试方式很多,例如,在testrpc环境测试:在Intellij IDEA集成开发环境中用Solidity语言编写智能合约:在纯Web环境中测试智能合约:使用AJAX方式测试智能合约等.本文将详细介绍这些用于编写和测试智能合约的方法. 1.安装本地remix环境(Windows.Mac OS X和Linux) 在本节使用Remix环境运行和测试了Calc智能合约,

《第一行代码:以太坊》已经出版,开始连载了,购买送视频课程

好消息,<第一行代码:以太坊>已经出版!!! ?●骨灰级大牛: 51CTO学院金×××讲师.CSDN.51CTO博客专家.宁哥教育创始人.著名码农李宁亲著 ● 超级学习资源:实打实赠送价值698元JavaScript视频课程 本书视频课 全套实验软件 全书案例源码 一对一解答 不定期惊喜 ● 购买地址: 当当 京东 随书赠送的视频课程1随书赠送的视频课程2 李宁老师的视频课程 购买<第一行代码:以太坊>一书,5分好评,评语不得低于20字,将截图发到[email protected]

第一行代码:以太坊(1)-创建自己的私有区块链

本文会利用以太坊客户端(geth)搭建一个私有区块链,并在这个私有区块链上挖矿,通过本文的案例,读者可以更深入理解区块链.以太坊.挖矿的理论. 通过阅读本文,您可以: 掌握搭建以太坊开发环境的方法 掌握geth的基本使用方法 了解如何启动JavaScript控制台 掌握建立一个私有区块链的步骤 掌握如何在私有区块链上挖矿 1. 以太坊(Ethereum)开发环境搭建 在玩以太坊之前,首先要搭建以太坊的开发环境.第一步就是安装geth.那么geth是什么呢?geth(或称为go-ethereum)

跟刷 《 Android Studio 单刷第一行代码》 记录坑

跟刷系列   Android Studio 单刷第一行代码 原帖地址http://www.cnblogs.com/DebugLife/p/4355687.html 记录自己的失误,也算是个督促自己了. 1. 坑--去除标题栏 在 Activity 的 onCreate()方法中添加 requestWindowFeature(Window.FEATURE_NO_TITLE);

《第一行代码》Android特色开发,基于位置服务,出现的问题

手机GPS定位较慢.精度高.耗电量多,网络定位较快.精度低.耗电量少 当位置精度要求非常高的时候,使用GPS定位:一般情况下,使用网络定位. 按<第一行代码>写了一个定位程序,真机一直没有定位信息输出,但是模拟器上有输出. 最后发现了问题,将手机上的定位模式改为移动网络定位,而不是GPS定位,定位信息会立刻显示出来. 是GPS定位较慢导致的. 还有一点,手机如果有链接WIFI,采用GPS定位可能显示不出来,最好使用数据网络(即手机自己的网)定位.

HTML5&CSS3初学者指南(1) – 编写第一行代码

介绍 网络时代已经到来.现在对人们来说,每天上网冲浪已经成为一种最为常见的行为. 在网页浏览器中输入一段文本地址,就像http://www.codeproject.com,等待一下,网页就加载到浏览器窗口中.一个典型的网页是由文本.图像和链接组成的.除去内容上的差异,不同网站的网页也具有不同的外观和感受,以实现在网络上建立自己的身份品牌的目的. 如果你也曾想要了解你屏幕上的这些网页是如何被创建出并以各式各样的方式渲染的,那么这里正是你可以了解到这些知识的地方.让我们一起走进在浏览器中创建了这么多

安卓模拟聊天界面---改编第一行代码

主界面 <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:

Android开发——《第一行代码》自学中

大学时候学过C++,Java,算法,数据结构以及其他很多东西,但都学的不精.就要毕业照工作了,总要专注于一门技术,于是开始学安卓. 开发环境是在慕课网下的eclipse. <第一行代码>这本书我也才只看了不到一半,学到第五章广播,但犯过很多错误,抛出来嘲笑下以前的自己,大家引以为戒. 1 有安卓手机就不要用模拟器 由于各种教程都在使用安卓模拟器,导致我一开始学习也在用.但这个实在是很麻烦,我的电脑本来就是渣配置,模拟器开机就要等一年,开机后点个按钮都要等半天.而且经常卡的我的eclipse都不

第一行代码----android篇1.0:活动

   做.NET有4年了,最近由于个人兴趣开始学习Android,网上看了下,郭霖老师的”第一行代码“不错,就以此为教程,写个博客,希望共勉吧!   1:活动是什么及其基本用法    活动是什么,英文名称是“Activity”,专业定义是“一种可以包含用户界面的组件,主要用于和用户进行交互”.在我看来就是.net中的aspx页面,但又不完全是.    如何建立?    如上图所示,点击上图Browse       点击ok,建立活动.活动建立显示的初始页面如下. 到此,建立活动,其实就是一个类,