01.以太坊整体架构
以太坊是一个区块链应用平台。
分为三层:
- 底层服务
- 核心层
- 顶层应用
02.区块
-
区块链是比特币使用的底层技术架构。
-
他本身是一串连续的数据区块,区块之间的连接指针是区块头散列指针,他们是使用密码学散列算法生成的。
-
区块本质上就是一个数据包,比特币的交易记录会保存在区块中,大约每10分钟生成一个新的区块。
-
所谓区块:可以定义为记录一段时间内发生的交易和状态的结果的数据结构。是对当前账本状态的一次共识。
-
比特币的每个数据区块一般包含区块头(Header)和区块体(Body)两部分。
- 区块头封装了前一个区块的散列值(Prev_Hash),时间戳(Timestamp),随机数(Nonce),Merkle树的根值(Tx_Root)和当前区块的散列值等信息。
- 区块体中则主要包含交易技术和交易详情。
-
-
每笔交易都被永久的记录在区块中,任何人都可以查询。交易是通过Merkle树的数据结果记录的。其中没仪表交易都包含了数字签名,如此可以保证每一笔交易都不伪造,不能篡改。所有的交易过程都将通过Merkle树的hash过程生成一个唯一的Tx-Root记录到区块中。
-
用户在验证区块的有效性时,只需根据Merkle树的Hash方法计算出根值并且与区块中Tx_Root进行比较,即可验证真伪,若相同及有效,若不同则无效。
03.区块 ——以太坊
-
去开主要由区块头,交易列表,和叔区块三部分组成。
- 区块头:
- 父块的散列值(PrevHash)
- 叔区块的散列值(Uncles Hash)
- 状态树根散列值(stateRoot)
- 交易树根散列值(Transaction Root)
- 收据树根散列值(Receipt Root)
- 时间戳(Timestamp)
- 随机数(Nonce)
- 以太坊区块链上区块数据结构的一个重要改变就是保存了三棵Merkle树根
- 状态树
- 交易树
- 收据树
- 区块头:
-
存储三棵树可以方便账户做更多查询
-
交易列表是由矿工从交易池选择收入区块中的一系列交易
-
区块链上的第一个区块称为“创世区块”
-
区块链上除了创世区块意外每个区块都有他的父区块,这些区块连接起来组成一个区块链
-
以太坊大约每15s可以挖出一个新的区块
-
以太坊区块结构中状态树的更新
04.账户
- 账户以地址为索引,地址由公钥衍生而来,取公钥的最后20字节
- 两种类型的账户
- 外部账户
- 简称账户,他们都是由人创建,可以储存以太币
- 合约账户
- 合约账户是由外部账户创建的账户
- 以太坊中这两中账户统称为“状态对象”(存储状态)
- 外部账户储存以太币余额状态
- 合约庄户除了余额还有智能合约以及其变量的状态
通过交易的执行,这行状态对象发生变化,而Merkle树用户索引和状态对象的更新。
- 外部账户
一个以太坊的账户包含四个部分
- 该地址交易的次数,他是用于保障被一笔交易能且被处理一次的计数器,有效避免重放攻击
- 账户目前的以太币余额
- 账户的合约二进制代码(合约账户)
- 账户的储存(默认为空)
4.1 外部账户
- 外部账户(EOA)由私钥来控制,是由用户实际控制的账户
- 每个外部账户拥有一对公私钥,这对密钥用于签署交易,他的地址由公钥决定。
- 外部账户不能包含以太坊虚拟机(EVM)代码
我们可以做一个简单的对比,把外部账户看做用户在某个银行办理的一个账户,公钥就是用户为该账户设置的卡号,而私钥则是用户设置的密码。
一个外部账户具有以下特性:
-
拥有一定的账户余额
-
可以发送交易
-
通过私钥控制
-
以及没有相关的代码
-
用户在创建好战鼓后一定要记住私钥!如果用户忘记了,那你就滚吧。不可能不滚的。
-
秘钥通常保存在keystore目录下, 用户可以经常性的备份密钥文件,以防止忘记或者丢失
-
在以太坊节点之间传递整个目录后者密钥文件是安全的。但是账户的顺序可能会发生比改变。
-
用户需确保不要依赖或者更改脚本和代码段中的索引。用户自己列出自己创建的账户时,账户汇按字典排序,并且按照账户的创建时间先后排序
4.2 合约账户
- 合约账户是一个包含合约代码的账户
- 合约账户不是由私钥文件直接控制,而是由合约代码控制的
- 合约账户的地址是由合约创建时合约创建者的地址,以及该地址发出的交易共同计算得出
- 一个合约账户具有下列特性:
- 拥有一定的以太币余额
- 有相关联的代码
- 代码通过交易或者其他合约发送的调用来激活。
- 当合约被执行时候,智能操作合约庄户拥有的特定储存。
- 合约账户和普通账户最大的不同就是他还存有智能合约
- 以太坊区块链上的所有操作都是根据都是根据从账户发出的交易来执行的。
- 每当合约账户收到一条交易消息时,其他合约代码将被交易输入的参数调用执行。
- 而合约代码将会在参与到网络中的每一个节点上执行,并将执行结果作为新区块验证的一部分
4.3 私钥和公钥
- 公钥加密
-公钥认证