以太坊白皮书笔记

以太坊白皮书笔记

比特币的两个创新:

  • 一种去中心化的点对点的网上货币
  • 基于工作量证明的区块链概念使得人们可以就交易顺序达成共识。

“智能合约”:

  • 根据事先任意制订的规则来自动转移数字资产的系统。

以太坊的目标:

  • 就是提供一个带有内置的成熟的图灵完备语言的区块链,用这种语言可以创建合约来编码任意状态转换功能,用户只要简单地用几行代码来实现逻辑,就能够创建以上提及的所有系统以及许多我们还想象不到的的其它系统。从而,将区块链应用于货币以外的领域。

历史

中本聪的创新是引入这样一个理念:将一个非常简单的基于节点的去中心化共识协议与工作量证明机制结合在一起。节点通过工作量证明机制获得参与到系统的权利,每十分钟将交易打包到“区块”中,从而创建出不断增长的区块链。

作为状态转换系统的比特币

从技术角度讲,比特币账本可以被认为是一个状态转换系统,该系统包括所有现存的比特币所有权状态和“状态转换函数”。状态转换函数以当前状态和交易为输入,输出新的状态。

  • UTXO:所有已经被挖出的、没有花费的比特币(技术上称为“未花费的交易输出,unspent transaction outputs)。每个UTXO都有一个面值和所有者。
  • 一笔交易:包括一个或多个输入和一个或多个输出。
  • 每个输入包含一个对现有UTXO的引用和由与所有者地址相对应的私钥创建的密码学签名。
  • 每个输出包含一个新的加入到状态中的UTXO。

在比特币系统中,状态转换函数APPLY(S,TX)->S’大体上可以如下定义:

  • 交易的每个输入:
    • 如果引用的UTXO不存在于现在的状态中(S),返回错误提示
    • 如果签名与UTXO所有者的签名不一致,返回错误提示
  • 如果所有的UTXO输入面值总额小于所有的UTXO输出面值总额,返回错误提示
  • 返回新状态S’,新状态S中移除了所有的输入UTXO,增加了所有的输出UTXO。

挖矿

每个区块包含一个时间戳、一个随机数、一个对上一个区块的引用(即哈希)和上一区块生成以来发生的所有交易列表。

  • 区块验证算法,即“工作量证明”:
  • 防止攻击:利用交易顺序攻击时,在发生区块链分叉时,区块链长的分支被认为是诚实的区块链。

默克尔树

左:仅提供默克尔树(Merkle tree)上的少量节点已经足够给出分支的合法证明。 右:任何对于默克尔树的任何部分进行改变的尝试都会最终导致链上某处的不一致。

  • 默克尔树是一种二叉树,由一组叶节点、一组中间节点和一个根节点构成。最下面的大量的叶节点包含基础数据,每个中间节点是它的两个子节点的哈希,根节点也是由它的两个子节点的哈希,代表了默克尔树的顶部。
  • 默克尔树的目的是允许区块的数据可以零散地传送:节点可以从一个源下载区块头,从另外的源下载与其有关的树的其它部分,而依然能够确认所有的数据都是正确的。

节点:

  • 轻节点”,它下载区块头,使用区块头确认工作量证明,然后只下载与其交易相关的默克尔树“分支”。
  • 全量节点:存储和处理所有区块的全部数据的节点。

其他区块链应用

去中心化共识技术的应用将会服从幂律分布,大多数的应用太小不足以保证自由区块链的安全,我们还注意到大量的去中心化应用,尤其是去中心化自治组织,需要进行应用之间的交互。

脚本

本质上,比特币系统允许不同的密码学货币进行去中心化的兑换。然而,比特币系统的脚本语言存在一些严重的限制:

  • 缺少图灵完备性:不支持循环语句。
  • 价值盲(Value-blindness)。UTXO脚本不能为账户的取款额度提供精细的的控制。
  • 缺少状态 – UTXO只能是已花费或者未花费状态,这就没有给需要任何其它内部状态的多阶段合约或者脚本留出生存空间。
  • 区块链盲(Blockchain-blindness)- UTXO看不到区块链的数据,例如随机数和上一个区块的哈希。这一缺陷剥夺了脚本语言所拥有的基于随机性的潜在价值,严重地限制了博彩等其它领域应用。

以太坊

  • 以太坊的目的是基于脚本、竞争币和链上元协议(on-chain meta-protocol)概念进行整合和提高,使得开发者能够创建任意的基于共识的、可扩展的、标准化的、特性完备的、易于开发的和协同的应用。
  • 以太坊通过建立终极的抽象的基础层-内置有图灵完备编程语言的区块链-使得任何人都能够创建合约和去中心化应用并在其中设立他们自由定义的所有权规则、交易方式和状态转换函数。

以太坊账户

以太坊的账户包含四个部分:

  • 随机数,用于确定每笔交易只能被处理一次的计数器
  • 账户目前的以太币余额
  • 账户的合约代码,如果有的话
  • 账户的存储(默认为空)

以太币(Ether):

  • 是以太坊内部的主要加密燃料,用于支付交易费用。

两类账户:外部所有的账户(由私钥控制的)和合约账户(由合约代码控制)。

  • 外部所有的账户没有代码,人们可以通过创建和签名一笔交易从一个外部账户发送消息。
  • 每当合约账户收到一条消息,合约内部的代码就会被激活,允许它对内部存储进行读取和写入,和发送其它消息或者创建合约。

消息和交易

以太坊的消息在某种程度上类似于比特币的交易,但是两者之间存在三点重要的不同。

  • 第一,以太坊的消息可以由外部实体或者合约创建,然而比特币的交易只能从外部创建。
  • 第二,以太坊消息可以选择包含数据。
  • 第三,如果以太坊消息的接受者是合约账户,可以选择进行回应,这意味着以太坊消息也包含函数概念。

以太坊中“交易”是指存储从外部账户发出的消息的签名数据包。交易包含消息的接收者、用于确认发送者的签名、以太币账户余额、要发送的数据和两个被称为STARTGAS和GASPRICE的数值。

  • STARTGAS就是限制,GASPRICE是每一计算步骤需要支付矿工的费用。
  • 创建合约有单独的交易类型和相应的消息类型;合约的地址是基于账号随机数和交易数据的哈希计算出来的。

以太坊状态转换函数

以太坊的状态转换函数:APPLY(S,TX) -> S',可以定义如下:

  • 检查交易的格式是否正确(即有正确数值)、签名是否有效和随机数是否与发送者账户的随机数匹配。如否,返回错误。
  • 计算交易费用:fee=STARTGAS * GASPRICE,并从签名中确定发送者的地址。从发送者的账户中减去交易费用和增加发送者的随机数。如果账户余额不足,返回错误。
  • 设定初值GAS = STARTGAS,并根据交易中的字节数减去一定量的瓦斯值。
  • 从发送者的账户转移价值到接收者账户。如果接收账户还不存在,创建此账户。如果接收账户是一个合约,运行合约的代码,直到代码运行结束或者瓦斯用完。
  • 如果因为发送者账户没有足够的钱或者代码执行耗尽瓦斯导致价值转移失败,恢复原来的状态,但是还需要支付交易费用,交易费用加至矿工账户。
  • 否则,将所有剩余的瓦斯归还给发送者,消耗掉的瓦斯作为交易费用发送给矿工。

代码执行

EVM代码(以太坊虚拟机代码):使用低级的基于堆栈的字节码的语言写成。代码由一系列字节构成,每一个字节代表一种操作。操作可以访问三种存储数据的空间:

  • 堆栈,一种后进先出的数据存储,32字节的数值可以入栈,出栈。
  • 内存,可无限扩展的字节队列。
  • 合约的长期存储,一个秘钥/数值的存储,其中秘钥和数值都是32字节大小,与计算结束即重置的堆栈和内存不同,存储内容将长期保持。

区块链和挖矿

以太坊区块不仅包含交易记录和最近的状态,还包含区块序号和难度值。以太坊中的区块确认算法如下:

  • 检查区块引用的上一个区块是否存在和有效。
  • 检查区块的时间戳是否比引用的上一个区块大,而且小于15分钟。
  • 检查区块序号、难度值、 交易根,叔根和瓦斯限额(许多以太坊特有的底层概念)是否有效。
  • 检查区块的工作量证明是否有效。
  • S[0]赋值为上一个区块的STATE_ROOT
  • 将TX赋值为区块的交易列表,一共有n笔交易。对于属于0……n-1的i,进行状态转换S[i+1] = APPLY(S[i],TX[i])。如果任何一个转换发生错误,或者程序执行到此处所花费的瓦斯(gas)超过了GASLIMIT,返回错误。
  • S[n]S_FINAL赋值, 向矿工支付区块奖励。
  • 检查S-FINAL是否与STATE_ROOT相同。如果相同,区块是有效的。否则,区块是无效的。

应用

三种应用:

  • 第一类是金融应用,为用户提供更强大的用他们的钱管理和参与合约的方法。包括子货币,金融衍生品,对冲合约,储蓄钱包,遗嘱,甚至一些种类的全面的雇佣合约。
  • 第二类是半金融应用,这里有钱的存在但也有很重的非金钱的方面,一个完美的例子是为解决计算问题而设的自我强制悬赏。
  • 还有在线投票和去中心化治理这样的完全的非金融应用。

令牌系统

链上令牌系统有很多应用,如美元或黄金等资产的子货币、公司股票、不可伪造的优惠券、积分奖励, 所有的货币或者令牌系统,从根本上来说是一个带有如下操作的数据库:从A中减去X单位并把X单位加到B上,前提条件是(1)A在交易之前有至少X单位以及(2)交易被A批准。实施一个令牌系统就是把这样一个逻辑实施到一个合约中去。

金融衍生品

金融衍生品是“智能合约”的最普遍的应用,也是最易于用代码实现的之一。

实现金融合约的主要挑战是它们中的大部分需要参照一个外部的价格发布器。最简单地方法是通过由某特定机构(例如纳斯达克)维护的“数据提供“合约进行,该合约的设计使得该机构能够根据需要更新合约,并提供一个接口使得其它合约能够通过发送一个消息给该合约以获取包含价格信息的回复。 ## 身份和信誉系统

去中心化文件存储

以太坊合约允许去中心化存储生态的开发,这样用户通过将他们自己的硬盘或未用的网络空间租出去以获得少量收益,从而降低了文件存储的成本。当一个用户想重新下载他的文件,他可以使用微支付通道协议(例如每32k字节支付1萨博)恢复文件。

去中心化自治组织

  • 去中心化自治组织(DAO, decentralized autonomous organization)”的概念指的是一个拥有一定数量成员或股东的虚拟实体,依靠比如67%多数来决定花钱以及修改代码。
  • 中心化组织(DO)
  • 去中心化自治公司(DAC,decentralized autonomous corporation)

进一步的应用

  • 储蓄钱包。类似银行。
  • 作物保险
  • 一个去中心化的数据发布器。
  • 云计算。
  • 点对点赌博。
  • 预测市场。

杂项和关注

改进版幽灵协议的实施

如果矿工A挖出了一个区块然后矿工B碰巧在A的区块扩散至B之前挖出了另外一个区块,矿工B的区块就会作废并且没有对网络安全作出贡献。此外,这里还有中心化问题:如果A是一个拥有全网30%算力的矿池而B拥有10%的算力,A将面临70%的时间都在产生作废区块的风险而B在90%的时间里都在产生作废区块。

费用

比特币使用的默认方法是纯自愿的交易费用,依靠矿工担当守门人并设定动态的最低费用。因为这种方法是“基于市场的”,使得矿工和交易发送者能够按供需来决定价格,所以这种方法在比特币社区被很顺利地接受了。然而,这个逻辑的问题在于,交易处理并非一个市场;虽然根据直觉把交易处理解释成矿工给发送者提供的服务是很有吸引力的,但事实上一个矿工收录的交易是需要网络中每个节点处理的,所以交易处理中最大部分的成本是由第三方而不是决定是否收录交易的矿工承担的。于是,非常有可能发生公地悲剧。

计算和图灵完备

以太坊虚拟机是图灵完备的。防止恶意循环:每一个交易设定运行执行的最大计算步数来解决问题,如果超过则计算被恢复原状但依然要支付费用。

货币和发行

发行模式如下:

  • 通过发售活动,以太币将以每BTC 1337-2000以太的价格发售,一个旨在为以太坊组织筹资并且为开发者支付报酬的机制已经在其它一些密码学货币平台上成功使用。早期购买者会享受较大的折扣,发售所得的BTC将完全用来支付开发者和研究者的工资和悬赏,以及投入密码学货币生态系统的项目。
  • 0.099x (x为发售总量)将被分配给BTC融资或其它的确定性融资成功之前参与开发的早期贡献者,另外一个0.099x将分配给长期研究项目。
  • 自上线时起每年都将有0.26x(x为发售总量)被矿工挖出。

除了线性的发行方式外,和比特币一样以太币的的供应量增长率长期来看也趋于零。

挖矿的中心化

  • 以太坊使用一个基于为每1000个随机数随机产生唯一哈希的函数的挖矿算法,用足够宽的计算域,去除专用硬件的优势。

扩展性

  • 如果比特币网络处理Visa级的2000tps的交易,它将以每三秒1MB的速度增长(1GB每小时,8TB每年)。太坊全节点只需存储状态而不是完整的区块链,从而得到改善。
  • 因为基于区块链的挖矿算法,至少每个矿工会被迫成为一个全节点,这保证了一定数量的全节点。

综述:去中心化应用

从“传统”网页的角度看来,这些网页是完全静态的内容,因为区块链和其它去中心化协议将完全代替服务器来处理用户发起的请求。

结论

  • 以太坊协议最初是作为一个通过高度通用的语言,提供链上契约、提现限制、金融合约、赌博市场等高级功能,作为升级版密码学货币。
  • 作为图灵完备编程语言,理论上任意的合约创建出来。
  • 以太坊协议比单纯的货币走得更远,可以创建金融和非金融应用。
  • 提供了一个具有独特潜力的平台

通俗理解

  1. 是区块链的结构?区块链就是很多块数据的存储,形成链式结构。你可以这样理解,一个区块就是一个Word文件,每分钟产生一个Word文档;如果创世区块链式001.doc,第二分钟就是002.doc,后面依次产生下去003.doc 004.doc ... xxN.doc, 这就像链条一样,所以才叫区块链。总之一句话,每分钟产生的Word文档用链条连接起来,就是区块链。
  2. 第二点就是,所有的文档存储在哪里?先说下,传统的金融行业,农业银行的系统,那就农行自己的机器上面。如果农行想修改的数据,可以随便修改。 这种情况,农行就是中心。区块链的存储是网上所有的挖矿机器上面, 任何人都没有权限修改你的数据,也就是Word文档的内容,任何人都不能修改。这也是为什么,区块链是去中心化的,没有中心,没有人能篡改。
  3. 区块里面放了什么? 每个Word文档里面放的就是这一分钟的交易信息。比如,我给你转账1个比特币,就放在当前分钟的Word文档里面。
  4. 谁来把这些信息放到Word文档里面 矿工。 每个矿工(也就是计算机)都在抢打包交易信息去权限,抢到了就是挖到了矿,就会得到比特币的奖励。

参考文档

坚持原创技术分享,您的支持将鼓励我继续创作!