关注

北大《区块链技术与应用》——笔记3(ETH)

一、以太坊概述

改进

提高性能:以太坊出块时间十几秒,为此设计了GHOST机制

mining puzzle:

对内存要求很高:ASIC resistance
proof of work -> proof of stake(2.0)
对智能合约的支持:smart contract

比特币:去中心化的货币
以太坊:增加了去中心化合约的支持
从技术手段做到不可能违约

去中心化的货币好处:跨国转账中比较方便,没有统一管辖权,大家都按照规则去执行。

智能合约的好处:代码发布到区块链上,大家都不可修改,必须按照规则执行。

二、ETH-帐户

BTC-要知道多少钱,根据UTXO进行推算;好处:隐私保护好

?比特币每次是生成新地址,那我的账户地址也要变?账户地址和新地址有什么区别?

比特币中转钱的时候需要说明钱的来源

比特币每次交易换一个新地址

以太坊采用基于账户的模型(跟现实中银行很相似)交易是否合法只需要看账户上钱够不够就行,转了后剩下的币也不用转给自己

比特币面临的一个主要挑战就是double spending attack

而以太坊对它有天然的防御作用:因为不用管币的来源,每花一次就直接扣掉。

以太坊中账户的余额是由全节点所维护的

replay attack(收钱的人不诚实)重放攻击:交易者把这个交易重放一遍,让交易的账户被扣两次钱;比特币中的双花攻击,是发钱的人不诚实。

加上nonce,表示转账次数。

重放这个交易就会失败。

以太坊中有两类账户:

  • externally owned account(外部账户):balance+nonce
  • smart contract account(合约账户):nonce+code+storage 不是通过公私钥对控制,不能主动发起交易

外部账户发起交易,调用合约账户。

合约账户如何被调用?创建合约时,会返回一个地址,调用过程中,code不会变,storage会发生变化。

为什么要设立这样一种新的模型?创始人vitalik

比特币基于交易的隐私保护比较好一些,但以太坊要支持的是智能合约,合约要求参与者有比较稳定的身份。(类似和别人签合同,突然冒出另一个人,说他是当时签合约的人)

financial derivative

三、ETH-数据结构

在以太坊中,有三棵树的说法,分别是状态树、收据树和交易树。

以太坊采用基于账户的模式,系统中显式记录每个账户的余额。而以太坊这样一个大型分布式系统中,是采用的什么样的数据结构来实现对这些数据的管理的。

在以太坊中,账户地址为160字节,表示为40个16进制数额。状态包含了余额(balance)、交易次数(nonce),合约账户中还包含了code(代码)、存储(stroge)。

比特币中的merkle tree,发新区块,构建一个merkle tree,区块里大概4000个

-以太坊中merkle tree 是要把所有账户构建成一个merkle tree,是否需要排序?不排序,没法证明nonce,构建出的不是唯一的。

-比特币为什么不用排序?获得记账权的节点说了算。如果没抢到记账权,做的决定无效

trie

在BTC和以太坊中,交易保存在区块内部,一个区块可以包含多个交易。通过区块构成区块链,而非交易。

实际中以太坊采取的数据结构:MPT

BTC系统中,虽然每个节点构建的Merkle Tree不一致(不排序),但最终是获得记账权的节点的Merkle Tree才是有效的。

实际上,在以太坊种使用的并非简单的PT(Patricia tree)压缩前缀树,而是MPT(Merkle Patricia tree)。

Merkle Tree 和 Binary Tree:
区块链和链表的区别在于区块链使用哈希指针,链表使用普通指针。
同样,Merkle Tree 相比 Binary Tree,也是普通指针换成了哈希指针。

所以,以太坊系统中可如此,将所有账户组织为一个经过路径压缩和排序的Merkle Tree,其根哈希值存储于block header中。BTC系统中只有一个交易组成的Merkle Tree,而以太坊中有三个(三棵树)。也就是说,在以太坊的block header中,存在有三个根哈希值。

根哈希值的用处:

防止篡改。

提供Merkle proof,可以证明账户余额,轻节点可以进行验证。

证明某个发生了交易的账户是否存在

以太坊中使用的MPT结构示意图

每次发布新区块,状态树中部分节点状态会改变。但改变并非在原地修改,而是新建一些分支,保留原本状态。如下图中,仅仅有新发生改变的节点才需要修改,其他未修改节点直接指向前一个区块中的对应节点。

 虽然每个区块都有一个状态树,但是这两棵树大部分节点都是共享的。

所以系统中每个全节点需要维护的不是一棵MPT,而是每次出现一个区块都要新建一个MPT,只不过这些状态树中大部分节点都是共享的,只有少数发生变化的节点需要新建分支。

Q:为什么要保留历史状态?实现回滚,智能合约执行后要回滚很难。

区块

转载自CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/weixin_50986471/article/details/156014403

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--