- 个人主页: 同学来啦
- 版权: 本文由【同学来啦】原创、在CSDN首发、需要转载请联系博主
- 如果文章对你有帮助,欢迎关注、点赞、收藏和订阅专栏哦
文章目录
- 一、Ethereum总体架构
- 二、区块
-
- 三、账户
-
- 1、外部账户
- 2、合约账户
- 3、公钥和私钥
- 4、钱包
- 四、数据结构与存储
-
- 1、数据组织形式
-
- 1.1 Merkle
- 1.2 Trie
- 1.3 MPT
- 1.4 状态树
- 1.5 交易树
- 1.6 收据树
- 1.7 数据库LevelDB
- 五、共识机制
-
- 六、交易
-
- 七、数据编码与压缩
- 八、API
- 九、域名服务(ENS)
一、Ethereum总体架构
Ethereum总体架构包括底层服务、核心层、顶层应用等三层。
- 底层服务:包括P2P网络、LevelDB、密码学算法以及分片优化等基础服务;
- 核心层:区块链、共识算法和虚拟机等核心元件;
- 顶层应用:API接口、智能合约及去中心化应用(DApp)。
二、区块
所谓的区块,其实可以定义为记录一段时间内发生的交易和状态结果的数据结构,是对当前账本状态的一次共识。
区块 = 区块头 + 交易列表 + 叔区块头,区块结构如下图所示。
1、区块头
区块头 = 父块散列值(Prev Hash) + 叔块散列值(Uncles Hash)+ 状态树根散列值(state Root)+ 交易树根散列值(Transaction Root)+ 收据树根散列值(Receipt Root)+时间戳(Timestamp)+随机数(Nonce)
Ethereum区块链区块数据结构的重要改变是 区块头中加入三棵Merkle树,即状态树、交易树和收据树。
2、交易列表
交易列表是由矿工从交易池中选择收入区块中的一系列交易。
3、叔区块
不在主链上的且被主链上的区块通过Uncles 字段收留进区块链的孤块叫做“叔区块” 。
三、账户
账户以地址为索引,地址由公钥衍生(取公钥的后20字节),分为外部账户(EOA)和合约账户,两种账户统称为“状态对象”(存储状态),外部账户存储以太币余额状态,而合约账户除了余额还有智能合约及其变量的状态。
一个账户包含四个部分:
- 该地址交易次数(抵制重防攻击)
- 余额
- 合约的二进制代码(合约账户才有)
- 账户的存储(默认为空)
1、外部账户
- 由用户创建,可存储以太币,由公钥和私钥控制,是由用户实际控制的账户。
- 生成外部账户的三步:
①设置账户私钥,通常意义的用户密码;
②使用加密算法由私钥生成对应的公钥(secp256k1椭圆密码算法);
③根据公钥得到地址(公钥的后20字节)。
- 私钥是用户掌控账户的唯一依据,需经常备份。
2、合约账户
- 由外部账户创建,是包含合约代码的账户,不由私钥文件直接控制,由合约代码控制;
- 合约账户的地址由合约创建时合约创建者的地址,以及该地址发出的交易共同计算得出;
- Ethereum区块链上的所有操作都是根据账户发出的交易来执行的,当合约账户收到一条交易消息时,其合约代码将被作为交易输入执行,也将被每一个节点执行,并将执行结果作为新块验证的一部分。
3、公钥和私钥
目前私钥的三种形态:
- Private key:随机生成的256位二进制数字;
- Keystore & Password:Ethereum官方钱包中,公钥和私钥加密保存为JSON文件,存放在keystore文件夹中;
- Memonic Code:BIP39提出,随机生成12~24个比较容易记住的单词,根据函数创建出随机种子,再根据某种方式生成确定性钱包(Metamask使用)。
4、钱包
钱包包括Mist、Parity和Etherwall等类型。
四、数据结构与存储
1、数据组织形式
Ethereum使用Merkle Parircia Trie 树(MPT),加密认证的数据结构,融合Merkle树和Trie树两种数据结构。
1.1 Merkle
- 树形数据结构,可二叉,可多叉。由一组叶节点、一组中间节点和一个根结点组成;
- 最下面的叶节点包含基础数据,每个中间节点是它的子节点的散列,根结点是它的子节点的散列;
- 如果在树的底部有恶意篡改和加入,将引起树上部甚至根的改动。
1.2 Trie
- key代表的是从树根到对应value的一条真实路径;
- 如果有两个value,他们有着基于相同前缀的key,他们相同前缀的长度占自身比例越大,则代表着这两个value在树中的位置靠的越近,并且Trie树中不会有像散列表一样的冲突,一个key永远只对应一个value。
1.3 MPT
- Ethereum基于Merkle、Trie,使用MPT
- 每个节点通过它的散列值被引用,用于LevelDB中的查询
- 对于存储在LevelDB中的非叶节点,其在数据库中的表现形式为:key代表节点的RLP编码的SHA3散列值,value是节点的RLP编码,即k-v:Hash(RLP(节点))-RLP(节点)
MPT 4种节点类型:
①空节点
②叶节点:键值对的一个列表,key是特殊的十六进制编码,value是RLP编码
③扩展节点:键值对的列表,但这里的value是其他节点的散列值,通过这个散列值连接到其他节点
④分支节点:一个长度为17的列表。既可以是搜索路径的终止,也可以是路径的中间节点
下图以状态树为例
1.4 状态树
- 每个节点有16个孩子节点,每个叶节点表示一个账户;
- key是账户地址,value是账户内容,包括「nonce、balance、codeHash、storageRoot」。
1.5 交易树
- 每个区块有独立的交易树;
- key是交易编号,value是交易内容。
1.6 收据树
- 每个区块有独立的收据树,不需要更新,代表每笔交易相应的收据;
- key是索引编号,用来指引这条收据相关交易的位置,value是收据的内容。
1.7 数据库LevelDB
Ethereum共三个LevelDB数据库:
- BlockDB:区块的主体内容为块头+交易;
- StateDB:账户的状态数据;
- ExtrasDB:收据和其他辅助信息。
五、共识机制
1、Ethash
- 抵制ASIC;
- 让挖矿者从区块链状态中获取随机数据,计算一些从区块链最后的N个区块中随机选择的交易,返回其散列。实际上是从一个根据历史信息生成的搜索空间中,通过散列计算选取符合条件的散列值,因此不再是简单的哈希运算,还需要有足够的内存空间;
- 过渡到PoS。
2、Casper
基于网络参与者目前所持有的数字货币的数量和时间进行利益分配,引入币龄概念,有效地址51%攻击能达到秒级的共识,几秒出一个块
加入了惩罚机制,通过交押金的方式,好块则收益,坏块则失去押金。
六、交易
交易是指一条外部账户发送到区块链上另一账户的消息的签名数据包,包含发送者的签名、接受者的地址以及发送者转移给接受者的以太币数量等内容。
1、交易费用
- 防止用户在公链中发送太多无意义交易,浪费计算资源;
- Gas是用来衡量一笔交易所消耗的计算资源的基本单位;
- Gas Price是Gas的单位,目前比较稳定,但可根据需求自由浮动,Gas Price*Gas越高,交易被处理得越快;
- Gas Limit表示发送者愿意为这笔交易执行所支付的最大Gas数量,保护用户免受错误代码影响导致消耗过多的交易费。
2、交易内容
交易可以是简单的以太币转账,也可以是包含智能合约代码的消息
包含如下内容:
- from
- to
- value
- data:存在的数据字段,代表交易是一个创建或调用智能合约交易
- Gas Limit
- Gas Price
- nonce
- hash
- r、s、v:交易签名的三个部分,由发送者的私钥对交易hash进行签名生成
3、交易类型
- 转账交易;
- 创建智能合约的交易;
- 执行智能合约的交易。
七、数据编码与压缩
RLP用于编码任意的具有嵌套结构的二进制数据,是Ethereum数据序列化的主要方法区块、交易等数据结构先经过RLP编码处理,再存储到数据库。
八、API
- JSON-RPC API
- Web3.JavaScript API
九、域名服务(ENS)
- 三个主要构件:注册表、解析器、注册服务;
- 通过竞拍获得名称;
- 不会产生收益,所有资金作为保证金或被销毁。