区块链笔记系列-Day2: 认识以太坊

以太坊是公共链。

那么以太坊的定义是啥呢?

什么是以太坊

       狭义来说,以太坊是一系列协议,其核心就是一个以太坊虚拟机,
 能执行遵守协议的任何复杂的代码。和任何的区块链一样,以太坊包含了一个点对点的网络协议。

以太坊虚拟机是图灵完备的,说明它可以像一台计算机一样。

图灵机

什么是图灵机?

图灵机(Turing Machine)是图灵在1936年发表的《论可计算数及其在判定性问题上的应用》中提出的数学模型。并且证明了,只要图灵机可以被实现,就可以用来解决任何可计算问题
图灵机的结构包括以下几个部分:

什么是图灵完备

图灵完备性是针对一套数据操作规则而言的概念

数据操作规则可以是一门编程语言,也可以是计算机里具体实现了的指令集。

当这套规则可以实现图灵机模型里的全部功能时,就称它具有图灵完备性。

如今主流的编程语言(C++,Java,Python,以及等等等等)都是图灵完备的语言

如果我们回到最底层,就会发现它们可以实现的功能其实完全一样,并且本质上就是一个图灵机。

递归函数的解释

三种基本函数

三种基本操作

三种函数通过前两种操作组合出来的所有函数被称为原始递归函数
原始递归函数+极小化组合出图灵机和偏递归函数等价,
一个语言如果是图灵完备的,那这个语言可以完全模拟这三种函数+三种操作

世界计算机

开发者可以在虚拟机上使用像javascript,python这样的友好的编程语言来创建应用

以太坊是一个可编程的区块链,不仅仅是给用户一些预定义操作(如比特币只交易),
以太坊允许用户创建属于他们自己的复杂的操作。
以太坊作为一个平台为不同的区块链应用提供服务
以太坊区块链是被链接着这个网络的各个节点维护和更新的。
网络中的各个节点的虚拟机都执行相同的指令来共同维护区块数据库,
因为这个原因,以太坊有时候被人称为“世界计算机”。


以太坊的目的

       是创建一种去中心化应用的协议,提供一套对大量的去中心化应用程序非常有用的新方案,特别强调快速开发,对小的和少数人使用的应用也非常安全(小而使用人少的应用容易被51%攻破),以及不同的应用程序之间能够有效的互动。
以太坊通过建立在本质上是抽象的基础层来完成这一工作:
一个区块链其内置了图灵完备的编程语言,允许任何人编写智能合约和去中心化的应用程序,在这些应用程序中,他们可以创建任意的属于他们自己的规则、交易格式和状态转换函数。

以太坊的账户

      以太坊的基本单元是账号。每一个账户都有一个20个字节长度的地址 。

以太坊区块链跟踪每一个账号的状态,区块链上所有状态的转移都是账户之间的令牌(令牌即以太币)和信息的转移。

以太坊有2种账户类型:
 1.外部账号,简称EOA,是由私钥来控制的。

 2.合约帐户,由合约代码来控制,且只能由一个EOA账号来操作

外部账户和合约区别

对于大多数用户来说,最基本的区别在于:
用户掌握着EOA账号,因为用户掌握着控制EOA账号的私钥。
而合约账号由内部程序代码来控制的,当然掌控私钥的EOA账户可以通过编写特定的程序代码来掌控合约账户。

智能合约

流行的术语“智能合约”就是合约账号中的代码,
当一个交易被发送到该账户时,合约中的代码就会被执行。
用户可以通过把代码部署到区块链中来创建一个新合约,也即创建了一个新的合约账户
合约账户只有在EOA账户发出一个指令的时候才会去执行一个操作。所以一个合约账户是不可能自己去执行一个操作的

在以太坊中,全网的状态是由被“账户”的对象组成的,
账户之间可以直接的进行价值和信息的转移,一个以太坊的账户包含下面4个字段:
  1.随机数, 一个计数器,用以确保每个交易都只会被处理一次
  2.账户当前的以太币额度
  3.账户的合约代码, 如果有的话
  4.这个账户的 存储 (默认空)


“以太币” 是以太坊主要的内部加密燃料,并且被用来支付交易的费用


交易

名词“交易”在以太坊中是指签名的数据包,这个数据包中存储了从外部账户发送的消息
交易包含如下内容:
 1.消息的接收者
 2.一个可以识别发送者的签名
 3.发送方给接收方的以太币的数量
 4.一个可选的数据字段
5. 一个 STARTGAS 值, 表示执行这个交易允许消耗的最大计算步骤
 6.一个 GASPRICE 值, 表示发送方的每个计算步骤的费用

    字段含义

     前面三个是每一个加密货币都有的标准字段
默认情况下第四个数据字段没有任何功能,但是合约可以访问这里的数据;举个例子,如果一个合约是在一个区块链上提供域名注册服务的,那么它就会想把这数据字段中的数据解析成2个字段,第一个字段是域名,第二个字段是域名对应的IP地址。这个合约会从数据字段中读取这些值,然后适当把它们保存下来

   拒绝攻击

      这个 STARTGAS 和 GASPRICE 字段 是以太坊的预防拒绝式攻击用的,非常重要。
为了防止在代码中出现意外或敌对的无限循环或其他计算浪费,每个交易都需要设置一个限制,以限制它的计算总步骤是一个明确的值。这计算的基本单位是“汽油(gas)”; 
通常,一个计算成本是一个1 滴汽油,但是一些操作需要消耗更多的汽油,因为它们的计算成本更高。在交易数据中每一个字节需要消耗5滴汽油。
这样做的目的是为了让攻击者为他们所消耗的每一种资源,包括计算,带宽和存储支付费用;
所以消耗网络资源越多,则交易成本就越大。

消息

    合约有能力向其他合约发生“消息”。消息是虚拟的对象,它从来不会被序列化,而且只存在于以太坊的执行环境中。
一个消息包含以下内容:
  1.消息的发送者 (隐式)
  2.消息的接收者
  3.与消息一起传送的以太币的数量
  4.一个可选的数据字段
   5.一个 STARTGAS 值


从本质上说,一个消息就像一个交易, 只是它是由一个合约产生的而不是一个外部用户
一个正在执行代码的合约,当执行到 CALL 代码时,会产生并执行一个消息。就像一个交易,一个消息会导致接收方的账户运行它的代码。因此,合约之间是可以互相发生作用的

合约代码

以太坊的合约代码是用底层的基于堆栈的字节码语言来编写的,被称为 “以太坊虚拟机代码” or “EVM 代码”。这代码有一系列的字节组成,其中每一个字节都标识一个操作。这些操作有三种类型的空间可用于存储数据:
 堆栈, 一种后进先出的容器
 内存, 一种无线扩展的字节数组
 合约的持久化 存储, 一种键值对的方式. 不像堆栈和内存,计算结束后将会被重置, 存储将长期保存。

区块链和挖矿

以太坊和比特币在区块链体系中最重要的不同点是:
以太坊的区块同时包含了交易列表和最近区块的状态。
除此之外,2个其他的值,区块的编号和难度值也存在在区块中
以太坊中最基本的区块验证算法如下:
1. 检查上一个区块是否存在和其有效性。
2. 检测这区块的时间戳,是不是比上一个区块的大,并且小于15分钟
3. 检查这区块编号,难度值,交易根(transaction root) , 叔根(uncle root)和汽油限制是否有效
4. 检查这区块的工作证明是否有效
5. 把 S[0] 设置成上一个区块的末端的状态
6. 让 TX 成为这区块的交易列表,如果有 n 个交易。则做for循环 For i in 0...n-1, 设置 S[i+1] = APPLY(S[i],TX[i]). 如果任何一个应用发生错误,或这区块中汽油的总的消耗达到了 GASLIMIT, 则返回一个错误.
7. 让 S_FINAL 等于 S[n], 但是把支付给矿工的奖励添加到这区块里。
8. 检查这个状态 S_FINAL 的默克尔树树根是不是和区块头信息中所提供的状态根是一样的。如果是,则区块有效,不然则无效。
乍看上去,这种方法似乎效率很低,因为它需要将整个状态存储在每个块中,
但在现实中,效率应该与比特币相当。
原因在于,状态存储在树结构中,并且每个块后,只需要修改树的一小部分。此外,由于所有的状态信息都是最后一个区块的一部分,所以不需要存储整个区块链的历史——这一策略,如果它可以应用于比特币,那么它的磁盘空间将节省5-20倍

应用

以太坊框架本身并没有什么特别的功能。就好像 程序语言一样,它做什么,都是由企业或开发者自己来决定的。
比特币可以让用户不通过第三方机构,如银行,政府等就可以直接兑换货币。


一般来说,在以太坊上有三种类型的应用。
第一种是金融应用,这包括 子货币,金融衍生品,套期保值合约,和一些雇佣合同等。
第二类是半金融应用,这里有钱的存在但也有很重的非金钱的方面;
最后,还有在线投票和去中心化治理这样的完全的非金融应用。

猜你喜欢

转载自blog.csdn.net/fk002008/article/details/80304243