Bloodline's Blog Notes and thoughts from Bloodline

Ethereum 简介

Comments

什么是以太坊?

以太坊(Ethereum)是一个使用区块链技术来构建去中心化的应用程序(Dapps)的平台。它并不是给用户一系列预先设定好的操作(例如比特币交易),而是允许用户按照自己的意愿创建复杂的操作。这样一来,它就可以作为多种类型去中心化区块链应用的平台,包括加密货币在内但并不仅限于此。

ethereum-01

以太坊和比特币的最重要区别在于,以太坊的区块不仅可以存储交易数据,还可以存储代码,我们称之为智能合约(Smart Contracts)。也就是说,可以对以太坊的区块进行编程(图灵完备)。

比特币区块链纯粹是一个关于交易的列表,而以太坊的基础单元是账户。以太坊区块链跟踪每个账户的状态,所有以太坊区块链上的状态转换都是账户之间价值和信息的转移。账户分为两类:

外部账户(EOA),由私人密码控制合约账户,由它们的合约编码控制,只能由外部账户“激活”。对于大部分用户来说,两者基本的区别在于外部账户是由人类用户掌控——因为他们能够控制私钥,进而控制外部账户。而合约账户则是由内部编码管控。如果他们是被人类用户“控制”的,那也是因为程序设定它们被具有特定地址的外部账户控制,进而被持有私钥控制外部账户的人控制着。“智能合约”这个流行的术语指的是在合约账户中编码——交易被发送给该账户时所运行的程序。用户可以通过在区块链中部署编码来创建新的合约。

只有当外部账户发出指令时,合约账户才会执行相应的操作。所以合约账户不可能自发地执行诸如任意数码生成或应用程序界面调用等操作—只有受外部账户提示时,它才会做这些事。这是因为以太坊要求节点能够与运算结果保持一致,这就要求保证严格确定执行。

和比特币一样,以太坊用户必须向网络支付少量交易费用。这可以使以太坊区块链免受无关紧要或恶意的运算任务干扰,比如分布式拒绝服务(DDoS)攻击或无限循环 。交易的发送者必须在激活的“程序”每一步付款,包括运算和记忆储存。费用通过以太坊自有的有价代币,以太币的形式支付。

交易费用由节点收集,节点使网络生效。这些“矿工”就是以太坊网络中收集、传播、确认和执行交易的节点。矿工们将交易分组——包括许多以太坊区块链中账户“状态”的更新——分成的组被称为“区块”,矿工们会互相竞争,以使他们的区块可以添加到下一个区块链上。矿工们每挖到一个成功的区块就会得到以太币奖励。这就为人们带来了经济激励,促使人们为以太坊网络贡献硬件和电力。

和比特币网络一样,矿工们有解决复杂数学问题的任务以便成功地“挖”到区块。这被称为“工作量证明”。一个运算问题,如果在算法上解决,比验证解决方法需要更多数量级的资源,那么它就是工作证明的极佳选择。为防止比特币网络中已经发生的,专门硬件(例如特定用途集成电路)造成的中心化现象,以太坊选择了难以存储的运算问题。如果问题需要存储器和CPU,事实上理想的硬件是普通的电脑。这就使以太坊的工作量证明具有抗特定用途集成电路性,和比特币这种由专门硬件控制挖矿的区块链相比,能够带来更加去中心化的安全分布。

去中心化

ethereum-02

Dapp

  • 不依赖任何第三方机构

  • 不销售任何第三方机构的服务

  • 不通过任何中心化的媒介来让不同的机构或个人相互打交道

DAO

去中心化的组织

基于以太坊的 Dapp 示例

http://weifund.io/

  • 为利用智能合约的众筹活动提供开放式平台。

  • 它能将贡献转化为合同化的数字化资产,用来在以太坊生态系统中交易或出售。

https://www.augur.net/

  • 一个开源的预言市场平台,它允许任何人预言事件,并且在预言正确时获得奖励

  • 对未来现实世界事件的预言

  • 如果一个人购买了正确预言的份额,他将会获得奖励

https://www.provenance.org/

  • 使用以太坊使不透明的供应链更加透明

  • 该项目通过追溯产品的源头和历史,旨在建立一个开放和可访问的信息框架,使消费者在购买产品时能够做出明智的决定

以太坊架构

ethereum-03

以太坊提供了共识层、经济层和区块服务层。

  • 共识层为所有的应用提供了共识机制

  • 经济层用来为计算和存储的节点提供激励奖励,加密货币就在这一层

  • 区块服务层是智能合约、名称注册等服务运行的地方

  • 交换层为交换价值提供 API。比如说币币交易、服务交换等等

  • 浏览器层。用户通过浏览器层来访问去中心化的应用。已存在的浏览器:Mist、Maelstrom

  • Dapps 层提供了各种去中心化的应用。

ethereum-04

一般情况下,我们将文件存放在 IPFS 中,然后将其哈希指针存放在智能合约中。

概览

ethereum-05

比特币区块中使用梅克尔树保存交易列表。

ethereum-06

如果下载全部数据实在太大,于是有简化付款验证(simplified payment verification)。只通过 80 字节的区块头部来简单验证支付的合法性:

  • 前区块的哈希指针

  • 时间戳

  • 挖矿难度

  • 工作量证明的随机数

  • 区块保存的交易组成梅克尔树的根节点的哈希值

但是这样的局限性在于,只能验证交易的合法性,但是无法获取当前交易的状态(比如数字资产持有,名称注册,金融合同状况等等)。

所以在以太坊的区块头部中不仅包含梅克尔树,而是包含了三种对象所对应的三棵树树:

ethereum-07

  • 交易

  • 收据(一般是用于显示每个交易的影响的数据)

  • 状态

这样客户端便可以这样查寻有效性:

查询这个地址在过去 30 天内发生的所有类型 X 事件(例如众筹合同到达目标)的实例

  • 以太坊虚拟机是运行合约逻辑的处理单元

  • Swarm 是点对点进行文件共享的,与 BitTorrent 相似,但是会通过 ETH 进行激励

  • Whisper 是一种加密的消息传递协议,允许节点以安全的方式直接发送消息给对方,而且发送者和接收者对第三方也是不可见的。

以太坊客户端可以:

  • 连接到以太坊网络

  • 浏览以太坊的区块链

  • 创建新的交易和智能合约

  • 挖掘新的区块

  • 通过运行以太坊虚拟机,客户端便成为去中心化的网络中的一个节点。

ethereum-08

以太坊下载客户端(基于命令行):

可以结合图形化的软件 Mist

智能合约语言

智能合约是代码(它的功能)和数据(它的状态)的集合,存在于以太坊区块链的特定地址。 智能合约账户能够在彼此之间传递信息,进行图灵完备的运算。合约依靠被称作以太坊虚拟机(EVM) 字节代码(以太坊特有的二进制格式)上的区块链运行。

智能合约很典型地用诸如 Solidity 等高级语言写成,然后编译成字节代码上传到区块链上。

智能合约语言

ethereum-09

  • Solidity:类似 Javascript 的语言,当前只能合约最流行的语言。

  • Serpent:类似 Python 的语言,早期以太坊比较流行。

  • LLL(Lisp Like Language):类似于 Lisp,只有最开始的时候用过。

部署智能合约

步骤为:

  • 启动以太坊节点

  • 使用 solc 将 Solidity 的智能合约编译,得到二进制文件

  • 将编译的合约部署到网络(这一步将花费以太币,并且使用你节点上默认设置的钱包地址签署合约),得到合约的区块链地址和 ABI 接口(JSON 格式,并展示出可调用的变量、事件和方法)

  • 使用 web3.js 的 JavaScript API 调用合约中的内容与其进行交互(这一步可能根据调用的类型花费以太币)

ethereum-10

  • Dapp 依然适用 MVC 架构

  • 控制器会与 blockchains 和 DHTs 进行会话(而不是服务器)

  • smart models、thin controllers 和 dumb views(没找到 dump 对应的中文呢)

  • 通过智能合约获取某些元素(比如用户名或财务行为)可能需要服务器

  • 从技术上来看,智能合约算是一种模型,可以通过交易向其提供数据。但是它们并不是 MVC 架构中真实的“模型”。它们可以与现有模型一起工作,但只适用于特殊情况。