eth

以太坊基本认识和理解笔记

基本架构图

图…..

核心模块: 基础结构,共识算法,网络模块,其它模块。这几个模块的内容,跟比特币的模块有点像啊。

合约层是使用Solidity语言编写的智能合约,其运行在EVM以太坊虚拟机上,并会通过HTTP-RPC或JSON-RPC调用和以太坊的核心层交互。

以太坊架构的最上层是DApp应用层,它通过Web3.js这种JavaScript API和智能合约层进行交互。

基本概念

ether

ether为以太坊中的内置货币。例如,矿工挖出新矿时,奖励的便是ether。它的主要目的是提供主要流动性层,以实现各种数字资产之间的有效交换,更重要的是提供支付交易费用的机制。

  • 首先,谁需要ether呢?

    1. 打算开发使用ethereum区块链的应用的开发者。
    2. 想要在ethereum区块链上访问并与智能合同交互的用户。
  • 其次,ether与bitcoin的关系是什么呢?

    Ethereum would never be possible without bitcoin—both the technology and the currency—and we see ourselves not as a competing currency but as complementary within the digital ecosystem. Ether is to be treated as “crypto-fuel”, a token whose purpose is to pay for computation, and is not intended to be used as or considered a currency, asset, share or anything else.

​ 意思呢,就是二者并非竞争关系,而是互相补充的关系。ether的目的是计算付费,并不打算用作货币,资产,股票或其他任何东西。在一些以太坊的生态中,ether与bitcoin是可以进行价值兑换的。

gas

gas为计算花费的基本单位。通常,一步的计算花费1gas,但是一些操作耗费更高的气体量,因为它们在计算上更昂贵,或者增加了作为状态的一部分必须存储的数据量。交易数据中的每个字节的费用5gas,收费系统的目的是要求攻击者按比例支付她们消费的每种资源,包括计算量,带宽和存储量。

一笔交易,除了需要包含接收方,发件人签名,ether的数量,之外,还需要包含数据字段(可选),一个STARTGAS值,表示允许执行事务执行的最大计算步骤数,和一个GASPRICE值,即为每gas的花费的ether。

举个例子,现有一笔交易,内容为发送的ether为10,STARTGAS为2000,GASPRICE为0.001,和一个64bytes的数据,那么计算允许的所需要的ether为单价*数量=2000 * 0.001=2。 比较详细的交易如下

  1. 检查交易是否有效

  2. 检查发送方账户是否至少含有2000*0.001=2 ether, 如果有,则从发送方账户中减去2 ether

  3. 总共有2000gas, 假设交易长度为170bytes, 每bytes 5gas,那么减去850,剩余1150gas

  4. 从发送方账户余额中减去发送的10 ether, 并添加到合约账户中

  5. 运行代码进行计算,假设计算过程消耗了187gas, 那么剩余1150-187=963gas

  6. 将963gas转换为ether, 此项交易中单价是0.001,那么返回到发送方的ether为0.963

账户

在以太坊中,状态由账户对象组成,每个账户都有一个20byte的地址,状态转换是账户之间价值和信息的直接转移。以太坊账户包含四个字段:

  • nonce, 用来确保每笔交易柜台一次只能处理
  • 账户当前的ether余额
  • 账户的合约代码,如果存在的话
  • 账户的存储空间,默认为空

通常,有两种账户,外部的个人拥有的账户,使用私钥进行控制; 以及合约账户,被合约代码控制。个人账户能够发送消息以及创建并签署交易。合约账户收到其激活码可读写内存,发送消息以及创建新的合约

消息和交易

交易需要包含以下内容:

  • 消息的收件人
  • 识别发件人的签名
  • 发送的ether数量
  • 可选的数据字段
  • 一个STARTGAS值,表示允许执行事务执行的最大计算步骤数
  • 一个GASPRICE值,表示发件人按计算步骤支付的费用

消息包含:

  • 消息的发送者(隐式)
  • 消息的收件人
  • 与消息一起传输的ether数量
  • 可选的数据字段
  • 一个STARTGAS

从本质上讲,消息就像一个交易,除了它是由合同产生的而不是由外部参与者产生的。当一个正在执行代码的合同执行CALL操作码时,产生一条消息,该操作码产生并执行一条消息。就像一个交易,一条消息导致收件人账户运行其代码。因此,合约可以与外部参与者完全相同的方式与其他合约有关系。

请注意,交易或合同分配的gas限额适用于该交易和所有子执行消耗的gas量。例如,如果外部参与者A向B发送1000个gas的事务,并且B在向C发送消息之前消耗600gas,并且C的内部执行在返回之前消耗300gas,则B在运行之前可以花费另外100个gas。

请注意,消息在回复方面与事务等效:如果消息执行耗尽,那么该消息的执行以及该执行触发的所有其他执行都会恢复,但父执行不需要恢复。这意味着合同可以调用另一份合同是“安全的”,就好像A用G气调用B一样,那么A的执行保证最多会损失G气。最后,请注意,有一个操作码CREATE可以创建合同; 其执行机制通常与执行机制类似CALL,但执行输出决定了新创建合同的代码。

状态转换

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

  1. 检查交易是否格式正确(即具有正确数量的值),签名是否有效,并且nonce与发件人帐户中的nonce相匹配。如果不是,则返回错误。

  2. 计算交易费用STARTGAS * GASPRICE,并从签名确定发送地址。从发件人帐户余额中扣除费用并增加发件人的nonce。如果没有足够的余额可用,请返回错误。

  3. 初始化GAS = STARTGAS并在每个字节中取出一定数量的气体以支付交易中的字节数。

  4. 将交易金额从发件人的帐户转移到收款帐户。如果接收帐户尚不存在,请创建它。如果接收账户是合同,则运行合同代码以完成或直到执行用完为止。

  5. 如果由于发件人没有足够的资金或代码执行耗尽而导致价值转移失败,请恢复除支付费用之外的所有状态更改,并将费用添加到矿工帐户。

  6. 否则,将所有剩余天然气的费用退还给发送方,并将支付的天然气费用发送给矿工

代码执行

合约中的代码采用low-level,基于堆栈的字节码语言编写,称为”以太网虚拟机代码”或”EVM代码”。该代码由一系列字节组成,其中每个字节表示一个操作。一般来说,代码执行是在当前程序计数器(从零开始)重复执行操作,然后将程序计数器递增1,直到代码结束或错误STOPRETURN指令被检测到的一个无限循环。这些操作可以访问三种类型的存储空间:

  1. 堆栈,后进先出容器,其值可以被压入和弹出
  2. 内存。一个无限扩展的字节数组
  3. 合同的长期存储,一个key/value的存储,与计算结束后重置的堆栈和内存不同,存储长期存在。

代码还可以访问传入消息的值,发送者和数据以及块头数据,代码也可以返回一个字节数组作为输出。

EVM代码的正式执行模型非常简单。当以太坊虚拟机运行时,它的完整计算状态可以由元组定义(block_state, transaction, message, code, memory, stack, pc, gas),其中block_state是包含所有帐户并包括余额和存储的全局状态。在每一轮执行开始时,当前的指令是通过取pccode(或0 pc >= len(code))个字节的第n个字节来找到的,并且每条指令都有它自己的定义,以表明它如何影响元组。例如,ADD从堆叠中弹出两个物品并推动它们的总和,减gas1和增pc1,SSTORE从堆栈中弹出前两个项目,并将第二个项目插入到第一个项目指定的索引处的合同存储器中。虽然有很多方法可以通过即时编译来优化以太坊虚拟机的执行,但以太坊的基本实现可以通过几百行代码完成。

区块链和采矿

以太坊的区块链和比特币的区块链有很多地方相似,也有不同的地方。最大的不同点在于,以太坊区块包含交易列表及最新状态二者的副本,除此之外,在区块中还存储了两个其他的值,区块号,和难度(计算难度)。以太坊中的基本块验证算法如下:

  1. 检查前面的块引用是否存在并且是有效的。
  2. 检查块的时间戳大于引用的前一个块的时间戳,并且在未来15分钟内
  3. 检查块号,难度,交易根,叔叔根和气体限制(各种低级以太坊特定概念)是否有效。
  4. 检查块的工作证明是否有效。
  5. 让我们S[0]成为上一个区块结束时的状态吧。
  6. TX块成为具有n个交易的交易清单。对于所有i0...n-1设置S[i+1] = APPLY(S[i],TX[i])。如果任何应用程序返回一个错误,或者如果在这个点上阻塞的气体总量超过了这个数量GASLIMIT,返回一个错误。
  7. 我们S_FINALS[n],而且将支付给矿工块奖励。
  8. 检查状态的Merkle树根S_FINAL是否等于块头中提供的最终状态根。如果是,则该块有效; 否则,它是无效的。

这种方法乍一看似乎效率很低,因为它需要在每个块中存储整个状态,但实际上效率应该与比特币相当。原因是状态存储在树状结构中,并且在每个块之后只需要改变树的一小部分。因此,一般来说,在两个相邻块之间,绝大多数树应该是相同的,因此数据可以被存储一次并且使用指针(即子树的散列)被引用两次。一种称为“Patricia树”的特殊树被用来实现这一点,包括对Merkle树概念的修改,允许节点被插入和删除,而不仅仅是有效地改变。另外,因为所有的状态信息都是最后一个块的一部分,没有必要存储整个区块链的历史——如果可以应用到比特币上,就可以计算出在太空中节省5-20x的成本。

就物理硬件而言,一个常见问题是在哪里执行合同代码。这有一个简单的答案:执行合同代码的过程是状态转换函数的定义的一部分,它是块验证算法的一部分,所以如果一个事务被添加到块B中,该事务生成的代码执行将被执行所有节点现在和将来都会下载并验证块B

应用

总的来说,在以太坊之上有三种类型的应用程序。第一类是金融应用程序,为用户提供更强大的管理方式,并使用他们的资金签订合同。这包括子货币,金融衍生品,套期保值合约,储蓄钱包,遗嘱以及最终甚至是一些类别的全面雇佣合同。第二类是半金融应用,涉及金钱,但也有非常重要的非货币方面的工作; 一个完美的例子就是为计算问题的解决方案自我实施奖励。最后,还有诸如在线投票和分散治理等应用程序,这些应用程序根本没有财务。

该章节并不完全,仅摘取了介绍部分,详细内容还需到以太坊白皮书中查阅

令牌系统

区块链上的代币系统有许多应用程序,从代表资产(如美元或黄金)的子货币到公司股票,代表智能财产的单个代币,安全不可伪造的优惠券,甚至与常规值完全无关的代币系统,用作点激励制度。令牌系统在Ethereum中实现起来非常简单。要理解的关键是,所有货币或标记系统基本上都是一个数据库,只有一个操作:从A中减去X个单位并将X个单位给予B,但条件是(1)A至少有X个单位交易和(2)交易由A批准。实现令牌系统所需的一切就是将该逻辑实施到合同中。

金融衍生产品和稳定价值货币

金融衍生工具是“智能合约”中最常见的应用,也是最简单的代码实现之一。实施金融合同面临的主要挑战是,其中大部分要求参考外部价格报价; 例如,一个非常理想的应用程序是一种智能合约,可以抵御以太币(或另一种加密货币)相对于美元的波动性,但这样做需要合约知道ETH / USD的价值。最简单的方法是通过由特定方(例如纳斯达克)维护的“数据馈送”合同,以便该方能够根据需要更新合同,并提供一个接口,以允许其他合同发送向该合同发送消息并取回提供价格的响应。

身份和声誉系统

所有的最早的替代性加密货币,Namecoin试图使用类似比特币的区块链来提供名称注册系统,用户可以在公共数据库中将他们的名称与其他数据一起注册。主要引用的用例是DNS系统,将域名(比如“bitcoin.org”)(或者在Namecoin的例子中,“bitcoin.bit”)映射到IP地址。其他用例包括电子邮件认证和潜在更高级的信誉系统。

分散的文件存储

以太坊合同可以允许开发分散式文件存储生态系统,个人用户可以通过租用自己的硬盘来赚取少量的资金,未使用的空间可以用来进一步降低文件存储成本。

这种设备的关键在于我们称之为“分散式Dropbox合同”。该合同的工作如下。首先,将所需数据分成块,对每个块进行隐私加密,并从中构建一个Merkle树。然后用合约规则规定,每N个块,合约将在Merkle树中选择一个随机索引(使用之前的块散列,可从合同代码访问,作为随机源),并将X ether赋予第一个实体为该交易提供一个简化的支付验证类似树中该特定索引处块的所有权证明。当用户想要重新下载他们的文件时,他们可以使用微支付通道协议(例如,支付每32千字节1个szabo)来恢复文件;

该协议的一个重要特点是,虽然看起来好像一个人相信许多随机节点不会决定忘记文件,但可以通过秘密共享将文件分割成许多块,从而将风险降低到接近于零,并且看合同,看看每件作品仍然在某个节点中。如果合同仍在支付金钱,那么它提供了一个密码证明,表明某人仍在存储该文件。

分散的自治组织

“分散式自治组织”的一般概念是拥有一定数量的成员或股东的虚拟实体的概念,这些成员或股东可能拥有67%的多数股东有权利用该实体的资金并修改其代码。成员们将共同决定组织如何分配资金。分配DAO资金的方法可以从赏金,工资到甚至更多外来机制(如内部货币)以奖励工作。这基本上复制了传统公司或非营利组织的法律标志,但仅使用加密区块链技术执行。

参考地址如下

  1. http://baijiahao.baidu.com/s?id=1595831842043592716&wfr=spider&for=pc
  2. https://github.com/ethereum/wiki/wiki/White-Paper