第2章 以太坊的工作原理

[TOC]

  • 以太坊用户账户
  • 智能合约及其工作原理
  • 以太坊虚拟机(EVM)
  • 在工作量证明共识协议中挖矿如何进行
  • 学习如何使用geth命令
  • 建立以太坊钱包和浏览器钱包(Mist)
  • Whisper和Swarm概览
  • 以太坊的未来

2.1 以太坊概览

Ethereum是一个去中心化的平台,可以在其上部署DApp。DApp是用一个或者更多个智能合约创建的,使用solidity编程语言编写智能合约。
Ethereum中有一种内部货币叫做以太币(Ether),部署智能合约或者调用其方法需要用到以太币。

智能合约可以通过发送交易调用或者通过其他合约调用。Ethereum中有两种网络节点:普通节点和矿工。
普通节点只备份区块链上的数据,而矿工通过挖矿创建区块链。

2.2 以太坊账户

要创建以太坊账户,只需要一个非对称加密秘钥对生成。以太坊使用椭圆曲线加密算法。

每个账户用地址表示。有了秘钥之后,就需要生成地址。从公钥生成地址的过程如下:

  • 1.生成公钥的keccak-256哈希。它将给出一个256位的数字。
  • 2.丢弃前面的96位,即12字节。现在得到160位的二进制数据,即20字节。
  • 3.把地址编译成16进制的字符串。最后将得到一个40字符的字节串,这就是账户地址。

2.3 交易

交易是一个签名数据包,用户从一个账户向另一个账户或者向一个合约转以太币、调用合约方法或者部署一个新合约。

交易包含信息接收者、是被发起人及其意愿的签名、要转账的以太币数量、交易执行允许进行的计算资源最大值(叫做gas上限)以及交易发起人愿意为单位计算资源支付的费用(叫作gas价格)。

交易需要用私钥签署交易。

2.4 共识

POW -> POS

2.5 时间戳

计算区块目标值的公式需要用到当前时间戳,且每个区块头附加了当前时间戳。

2.6 随机数

随机数是一个64位未签名证书。随机数是一个问题的解决办法,矿工不断地尝试随机数,直到发现目标值。

2.7 区块时间

以太坊使用ghost协议解决无效块带来的安全问题。以太坊使用这个真实ghost协议的一个修正版本。ghost协议仅仅把无效块添加到母链上,掩盖了安全问题,郑佳乐区块链的整体难度值,因为区块链的整体难度值还包括无效块的难度值之和。

在以太坊中 无效块称为“uncle block”

2.8 分叉

在节点验证区块链发生冲突时,会发生分叉(forking),也就是说,在网络中有多于一个区块链,且每个区块链由一些矿工验证。

分叉共有三种:普通分叉、软分叉和硬分叉。
普通分叉是由于两个或者多个矿工几乎同时发现了一个区块链引起的暂时冲突,如果一个难度值高于另一个,冲突就解决了。

更改源代码可能引起冲突。根据冲突类型,可能要求有50%以上的算力的矿工升级,也可能要求所有矿工升级,以解决冲突。
要求有50%以上算力的矿工升级已解决冲突,叫做软分叉。
要求所有矿工升级以解决冲突,叫做硬分叉。

2.9 创世区块

创世区块(genesis block)是区块链中的第一个区块,其区块序号是0。

2.10 以太币面值

  • 1eth /wei
  • 1eth /Kwei
  • 1eth /Mwei
  • 1eth /Gwei
  • 1eth /Szabo
  • 1eth /Finney
  • 1eth /Kether
  • 1eth /Mether
  • 1eth /Gether
  • 1eht /Tether

2.11 以太坊虚拟机

Ethereum Virtual Machine 是以太坊智能合约字节码(byte-code)的执行环境。网络中的每个节点都运行EVM。所有节点执行使用EVM指向智能合约的全部交易,因此他们进行同样的计算,并存储同样的数值。

有两种EVM的实现,字节码VM和JIT-VM。JIT-VM比字节码VM更高效。

2.12 gas

gas是计算资源的计量单位。每一个交易都需要包含gas上限和为每个gas支付费用的单价(即每次计算的价格)。

矿工决定gas价格。如果交易gas价格低于矿工决定的gas价格,矿工将拒绝挖矿交易。gas价格以wei为单位。

EVM的每个操作都分配了一个数字,用以表示它可以消耗的gas。

2.13 发现对等节点

节点是网络的一部分,它需要连接到网络中的一些其他节点,这样它可以广播交易/区块。

节点如何发现网络中的其他节点?
节点之间是如何交换信息的呢?

以太坊有自己的节点发现协议可用于解决这个问题,该协议以Kadelima协议为基础。在节点发现协议中有一种特殊的节点,叫作Bootstrap节点。Bootstrap节点保存了一段时间内与他们连接的所有节点的列表,但本身不保存区块链。在对等节点连接到以太坊网络时,他们首先连接打Bootstrap节点,Bootstrap节点分享在刚才实现定义的时间里连接到它们的对等节点列表。然后对等节点在与对等节点连接并同步。

bootnode是以太坊Bootstrap节点最热门的实现。

2.14 Whisper 和 Swarm

Whisper是一个去中心化的通信协议,
Swarm则是一个去中心化的文件系统。

Whisper允许网络中的节点彼此通信。它支持广播、用户到用户、加密信息等,但不用于传输大数据。

Swarm类似于Filecoin,二者最大的区别是技术细节和激励机制。
Filecoin不惩罚存储;而Swarm惩罚存储。
Swarm没有内部货币,而是用以太币进行激励。智能合约不能与Swarm通信,但是Swarm能与智能合约通信。所以用户基本上通过智能合约向存储付款,该支付在失效后被释放给存储。

2.15 geth

geth(go-ethereum)是以太坊、Whisper和Swarm的一个实现。 geth可以成为全部实现或者一些选定实现的一部分。

geth是一种CLI应用,它用go语言编写,在主要的操作系统中都可使用。geth的当前版本还不支持Swarm,但支持Whisper的一些功能。

2.15.1 安装geth

  • 1.OS X
    推荐在OS X中使用brew安装geth,在终端运行下面两个命令安装geth:

      brew tap ethereum/ethereum
      brew install ethereum
      
    
  • 2.Ubuntu

  • 3.Windows

2.15.2 JSON-RPC和JavaScript操作台

JSONRPC提供的API分成:
admin、debug、eth、miner、net、personal、shh、txpool和web3等类型。

geth还提供一个交互JavaScript操作台,可以使用JavascriptAPI进行程序交互。

2.15.3 子命令和选项

  • 1.连接至主网网络
    以太坊网络中的节点默认使用30303端口通信。
      geth --datadir "/user/packt/ethereum" --networkid 1
      //--datadir 用于指定哪里存储区块链 默认路径是“$HOME/.ethereum”
      
    
    –networkid用于指定网络ID。1代表主网网络,默认值是1。2代表测试网络
  • 2.创建私有网络
    要创建私有网络,只需给出一个随机网络ID即可。可以简单使用–dev标记云心给一个私有网络,该网络允许多个与日志调试相关的标记

2.15.4 创建账户

geth允许创建账户,即生成秘钥和相关地址。

geth account new 

在本地钱包获得所有账户的列表

geth account list

秘钥默认存储在–datadir路径中,但用户可以使用–keystore选项指定一个不同的目录。

  • 1.挖矿
    默认不启动挖矿。为了指示geth开始挖矿,只需要提供–mine选项。
      --minerthread//用于指定哈希过程中使用的线程总数,默认使用8个线程。
      --etherbase//挖矿赚取的回报存入地址
      --unlock //解锁一个或多个账户
      --minergpus//用于指定挖矿使用的GPU。默认使用cpu,而不使用gpu
      --geth gpuinfo//得到GPU列表
      
    
  • 2.快速同步

fast synchronizatin 不下载整个区块,而只下载区块头、交易凭证和最新的状态数据库。

在下载区块链的过程中使用fast sync,用户需要在运行geth的过程中使用–fast。

2.16 以太坊钱包

以太坊钱包是一个以太坊UI客户端,它允许用户进行创建账户、发送以太币、部署合约、调用合约方法等操作。

以太坊钱包和geth捆绑在一起。运行以太坊时,他会尝试发现一个本地geth实例并与之连接;如果它不能发现geth正在运行,他就启动自己的geth节点。以太坊钱包使用IPC与geth通信。geth支持以文件为基础的IPC。

2.17 浏览器钱包

浏览器钱包(Mist)是以太坊、Whisper和Swarm的一个客户端,它允许用户发送交易、发送Whisper信息、检查区块链等。

MIst最热门的功能是它带有 浏览器。浏览器中的运行的前端JavaScript可以使用web3.js库访问geth节点的web3 API.

2.18 以太坊的缺点

  • 1.Sybil攻击
  • 2.51%攻击

2.19 serenity

serenity是以太坊下一个主要更新的名字。
serenity把共识协议改为casper,并将整合状态通道和分片。

  • 1.支付和状态通道
    支付通道功能允许将两个以上向另一个账户发送以太币的交易合并成两个交易。

    支付通道是与发送以太币相关的交易。
    状态通道允许合并与智能合约相关的交易。

  • 2.权益证明和casper

    理解权益证明(Proof-of-Stake, PoS)共识协议的工作原理。
    权益证明是工作量证明最常见的替代共识。工作量证明会浪费大量算力。
    PoW和PoS之间的区别就是:
    在PoS中,矿工不需要解决问题;
    在PoW中,矿工需要证明挖矿权益的所有权。

    在PoS系统中,账户中的以太币被当做权益,矿工挖矿的概率和矿工只有的权益成正比。
    casper是PoS的一个修订版本,它解决了PoS中的一些问题。

  • 3.分片
    分片就是在多个计算机分布数据的方法。以太坊将实现分片,以分割区块链并跨节点分布区块链。

2.20 总结

  • 1.学习以太坊的工作原理;
  • 2.区块时间如何影响安全和以太坊的缺点;
  • 3.学习Mist和以太坊钱包的概念及其安装方法,以及geth的一些重要命令;
  • 4.学习了一些以太坊serenity更新中的新内容。