区块链快速入门(八)——以太坊
一、以太坊简介
以太坊(Ethereum)项目的最初目标是打造一个运行智能合约的平台(Platform for Smart Contract),支持图灵完备的应用,按照智能合约的约定逻辑自动执行,理想情况下将不存在故障停机、审查、欺诈以及第三方干预等问题。
以太坊平台目前支持Golang、C++、Python等多种语言实现的客户端。由于核心实现上基于比特币网络的核心思想进行了拓展,因此在很多设计特性上都与比特币网络十分类似。
基于以太坊项目,以太坊团队目前运营了一条公开的区块链平台——以太坊网络。智能合约开发者使用官方提供的工具和以太坊专用应用开发语言Solidity,可以很容易开发出运行在以太坊网络上的去中心化应用(Decentralized Application,DAPP)。DAPP应用将运行在以太坊的虚拟机(Ethereum Virtual Machine,EVM)里。用户通过以太币(Ether)来购买燃料
(Gas),维持所部署应用的运行。
以太坊项目官网:www.ethereum.org
以太坊项目代码托管:www.github.com/ethereum
以太坊区块链底层也是一个P2P网络平台,智能合约运行在网络中的以太
坊虚拟机里。网络自身是公开可接入的,任何人都可以接入并参与网络中数据的维护,提供运行以太坊虚拟机的资源。
以太坊区块链的技术特点主要包括:
A、支持图灵完备的智能合约,设计了编程语言Solidity和虚拟机EVM
B、选用内存需求较高的哈希函数,避免出现强算力矿机、矿池***
C、叔块(Uncle Block)激励机制,降低矿池的优势,并减少区块产生间隔
D、采用账户系统和世界状态,而不是UTXO,容易支持更复杂的逻辑
E、通过Gas限制代码执行指令数,避免循环执行***
F、支持POW共识算法,并计划支持效率更高的POS算法
此外,开发团队还计划通过分片(Sharding)方式来解决网络可扩展性问题。
二、以太坊核心概念
1、智能合约
智能合约(Smart Contract)是以太坊中最为重要的一个概念,即以计算机程序的方式来缔结和运行各种合约。以太坊支持通过图灵完备的高级语言(包括Solidity、Serpent、Viper)等来开发智能合约。
智能合约作为运行在以太坊虚拟机(Ethereum Virual Machine,EVM)中的应用,可以接受来自外部的交易请求和事件,通过触发运行提前编写好的代码逻辑,进一步生成新的交易和事件,可以进一步调用其它智能合约。
智能合约的执行结果可能对以太坊网络上的账本状态进行更新。对账本状态的修改由于经过了以太坊网络中的共识,一旦确认后无法被伪造和篡改。
2、账户
以太坊直接用账户来记录系统状态。每个账户存储余额信息、智能合约代码和内部数据存储等。以太坊支持在不同的账户之间转移数据,以实现更为复杂的逻辑。
以太坊账户分为两种类型:合约账户(Contracts Accounts)和外部账户(Externally Owned Accounts,EOA)。
合约账户:存储执行的智能合约代码,只能被外部账户来调用激活。
外部账户:以太币拥有者账户,对应到某公钥。账户包括nonce、balance、
storageRoot、codeHash等字段,由个人来控制。
当合约账户被调用时,存储其中的智能合约会在矿工处的虚拟机中自动执行,并消耗一定的燃料。燃料通过外部账户中的以太币进行购买。
3、交易
交易(Transaction),在以太坊中是指从一个账户到另一个账户的消息数据。消息数据可以是以太币或者合约执行参数。
以太坊采用交易作为执行操作的最小单位。每个交易包括如下字段:
To:目标账户地址。
Value:可以指定转移的以太币数量。
Nonce:交易相关的字串,用于防止交易被重放。
gasPrice:执行交易需要消耗的Gas价格。
Startgas:交易消耗的最大Gas值。
Signature:签名信息。
在发送交易时,用户需要缴纳一定的交易费用,通过以太币方式进行支付
和消耗。目前,以太坊网络可以支持超过比特币网络的交易速率(可以达到每秒几十笔)。
4、以太币
以太币(Ether)是以太坊网络中的货币。
以太币主要用于购买燃料,支付给矿工,以维护以太坊网络运行智能合约的费用。以太币最小单位是wei,一个以太币等于 10^18个wei。
以太币可以通过挖矿来生成,成功生成新区块的以太坊矿工可以获得5个以太币的奖励以及包含在区块内交易的燃料费用。用户也可以通过交易市场来直接购买以太币。
目前每年大约可以通过挖矿生成超过一千万个以太币,单个以太币的市场价格目前超过200美金。
5、燃料
燃料(Gas),控制某次交易执行指令的上限。每执行一条合约指令会消耗固定的燃料。当某个交易还未执行结束,而燃料消耗完时,合约执行终止并回滚状态。
Gas可以跟以太币进行兑换。以太币的价格是波动的,但运行某段智能合约
的燃料费用可以是固定的,通过设定Gas价格等进行调节。
三、以太坊主要设计
1、智能合约
以太坊采用以太坊虚拟机(EVM)作为智能合约的运行环境。以太坊虚拟机是一个隔离的轻量级虚拟机环境,运行在其中的智能合约代码无法访问本地网络、文件系统或其它进程。
对同一个智能合约来说,通常需要在多个以太坊虚拟机中同时运行多份,以确保整个区块链数据的一致性和高度的容错性,但也限制了整个网络的容量。
以太坊为编写智能合约设计了图灵完备的高级编程语言,降低了智能合约开发的难度。目前Solidity是最常用的以太坊合约编写语言之一。智能合约编写完毕后,用编译器编译为以太坊虚拟机专用的二进制格式(EVM bytecode),由客户端上传到区块链当中,在矿工的以太坊虚拟机中执行。
2、交易模型
以太坊采用了账户的模型,状态可以实时的保存到账户里,而无需像比特币的UXTO模型去回溯整个交易历史。
3、共识
以太坊目前采用基于成熟的POW共识的变种算法Ethash协议作为共识机制。
为了防止ASIC矿机矿池的算力***,跟原始POW 的计算密集型Hash 运算不同,Ethash 在执行时候需要消耗大量内存,反而跟计算效率关系不大。因此,很难制造出专门针对Ethash的芯片,反而通用机器可能更加有效。
虽然,Ethash相对原始的POW进行了改进,但仍然需要进行大量无效的运算,以太坊网络社区已经有计划在未来采用更高效的Proof-of-Stake(POS)作为共识机制。
4、降低***
以太坊网络中的交易更加多样化,也就更容易受到***。
以太坊网络在降低***方面的核心设计思想仍然是通过经济激励机制防止少数人作恶:
A、所有交易都要提供交易费用,避免DDoS***
B、程序运行指令数通过Gas来限制,所消耗的费用超过设定上限时就会被取消,避免出现恶意合约。
确保***者试图消耗网络中虚拟机的计算资源时,需要付出经济代价(支付大量的以太币);同时难以通过构造恶意的循环或不稳定合约代码来对网络造成破坏。
5、提高扩展性
可扩展性是以太坊网络承接更多业务量的最大制约。
以太坊项目未来希望通过分片(sharding)机制来提高整个网络的扩展性。分片是一组维护和执行同一批智能合约的节点组成的子网络,是整个网络的子集。
支持分片功能前,以太坊整个网络中的每个节点都需要处理所有的智能合约,造成了网络的最大处理能力会受限于单个节点的处理能力。分片后,同一片内的合约处理是同步的,彼此达成共识,不同分片之间则可以是异步的,可以提高网络整体的可扩展性。
四、以太坊相关工具
1、客户端与开发库
以太坊客户端可用于接入以太坊网络,进行账户管理、交易、挖矿、智能合约等各方面操作。
以太坊社区现在提供了多种语言实现的客户端和开发库,支持标准的JSON-RPC协议。用户可根据自己熟悉的开发语言进行选择。
go-ethereum:Go语言实现
parity:Rust语言实现
cpp-ethereum:C++语言实现
ethereumjs-lib:javascript语言实现
ethereum(J):Java语言实现
ethereumH:Haskell语言实现
pyethapp:Python语言实现
ruby-ethereum:Ruby语言实现
go-ethereum的独立客户端Geth是最常用的以太坊客户端之一。用户可通过安装Geth来接入以太坊网络并成为一个完整节点。Geth也可作为一个HTTP-RPC服务器,对外暴露JSON-RPC接口,供用户与以太坊网络交互。
Geth的使用需要基本的命令行基础,其功能相对完整,源码托管于github.com/ethereum/go-ethereum
2、以太坊钱包
对于只需进行账户管理、以太坊转账、DAPP使用等基本操作的用户,则可选择直观易用的钱包客户端。
Mist是官方提供的一套包含图形界面的钱包客户端,除了可用于进行交易,也支持直接编写和部署智能合约。
所编写的代码编译发布后,可以部署到区块链上。使用者可通过发送调用相应合约方法的交易,来执行智能合约。
3、以太坊开发IDE
对于开发者,以太坊社区涌现出许多服务于编写智能合约和DAPP的IDE,例如:
Truffle:一个功能丰富的以太坊应用开发环境
Embark:一个DAPP开发框架,支持集成以太坊、IPFS等
Remix:一个用于编写Solidity的IDE,内置调试器和测试环境
原文地址:http://blog.51cto.com/9291927/2306726