乐知付加密服务平台

如果你有资源, 平台可以帮你实现内容变现, 无需搭建知识付费服务平台。

点击访问官方网站 https://lezhifu.cc

扫码关注公众号 乐知付加密服务平台-微信公众号
以太坊 | chenzuoli's blog

以太坊

以太坊 Do you like it?
Ethereum

一、layer2扩展解决方案

  1. 侧链loom network
  2. plasma

2019-08-25更新
————————————

二、Ethereum2.0研发计划

阶段0:信标链

      主要负责管理权益证明协议的运行,并协调所有独立的平行分片,他是整个开发中最复杂的部分,详情请看信标链

阶段1:分片链

      主要实现将验证者分散在1024条分片链上,点对点网络以足够快的速度与验证者之间准确无误的进行通信。

阶段2:执行层

      提供巨大的设计空间和无拘无束的开发氛围,提供一些不同的执行环境,例如代币转账执行环境(匿名),智能合约语言执行环境,为处理高容量Plasma侧链而优化的执行环境,以及为企业用户量身打造的执行环境,具备许可性和隐私性。

2019-09-08更新


三、账户

      以太坊中有2类账户,他们共用同一个地址空间。

外部账户

      该类账户被公钥-私钥对(人类)控制

合约账户

      该类账户被存储在合约中的代码控制

      另外,每个账户都有一个以太币余额,单位是Wei,该账户余额可以向它发送带有金额交易的方式来改变。

四、以太坊虚拟机

      以太坊虚拟机EVM,是以太坊中智能合约的运行环境。它不仅被沙箱隔离起来,实际上完全隔离,也就是说运行在虚拟机中的代码,不能接触到网络、文件系统、或其他进程。甚至智能合约和其他智能合约只能有有限的接触。

五、Gas

      以太坊上的每笔交易都需要消耗gas,目的是限制执行交易所需的工作量,同时为执行支付费用。当EVM执行交易时,gas将按照特定规则被逐渐消耗。
      gas price(gas价格,以太币计)是由交易创建者设定的,发送账户需要预付的交易费用=gas price * gas amount,如果执行结束gas还有剩余,那么这些gas将返回给发送账户。
      无论交易被执行到什么位置,一旦gas被耗尽(比如降为负值),将会触发一个out of gas异常,当前调用帧所做的所有状态修改都将被回滚。

2019-09-13更新
————————————————————————

六、存储、内存和栈

6.1 存储

      每个账户有一块持久化内存区叫做存储。存储是将256位字映射到256位字的键值存储区,在合约中枚举存储是不可能的,且读存储的开销很高,修改存储的开销甚至更高。合约只能读写存储区内属于自己的部分。

6.2 内存

      第二个内存区称为内存,合约会试图为每一次消息调用获取一块被重新擦拭干净的内存示例。内存是线性的,可以按照字节寻址,但读的长度被限制在256位,而写的长度可以是8位或256位。
      当访问(无论是读还是写)之前从未访问过的内存字(word)时(无论是偏移到该字内的任何位置),内存将按字进行扩展(每个字是256位)。扩容也将消耗一定的gas。 随着内存使用量的增长,其费用也会增高(以平方级别)。

6.3 栈

      EVM不是基于寄存器的,而是基于栈的,因此所有的计算都在一个称为
      栈最大有1024个元素,每个元素的长度为一个字(256位),对栈的访问仅限于顶端,限制方式为允许拷贝最顶端的16个元素中的一个到栈顶,或者是栈顶元素和下面的16个元素中的一个进行交换。所有其他操作都只能取最顶的2个(或1个,或更多,取决于具体的操作)元素,运算后,把结果压入栈顶。当然可以把栈上的元素放到存储或内存中。但是无法只访问栈上指定深度的那个元素,除非先从栈顶移除其他元素。

七、指令集

      EVM的指令集量应尽量少,以最大限度地避免可能导致共识问题的错误实现。所有的指令都是针对”256位的字(word)”这个基本的数据类型来进行操作。具备常用的算术、位、逻辑和比较操作。也可以做到有条件和无条件跳转。此外,合约可以访问当前区块的相关属性,比如它的编号和时间戳。

八、消息调用

      合约可以通过消息调用的方式来调用其它合约或者发送以太币到非合约账户。消息调用和交易非常类似,它们都有一个源、目标、数据、以太币、gas和返回数据。事实上每个交易都由一个顶层消息调用组成,这个消息调用又可创建更多的消息调用。

      合约可以决定在其内部的消息调用中,对于剩余的 gas ,应发送和保留多少。如果在内部消息调用时发生了out-of-gas异常(或其他任何异常),这将由一个被压入栈顶的错误值所指明。此时,只有与该内部消息调用一起发送的gas会被消耗掉。并且,Solidity中,发起调用的合约默认会触发一个手工的异常,以便异常可以从调用栈里“冒泡出来”。 如前文所述,被调用的合约(可以和调用者是同一个合约)会获得一块刚刚清空过的内存,并可以访问调用的payload——由被称为 calldata 的独立区域所提供的数据。调用执行结束后,返回数据将被存放在调用方预先分配好的一块内存中。 调用深度被 限制 为 1024 ,因此对于更加复杂的操作,我们应使用循环而不是递归。

九、委托调用/代码调用和库

      有一种特殊类型的消息调用,被称为 委托调用(delegatecall) 。它和一般的消息调用的区别在于,目标地址的代码将在发起调用的合约的上下文中执行,并且 msg.sendermsg.value 不变。 这意味着一个合约可以在运行时从另外一个地址动态加载代码。存储、当前地址和余额都指向发起调用的合约,只有代码是从被调用地址获取的。 这使得 Solidity 可以实现”库“能力:可复用的代码库可以放在一个合约的存储上,如用来实现复杂的数据结构的库。

十、日志

      有一种特殊的可索引的数据结构,其存储的数据可以一路映射直到区块层级。这个特性被称为 日志(logs) ,Solidity用它来实现 事件(events) 。合约创建之后就无法访问日志数据,但是这些数据可以从区块链外高效的访问。因为部分日志数据被存储在 布隆过滤器(Bloom filter) 中,我们可以高效并且加密安全地搜索日志,所以那些没有下载整个区块链的网络节点(轻客户端)也可以找到这些日志。

十一、合约创建

      合约甚至可以通过一个特殊的指令来创建其他合约(不是简单的调用零地址)。创建合约的调用 create calls 和普通消息调用的唯一区别在于,负载会被执行,执行的结果被存储为合约代码,调用者/创建者在栈上得到新合约的地址。

十二、失效和自毁

      合约代码从区块链上移除的唯一方式是合约在合约地址上执行自毁操作 selfdestruct 。合约账户上剩余的以太币会发送给指定的目标,然后其存储和代码从状态中被移除。移除一个合约听上去不错,但其实有潜在的危险,如果有人发送以太币到移除的合约,这些以太币将永远提丢失。

*注释

尽管一个合约的代码中没有显式地调用 selfdestruct ,它仍然有可能通过 delegatecallcallcode 执行自毁操作。

      如果要使合同失效,则应通过更改内部状态来禁用合约,这样可以在使用函数无法执行从而进行 revert,从而达到返还以太的目的。

*注释

旧合约的删减可能会,也可能不会被以太坊的各种客户端程序实现。另外,归档节点可选择无限期保留合约存储和代码。
目前,外部账户 不能从状态中移除。


当你累了的时候,停下来做个梦吧。
愿你坚持到底。


书山有路勤为径,学海无涯苦作舟。

欢迎关注微信公众号:【程序员写书】
程序员写书

喜欢宠物的朋友可以关注:【电巴克宠物Pets】
电巴克宠物

一起学习,一起进步。

-------------本文结束感谢您的阅读-------------