以太坊(Ethereum)是一个建立在区块链技术之上的、图灵完备的去中心化应用平台。它允许任何人在平台中通过智能合约技术开发、部署和使用去中心化应用。
有没有感到和 iOS、Android 平台有点类似?
在区块链1.0时代,我们如果需要编写区块链应用需要先从 Github 上 Download 一份比特币源码,然后修改底层代码如网络协议、共识机制、加密算法等等,再发布到网络中。2013、2014年的很多山寨币就是这样产生的,改一改比特币的代码,甚至是调整其中的某些参数就造出了一个新的应用、新的币种。
而以太坊平台,是对底层区块链技术进行了封装,让区块链应用开发者可以直接基于以太坊平台进行开发,开发者只需专注于应用本身,而不用关注底层技术的具体实现,从而大大降低了难度。我们可以简单的理解,以太坊平台提供了很多模块让用户来搭建应用。如果将搭建应用比作造房子,那么以太坊就提供了地基、墙面、屋顶、地板等模块。用户只需像搭积木一样就可以把房子搭起来,而且房子的布局、装饰等等都是可以随意组装的。因此,在以太坊平台上可以快速建立去中心化应用,并且成本也更低。
目前围绕以太坊已经形成了一个较为完善的开发生态圈:社区支持、开发框架、开发工具等等。
以太坊客户端(节点)
一个以太坊客户端就是一个以太坊节点。它提供账户管理、数字资产管理、挖矿、转账、智能合约的部署和执行等等功能。对于我们开发者来说,它就是一个开发者工具。
需要注意的是,在区块链网络中是没有中心服务器的。所有以太坊节点组成了以太坊的整个区块链网络,每个节点都在无时无刻同步区块数据。
在浏览器——服务器架构中,服务器是中心化的,所有的动态数据都保存在服务器端。如果服务器发生故障,则所有的浏览器端都无法正常访问应用。而在区块链的去中心化网络中,所有的节点都会保存相同的数据,任意节点发生故障,都不影响整个区块链数据的写入与读取。
Geth 是典型的以太坊客户端。Geth 这个名字是 Go Ethereum 开源项目的简称。它是基于 Go 语言开发且实现了 Ethereum 协议的客户端软件。
Geth 提供了一个交互式命令控制台,通过命令来操作以太坊的各种功能(API)。
Geth 会一直同步以太坊区块链上的所有数据。目前 fast 同步模式下,数据量已经有近 70G;full 同步模式下,已经达到了几百 G。
在开发过程中,我们推荐使用以太坊区块链的私有链 Ganache (只有几百 M),免去同步以太坊全部区块数据的麻烦。在后续的文章中会介绍 Ganache。
账户
以太坊中账户分为两类:
外部账户(EOA)
该类账户被公钥——私钥对控制(用户),没有关联任何代码。 外部账户的地址由公钥衍生而来。
合约账户(CA)
该类账户为智能合约分配的账户,被合约代码控制且有代码与之关联。 智能合约的部署会把合约字节码发布到区块链上,并使用一个特定的地址来标示这个合约,这个地址就是合约账户。
合约账户存储了代码,外部账户则没有。除了这点之外,这两类账户对于以太坊虚拟机(EVM)来说都是一样的。
外部账户与外部账户之间交易仅仅是转账。但是外部账户到合约账户,是可以激活各种操作的。
智能合约
网络上关于智能合约的解释都很晦涩。我们可以简单的理解为在区块链上,由事件驱动、以代码形式存在、可执行的特殊交易合同。它是代码与数据的集合,是以太坊的核心。
智能合约非常适合对信任、安全和持久性要求较高的应用场景,比如:数字货币、数字资产、投票、保险、金融应用、预测市场、产权所有权管理、物联网、点对点交易等等场景。同时,智能合约在其他行业中的应用场景同样值得期待。
目前除数字货币之外,真正落地的应用还不多,业内各方都在积极探索使用场景和可落地应用。和移动互联网刚兴起之时,各行各业的 App 如雨后春笋般爆发一样,去中心化应用的市场在初期肯定有一个红利期。大家可抓住这波机会。
Solidity
Solidity 是一门和 JavaScript 类似的编程语言,文件扩展名以 .sol 结尾。它用于智能合约的开发,并能编译成以太坊虚拟机(EVM)字节码,部署到以太坊底层区块链网络上。
以太坊虚拟机(EVM)
EVM 即以太坊虚拟机,全称是 Ethereum Virtual Machine。它是以太坊智能合约的运行环境。
EVM 是由以太坊节点提供。每个以太坊节点中都包含 EVM。
Solidity 之于 EVM,就像 Java 跟 JVM 的关系一样。
以太坊虚拟机是一个隔离的环境,在 EVM 内部运行的代码跟外部没有联系。
EVM 运行在以太坊节点上,当我们把合约部署到以太坊区块链网络上之后,合约就可以在以太坊网络中运行了。
合约编译
以太坊虚拟机上运行的是合约的字节码,类似于汇编语言。这就需要我们在部署之前先对合约进行编译,转换成字节码。推荐使用 solc 编译器。
合约部署
合约部署就是将编译好的合约字节码,通过外部账号以发送交易的形式部署到以太坊区块链网络上。由实际矿工出块之后,才会真正部署成功。
合约运行
合约部署后,当需要调用这个智能合约的方法时,只需要向这个合约账户发送消息(交易)即可,通过消息触发后智能合约的代码就会在 EVM 中执行了。
Gas
Gas 即矿工费。以太坊上每笔交易的执行(被矿工打包)都会被收取一定数量的 Gas。Gas的目的是限制执行交易所需的工作量,同时为执行支付费用。当 EVM 执行交易时,Gas 将按照特定规则被逐渐消耗,无论执行到什么位置,一旦 G as 被耗尽,将会触发一个 out of gas 异常。当前调用帧所做的所有状态修改都将被回滚。如果执行结束,还有gas剩余,这些 Gas 将会返还给发送账户。因此,我们需要一个有以太币余额的外部账户,来为发起的交易支付 Gas。
如果没有这个限制,就会出现无法停止(如:死循环)的合约来阻塞以太坊区块链网络。
Gas 可以认为是一个工作量单位,智能合约越复杂(计算步骤的数量、类型、占用的内存等等),所需的 Gas 就越多。Gas 的最小单位是 wei:
1eth= 1018 wei= 109 gwei
GasLimit:愿意支付矿工费的上限。 GasPrice:矿工费单价。
gas = GasLimit * GasPrice
去中心化应用(DApp)
DApp 全称是 Decentralized App。以太坊社区把基于智能合约的应用称为去中心化的应用。如果我们把区块链理解为一个不可篡改的分布式账本数据库,智能合约理解为和数据库打交道的程序,那就很容易理解 DApp 了。一个 DApp 不单单有智能合约,还需要有一个友好的用户界面和其他的业务程序。
Truffle
Truffle 是目前最流行的 DApp 开发框架,它可以帮我们处理掉很多繁琐的事情,让我们更专注于智能合约的开发,迅速开始编码 -> 编译 -> 部署 -> 测试 -> 打包 DApp 的流程。
总结
最后我们来简单总结一下。以太坊是平台,它让我们方便的使用区块链技术开发去中心化的应用。应用中,我们可以使用 Solidity 来编写和区块链交互的智能合约,合约编写好之后,我们通过一个有余额的外部账户将合约部署到以太坊节点上,并运行合约(使用 Truffle 框架可以更好的帮助我们做这些事情)。
本篇中以太坊的这些概念,初次接触者对它们有一个基本的了解即可,没有必要把每一个概念都掌握的很细致、准确。学习是一个循序渐进、逐步深入的过程,很多时候,我们会发现过了一段时间后,对于同一个概念,会有不一样的理解与认知。