Ethereum开发笔记1-1: Blockchain简介

分类: ETHEREUM 发布于:

共识就是一起检查一个区块是否有效。

什么是工作量证明(proof of work)?

工作量证明的目的是使区块的创建变得困难,从而阻止女巫攻击者恶意重新生成区块链。

从而确保了链上价值存储的稳定性和不可篡改性。

去中心化的各个节点之间是通过异构体之间的共识机制来确保不可篡改性。这是区块链的根。

但是,问题是,单个节点通过什么手段来判定区块的合法性?

目前主流有2种方法:

1) 比特币使用POW,也就是工作量证明。

只要一个台机器成功的按照规则(比特币是猜测前面含有N个0的Hash串)做到一件事情。把证据(nounce + 它对应的hash)打包入区块中。

广播后,每个节点验证nounce 和 它对应的Hash是否正确,并唯一。 如果是,peer投赞同票。 否则拒绝了。

这样的动作实现了一类共识。

2)还有另外一种共识,基于权益的证明(Proof of stake)

POS也是一种共识机制,用于区块的校验工作。它通过下注的方式实现。

  • 验证者必须锁定一些他们拥有的币作为保证金。

  • 在此之后,他们将开始验证区块。同时,当他们发现一个他们认为可以被加到链上的区块时,他们会通过下赌注来验证它。

  • 如果该区块成功上链,验证者就将得到一个与他们的赌注成比例的奖励。

POS的优势

  • 帮助实现分散化

  • 高能效

  • 经济安全

  • 扩展性

比特币中的区块链

比特币提出的背景
互联网上的贸易,几乎都需要借助金融机构作为可资信赖的第三方来处理电子支付信息。

虽然这类系统在绝大多数情况下都运作良好,但是这类系统仍然内生性地受制于“基于信用的
模式”(trust based model)的弱点。

我们无法实现完全不可逆的交易,因为金融机构总是不可避免地会出面协调争端。

而金融中介的存在,也会增加交易的成本,并且限制了实际可行的最小交易规模,也限制了日常的小额支付交易。

并且潜在的损失还在于,很多商品和服务本身是无法退货的,
如果缺乏不可逆的支付手段,互联网的贸易就大大受限。

因为有潜在的退款的可能,就需要交易双方拥有信任。

而商家也必须提防自己的客户,因此会向客户索取完全不必要的个人信息。

而实际的商业行为中,一定比例的欺诈性客户也被认为是不可避免的,相关损失视作销售费用处理。

而在使用物理现金的情况下,这些销售费用和支付问题上的不确定性却是可以避免的,因为此时没有第三方信用中介的存在。

比特币系统背后的相关概念
  • 交易(transactions): 区块链的存储属性

相关概念

电子货币(electronic coin)是一串数字签名(digital signature):

每一位所有者,通过对前一次交易(previous transactions)和下一位拥有者的公钥签署一个数字签名,并将这个签名附加在货币的末尾, 电子货币就发送给了下一位所有者。

收款人对签名进行检验,就可验证数字货币的拥有者。

交易的唯一性确定

通过Hash方法确保在交易期间,绝大多数节点认同该交易是首次出现。

  • 时间戳服务器: 链条是如何形成的?

顾名思义, 对区块的内容实施随机散列,并且加上时间戳。

该时间戳能够证实特定数据必然于某特定时间是的确存在的,因为只有在该时刻存在了才能获取相应的随机散列值。

每个时间戳应当将前一个时间戳纳入其随机散列值中,每一个随后的时间戳都对之前的一个时间戳进行增强(reinforcing), 这样就形成了一个链条(Chain)。

  • 工作量证明(proof of work), 区块链不可篡改性背后的逻辑

Bitcoint中的实现方法是,增加一个nounce随机数字段:

这个nounce的散列值具备这样的特性: 前N位是0。 通过这种形式的计算,挖矿者才不断的猜测这个nounce,一旦符合定义的条件(前N位是0),它讲获得区块的记账权(数据入链)

所谓记账权,就是把交易(是全网内没有打包入块的交易)列表打包入区块。

  • 区块链网络

网络的运行方式如下:

  • 新的交易面向全网广播

  • 每一个节点都将收到的交易信息纳入一个区块中

  • 每个节点都尝试在自己的区块中找到一个具有足够难度的工作量证明

  • 当一个节点找到了一个工作量证明,它就向全网进行广播

  • 当且仅当包含在该区块中的所有交易都是有效的且之前未存在过的,其他节点才认同 该区块的有效性

  • 其他节点表示他们接受该区块,而表示接受的方法,则是在跟随该区块的末尾,制造 新的区块以延长该链条,而将被接受区块的随机散列值视为先于新区快的随机散列值

  • 激励

比特币内存在如此约定:

  • 对每一笔区块的第一笔交易进行特殊化处理,该交易产生一枚有区块创造者(挖矿人)拥有的新的电子货币(bitcoin)。

  • 增加了节点支持该网络的激励。

  • 提供了一种在没有中央集权机构发行货币的情况下,将电子货币分配到流通领域的一种方法。

  • 另外一个激励来源是交易费。

区块链结构

以太坊网络中的区块链

以太坊项目提出的背景

Etherem项目的提出是源与比特币的UTXO的不足之处。

比特币系统的脚本语言存在一些严重的限制:

  • 缺少图灵完备性, 简单理解是,可编程的能力非常弱。

  • Value-blindness,简单理解是,UTXO与复杂场景下的脚本不能友好地协作。

  • 缺少状态,简单理解是,UTXO是个简单对象,为复杂可编程的脚本预留的空间很小。

  • Blockchain-blindness, 简单理解是, UTXO对象不包含链相关的上下文,无法与链上数据交互。

所以,为了弥补以上比特币脚本的缺陷, 以太坊实现了更复杂的脚本执行上下文, 这种脚本的另外一个名字是智能合约

引用白皮书的一段概述

本项目旨在提取上述协议中的创新并将其通用化-创造一个功能完善的,图灵完备的(但是可深度自由调整的)加密账簿,它允许参与者编写任意复杂的完全存在于并且被块链传递的合约,自治代理和关系。用户可以把以太坊当成一种“金融积木”来用,而不是受限于某一特定的交易类型集合。

... 成为一个提供超强脚本系统的优秀底层协议,在其上可以创建任意高级的合约,货币及其它去中心化应用...

Ethereum区块链上的概念模型

以太坊账户模型

比特币也有账户的概念,就是UTXO. 它包含所有者以及价值信息。 系统中的交易有UTXO INPUT 和 UTXO OUTPUT 组成。

比特币中一个账户的余额就是该用户的私钥能有效签名的所有UTXO的总和。

Eth系统中,账户是一个20字节的地址,包含四个部分:

1) 随机数, 用户确定每笔交易只能被处理一次。

2) 余额

3) 账户的合约代码

4) 账户的存储

它有两种类型的账户:

1) 合约以外的账户,也成为外部账户,由私钥控制。外部账户没有代码,需要手动创建和签名一笔交易,然后发送消息。

2) 合约账户。

合约账户的能力比外部账户强大:

  • 它可以对内部存储进行读写。

  • 发送消息

  • 创建合约

Eth的交易模型(Transactions)
  • 以太坊中“交易”是指存储从外部账户发出的消息的签名数据包。

Eth的交易是签名后的消息。

1) 以太坊的消息可以由外部实体或者合约创建,然而比特币的交易只能从外部创建。

2) 以太坊消息可以选择包含数据。

3) 如果以太坊消息的接受者是合约账户,可以选择进行回应,这意味着以太坊消息也包含函数概念。

Eth中的状态转换函数

简单理解,这个eth处理交易的一个事务。 步骤是固定的:

1) 检查交易的格式是否正确(即有正确数值)、签名是否有效和随机数是否与发送者账户的随机数匹配。

如否,返回错误。

2) 计算交易费用:fee=STARTGAS * GASPRICE,并从签名中确定发送者的地址。

从发送者的账户中减去交易费用和增加发送者的随机数。如果账户余额不足,返回错误。

3) 设定初值GAS = STARTGAS,并根据交易中的字节数减去一定量的瓦斯值。

4) 从发送者的账户转移价值到接收者账户。如果接收账户还不存在,创建此账户。

5) 如果接收账户是一个合约,运行合约的代码,直到代码运行结束或者瓦斯用完。

如果因为发送者账户没有足够的钱或者代码执行耗尽瓦斯导致价值转移失败,

恢复原来的状态,但是还需要支付交易费用,交易费用加至矿工账户。

否则,将所有剩余的瓦斯归还给发送者,消耗掉的瓦斯作为交易费用发送给矿工。 

总结

Blockchain是构建的公钥链之上的状态数据库。Ethereum 是构建状态数据库之上的执行引擎,并实现了图灵完备,简单讲,就是有自己的编程语言。

价值存储有图灵完备的必要吗?