区块链开发(三)编写调试第一个以太坊智能合约
李赫 2016年9月10日
一、 智能合约IDE简介
目前以太坊上支持三种语言编写智能合约,
Solidity:类似JavaScript,这是以太坊官方推荐语言,也是最流行的智能合约语言。具体用法参加Solidity文档,地址:https://solidity.readthedocs.io/en/latest/
Serpent:类似Python风格,文档地址:https://github.com/ethereum/wiki/wiki/Serpent
LLL:类似Lisp风格,目前已经被终止了。
可以根据不同的习惯选择不同的高级语言,目前最流行的是Solidity。本文所有的智能合约均为Solidity语言编写。
目前能够编写智能合约的IDE有常见几种:
Mix:是早期以太坊主要的开发IDE,可以支持智能合约和DAPP的编写、调试,部署,全图形化界面,但是随着原创主持人Gavin Wood的离开,慢慢边缘化,最终被停止开发,整个团队转向Remix项目,出于对未来的考虑,不建议学习Mix。
Remix:是原Mix团队的新作品,目前只有简单的Debug功能上线,未来可以重点关注一下。
browser-solidity:该项目是智能合约浏览器版本的开发环境,可以支持在浏览器中直接开发、调试和编译,对于初学者来说,可以快速上手,不需要安装,非常方便,直接访问地址使用:https://ethereum.github.io/browser-solidity/,本文采用此IDE进行开发。
Ethereum Studio:第三方公司开发的企业版智能合约在线IDE,功能强大,免费使用,可以作为企业级开发的一个工具,访问地址:https://live.ether.camp/
Visual Studio 2015:没错,就是微软的VS 2015,微软已经把以太坊的智能合约编写功能整合了,可以看出微软对以太坊的重视。
二、 编写第一个智能合约
1、 智能合约语法学习方法
智能合约的语法和示例可以在Solidity的文档网站http://solidity.readthedocs.io/en/latest/查看,基本上把这些在线文档看完,已经算精通了,剩下的只是实践编写代码。
2、 示例合约代码
首先,我们先给出一个示例代码,后面将以这个代码为例解释说明智能合约的编写和调试。
-------------------------------------------------------------------------------------------
contract Votelihe {
struct Candidate {
uint votecount;
string name;
}
struct Voter {
bool voted;
}
mapping(address => Voter) public voters;
Candidate[] public candidates;
function Votelihe() {
candidates.push(Candidate({
name: "lihe",
votecount: 0
}));
candidates.push(Candidate({
name: "dandan",
votecount: 0
}));
}
function Vote_candidate(uint8 numCandidate)
{
if(voters[msg.sender].voted ||numCandidate>candidates.length)return;
candidates[numCandidate].votecount+=1;
voters[msg.sender].voted=true;
}
function Getcount() returns(string,uint,string,uint){
return(candidates[0].name,candidates[0].votecount,candidates[1].name,candidates[1].votecount);
}
}
--------------------------------------------------------------------------------------------------
该代码创建了一个投票程序,对两个候选人lihe和dandan进行投票,每个人只有一次投票的机会,最后反馈lihe和dandan的得票结果。各个函数说明如下:
function Votelihe():构造函数,智能合约只运行一次
function Vote_candidate():对候选人进行投票,每个投票者只能投一票
function Getcount():返回当前候选的得票数
3、 使用IDE编写智能合约
首先我们打开browser-solidity,IDE的主要功能如下:
将示例代码拷贝到左侧的代码编辑框,IDE将自动检测语法错误,并显示在右侧的窗口上,如下图所示:
可以看到,提示有未声明的对象,是在14行的错误,很明显是我一个结构对象candidates误写为candidates2了,修改一下即可校验通过。
注意,在浏览器里编写代码,他是自动保存在本地浏览器缓存里面的,只要清除浏览器缓存,代码不会丢失。
三、调试第一个智能合约
目前browser-solidity有两种常用的调试方式,一个是采用本地虚拟机调试模式,一个是连接到本地的私有链进行调试。
1、 本地虚拟机调试模式
本地虚拟机调试,就是不连接任何一个节点,在内存虚拟出一个以太坊节点进行调试,优点是速度快,配置简单,缺点是因为只是虚拟调试,可能最后放到真正的区块链节点上运行智能合约会和预想的结果不同。
首先在DEBUG环境设置中,选择JavaScript VM以设置本地虚拟调试模式,如下图:
设置成功后,可以在账号状态栏看到可以用的账户列表,如下图
智能合约代码编写好后,点击“Create”按钮部署智能合约到内存中,并进行调试,如果部署成功,会出现智能合约的函数运行按钮和参数输入框,然后就可以调试你的智能合约了,如下图:
运行函数后,会出现相应的交易数据,可以完成整个智能合约调试。
如果想逐步调试智能合约,那么选择小虫子图标,切换到逐步调试界面,即可实现单步运行智能合约,注意这里的单步运行不是指代码而是指智能合约编译后的OPCODE,如下图。
2、 连接到本地私有链调试
连接到本地私有链调试,就是通过RPC接口,连接本地的以太坊节点,实际部署并调试智能合约,缺点是速度较慢,配置复杂,优点是能够真实运行智能合约,最大程度的防止出错,关于私有链的配置,请参考我原先发表的文章《区块链开发(一)搭建基于以太坊的私有链环境》。
首先在DEBUG环境设置中,选择Web3 Provider以设置本地虚拟调试模式,同时默认会给出一个连接地址为http://localhost:8545,如果你配置的私有链RPC端口修改了,记得要改成对应的端口,如下图:
然后,切换到账号状态栏,此时显示的可用账号,应该都是你部署的私有链里面的账号,如果不是,说明没有成功连接私有链。可能的原因有两个,一是私有链提供的端口是用http访问,而browser-solidity的网页访问地址是https,解决的方法就是将browser-solidity访问地址改为http协议的地址即可http://ethereum.github.io/browser-solidity/;二是系统的时间没有和网络同步,使用windows系统自带的时间同步功能同步一下即可。三是如果连接到本地私有链调试时出现Error: account is locked的错误,是因为geth需要解锁本地的以太坊帐号,在geth的控制台输入personal.unlockAccount('账号地址')即可。
四、 其他常见智能合约资源
下面一些例子网站去参考一些成熟的代码,方便快速迭代学习,常见的例子网站如下:
https://github.com/ethereum/wiki/wiki/Solidity-Collections
http://ether.fund/contracts/
https://github.com/chriseth/solidity-examples
https://github.com/ethereum/dapp-bin
https://github.com/fivedogit/solidity-baby-steps
http://dapps.ethercasts.com
http://ether.fund/contracts
开发框架常用的有3个:
Truffle:说明书地址http://truffle.readthedocs.io/en/latest/
以太坊目前很流行的开发框架Truffle的说明书,这个框架比较流行。
Dapple:说明书地址http://dapple.readthedocs.io/en/master/
这个开发框架是在gitter chart上看到的,感觉用的人不多,先观察
Meteor:说明书地址https://github.com/ethereum/wiki/wiki/Dapp-using-Meteor
这个开发框架是以太坊官方推荐的,写进了以太坊的官方wiki,值得学习,当然,以太坊官方经常转换方向,以后换别的也没准
区块链开发(三)编写调试第一个以太坊智能合约相关推荐
- 区块链开发(二)部署和运行第一个以太坊智能合约
区块链开发(二)部署并运行第一个以太坊智能合约 李赫2016年8月22日 本文首发8BTC 网络上不少部署智能合约的文章,但是都有一个共同的特点,就是采用命令行的方式来部署,先是建立SOLC的编译环境 ...
- 区块链技术进阶-深入详解以太坊智能合约语言 solidity(含源码)-熊丽兵-专题视频课程...
区块链技术进阶-深入详解以太坊智能合约语言 solidity(含源码)-103人已学习 课程介绍 区块链开发技术进阶-深入详解以太坊智能合约语言 solidity视频培训教程:本课程是 ...
- 一起学:以太坊智能合约开发
课程介绍 无论在科技圈还是金融圈,"区块链"俨然成了最热的词汇.2016年,区块链写入了国家的十三五规划中:2017年,央行基于区块链技术的数字票据交易平台测试成功:同年,工信部发 ...
- 区块链兼容以太坊智能合约
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 引言 随着区块链技术以及应用的普及,越来越多的区块链出现在大众视野中.由于区块链技术的开源特性,任何公司和个人都可以方便 ...
- 去中心化 去区块链_使用JavaScript和坚固性在以太坊区块链上构建去中心化应用程序dapp...
去中心化 去区块链 In this blog, I build a decentralized application, also known as a "dapp". While ...
- 以太坊智能合约开发 | 一个资深技术专家的心路历程
原创: 杨镇 一块链习社区 微信号yikuailianxishequ 本文作者杨镇, 以太坊黄皮书中译者,资深以太坊专家.曾独立中译了以太坊 Homestead 官方文档,Solidity 官方文档中 ...
- 用Visual Studio开发以太坊智能合约
2019独角兽企业重金招聘Python工程师标准>>> 区块链和以太坊 自从我熟悉区块链.以太坊和智能合约以来,一直失眠. 我一直在阅读,阅读和阅读,最后我能够使用一些工具,他们建议 ...
- 区块链开发入门:基于以太坊智能合约构建 ICO DApp
写给前端开发者的第一本区块链开发入门指南,通过从 0 到 1 实战开发一个 ICO DApp 项目(基于 V 神的 DAICO 设计思想),深入掌握区块链及以太坊技术. 为什么要选择区块链开发? 未来 ...
- 区块链项目实战 - 使用以太坊/智能合约solidity,全栈开发区块链借贷记账小应用,含完整源码
本文使用区块链平台以太坊+智能合约实现一个区块链记账的功能,具体为: 借款人和贷款人以及数额被记录在区块链中.使用区块链地址来表示借款人或者贷款人. 若一个借款人多次向一个贷款人借钱,更新所有的数额之 ...
最新文章
- python椭圆面积_利用matplotlib实现2个椭圆的重叠区域
- L2级自动驾驶量产趋势解读
- 漫谈中国自主杀毒引擎
- 安装nvidia-docker2
- Aristochart – 灵活的 HTML5 Canvas 折线图
- getopt java_Java命令行界面(第28部分):getopt4j
- android intent 5.1
- (46)VHDL实现4位桶性形移位器
- 睿停车系统车场服务器,睿停车后台管理中心系统-用户手册-前台版本
- mysql 数据库dbhelp_策略模式实现支持多种类数据库的DBHelp
- python3种基本数字类型_Python3基本数据类型
- 音视频聊天开发: 1 视频采集
- 【逗老师带你学IT】Yeastar PSTN网关对接FreePBX网关的各种坑-国内VOIP发展感叹
- TP5和TP3.2区别
- 零信任之从IAM概述到应用实现
- python两点画线_在图像python matplotlib的两点之间画一条线
- html 实现在线选房,线上开盘选房技巧有哪些
- 实木地板被机器人弄成坑_木地板砸出小坑怎么办
- python简单加密算法_如何制作一个简单的加密/解密程序?
- LiFi在医疗领域的应用
热门文章
- Python-Excel报表自动化生成报表(一)
- 1426:【例题5】智力大冲浪
- ROS :process has died
- clusterProfiler进行GSEA富集分析
- 【LaTex】宏包pageno的使用方法,命令\pageno的用法
- tplink控制上网设备_TPlink路由器如何设置无线终端设备使用电脑来无线连接路由器...
- 在word中或者Visio中字母上加一个横线 或者x拔
- csv文件一键转txt文件,并封装成可执行.exe文件
- [转]清华差生10年奋斗经历
- java集成环信SDK用户注册