很多同学都渴望加入区块链开发团队,却又感觉不知道从何下手。本文将基于以太坊平台,通俗易懂的讲解以太坊开发所涉及的各种晦涩概念,帮助大家轻松入门。
写在前面
在阅读本文之前,你应该对区块链有一个大概的了解,如果还不知道,请订阅专栏:区块链技术
指导你从零开始学习区块链技术。
什么是以太坊
以太坊()是一个基于区块链技术构建的去中心化应用平台,允许任何人在该平台上构建和使用运行在区块链技术上的去中心化应用程序。
对于这句话不太理解的朋友,你可以把它想象成区块链里的以太坊,它是一个开发平台,让我们可以像在云端一样基于区块链技术编写应用程序。
在以太坊之前,编写区块链应用是这样的:复制一份比特币代码,然后修改加密算法、共识机制、网络协议等底层代码(很多山寨币都是这样,修改几次就出来一个新币了)。
以太坊平台封装了区块链底层技术,让区块链应用开发者可以直接基于以太坊平台进行开发,开发者只需要专注于应用本身的开发,大大降低了开发难度。
目前围绕以太坊已经形成了比较完善的开发生态:有社区支持,有众多开发框架和工具可供选择。
智能合约 什么是智能合约
以太坊上的程序称为智能合约,它是代码和数据(状态)的集合。
智能合约可以理解为区块链上用代码编写的、可以自动执行(消息驱动)的合约(特殊交易)。
智能合约英文名为“Smart”,和人工智能(AI)的智能没有任何关系。1995年,Nick Szabo首次提出了智能合约的概念,它的概念很简单,就是把法律条款写成可执行的代码。那时候还没有区块链,但智能合约是区块链最好的搭配。我们知道合约必须是一式两份、三份或四份,不能被一方控制,这就是去中心化。
在比特币脚本中我们提到比特币交易是可编程的,但是比特币脚本有很多限制,可以编写的程序也是有限的。
以太坊则更加完备(用计算机科学术语来说,叫做“图灵完备”),让我们可以编写出几乎可以做任何事情的程序(智能合约),就像使用任何高级语言一样。
智能合约非常适合对信任度、安全性、耐久性有较高要求的应用场景,比如:数字货币、数字资产、投票、保险、金融应用、预测市场、财产所有权管理、物联网、点对点交易等。
目前除了数字货币以外,真正实用的应用还不是很多(就像刚出来的时候移动平台一样),我相信1到3年后,各种杀手级应用会逐渐出现。
编程语言:
智能合约官方推荐的编程语言是,文件扩展名以.sol结尾。
该语言与以太坊非常相似,用于开发合约并将其编译为以太坊虚拟机字节码。
还有Viper、LLL等,建议大家使用。
更新:它不再被官方推荐,建议用户切换到类似的语言Viper。
- 是一个浏览器IDE,你可以点进去看看。以后我们会在更多文章中介绍这种语言。
运行环境:EVM
EVM()以太坊虚拟机是以太坊智能合约的运行环境。
它和EVM的关系和它和JVM的关系是一样的,这点大家很容易理解。
以太坊虚拟机是一个隔离的环境,EVM内部运行的代码无法从外部访问。
EVM运行在以太坊节点上,我们把合约部署到以太坊网络之后,合约就可以在以太坊网络上运行了。
编写合约
以太坊虚拟机运行的是字节码形式的合约,所以我们需要在部署之前对合约进行编译。您可以选择-Web IDE 或 solc 编译器。
合约部署
在以太坊上开发应用的时候,经常需要使用以太坊客户端(钱包),平时我们在开发过程中并不会接触到客户端或者钱包的概念,那它到底是什么呢?
以太坊客户端(钱包)
以太坊客户端其实可以理解为一个开发者工具,提供账户管理、挖矿、转账、部署和执行智能合约等功能。
EVM 由以太坊客户端提供
Geth 是以太坊开发中常用的客户端,基于 Go 语言开发。Geth 提供了一个交互式的命令控制台,包含了各种以太坊功能(API)。我们后面会专门写一篇文章来介绍 Geth 的使用,这里先大概了解一下。
Geth控制台与浏览器开发者工具中的控制台类似,但是Geth控制台运行在终端中。
与Geth相比,Mist是一个具有图形操作界面的以太坊客户端。
如何部署
智能合约的部署,是指将合约字节码发布到区块链上,并使用特定的地址来标识这个合约,这个地址被称为合约账户。
以太坊中有两种类型的账户:
与比特币的UTXO设计不同,以太坊使用更简单的账户概念。
这两种类型的账户对于 EVM 来说都是相同的。
外部账户与合约账户的区别和联系在于:一个外部账户可以通过用自己的私钥创建并签署交易,向另一个外部账户或者合约账户发送消息。
两个外部账户之间发送消息是价值转移的过程。但从外部账户到合约账户的消息会激活合约账户的代码,使其能够执行各种操作(例如转移代币、写入内部存储、挖掘新代币、执行一些计算、创建新合约等)。
只有当外部账户发出指令时,合约账户才会执行相应的操作。
合约部署就是将编译好的合约字节码通过外部账户发送交易部署到以太坊区块链上(实际矿工产出区块后才算真正部署成功)。
跑步
合约部署完成后,当需要调用本智能合约的方法时,只需要向合约账户发送一条消息(交易),消息触发后,智能合约的代码就会在EVM中执行。
气体
与云计算类似,占用区块链资源(无论是简单的转账交易,还是合约的部署和执行)也需要支付相应的费用(天下没有免费的午餐,对吧!)。
以太坊采用 Gas 机制进行计费,Gas 也可以看作是一个工作单位,智能合约越复杂(计算步骤数量和类型、占用内存等),完成操作所需的 Gas 就越多。
运行任何特定合约所需的 Gas 数量是固定的,并由合约的复杂性决定。
Gas价格是由运行合约的人在提交运行合约的请求时设定的,用来确定他愿意为这笔交易支付的费用:Gas价格(以Ether计价)*Gas数量。
Gas 的目的是在支付执行费用的同时限制执行一笔交易所需的工作量。当 EVM 执行一笔交易时,Gas 会按照特定的规则逐渐被消耗,无论执行到哪里,一旦 Gas 耗尽就会引发异常,当前调用框架所做的所有状态修改都会被回滚,如果执行完成后仍有 Gas 剩余,则 Gas 会返回到发送账户。
如果没有这个限制,有人会编写一个无法停止的合约(例如无限循环)并堵塞网络。
所以实际上(衔接前面的内容),我们需要一个有以太币余额的外部账户来发起交易(正常交易或者部署运行合约),在操作过程中,矿工会收取相应的工作量费用。
以太坊网络
有些心急的同学可能会问,没有以太坊,如何开发智能合约?可以选择以下方法:
选择以太坊官网测试网络
在测试网络中,我们可以轻松获得免费的以太币,但缺点是初始化节点需要很长时间。
使用私有链
创建自己的私有以太坊测试网络,也就是通常所说的私链,我们可以用它作为测试环境来开发、调试和测试智能合约。
通过上面提到的Geth,可以很轻松的创建一个属于自己的测试网络,可以任意挖掘以太坊,而不需要同步官方网络的整个区块链数据。
使用开发者网络(模式)
相比于私链,在开发者网络(模式)中,会自动分配一个余额较大的开发者账户供我们使用。
使用模拟环境
另外一种创建测试网络的方式是使用本地内存模拟以太坊环境,这种方式开发调试起来更加方便快捷,还可以在启动时帮我们创建10个有资金的测试账户。
当开发完合约之后,通过测试之后就可以部署到Geth节点上。
更新:它现在已经合并到开发框架中,现在称为 CLI。
Dapp:去中心化应用程序
以太坊社区把基于智能合约构建的应用程序称为去中心化应用程序(Apps)。如果我们把区块链理解为一个不可变的数据库,把智能合约理解为与数据库交互的程序,那么Dapp就很容易理解了。Dapp不仅有智能合约,还需要一个友好的用户界面等东西。
它是一个Dapp开发框架,可以帮助我们处理很多无关紧要的小事,让我们能够快速的开始编写代码-编译-部署-测试-打包DApp的流程。
总结
现在我们来总结一下,以太坊是一个可以让我们方便地使用区块链技术开发去中心化应用的平台,在这个应用中我们用它来编写与区块链交互的智能合约。合约写好之后,我们需要使用有余额的账户的以太坊客户端来部署和运行合约(使用框架可以更好地帮助我们做这些事情)。为了开发方便,我们可以使用 Geth 或者搭建一个测试网络。
注:为了方便大家理解,本文中做了一些类比,有些类比并不严格准确,不过我也认为对于初学者来说,没必要把每一个概念都掌握得详细准确,学习是一个循序渐进深入的过程,很多时候我们会发现,一段时间之后,我们对同一个事物的理解会有所不同。
读完这篇文章,你是否理解了这些概念?现在你可以开始开发了。先看看智能合约开发环境和Hello World合约。
我们还为区块链技术爱好者提供了系统的区块链视频教程,觉得光靠文章学习不够的同学可以点击入门视频教程和以太坊智能合约开发。