主页 > 最新imtoken官方下载 > 区块链-以太坊笔记

区块链-以太坊笔记

最新imtoken官方下载 2023-09-10 05:11:21

比特币系统:基于交易

以太坊:基于账户(160位,即40个十六进制数),对双花攻击有天然防御,无需解释币种来源

帐户:

1)外部账户:账户余额(blance),交易次数(nouce:用于防止重放攻击,每次检查交易是否执行过)

1)合约账户:不能直接发布交易,一个合约可以调用另一个合约,除了账户余额和交易次数,还有代码(code)和存储状态(storge)

以太坊的数据结构:

1)状态树:键值对的映射,address --> state(key, value),state经过RLP编码序列化(Recursive Length Prefix: only nested array of bytes is supported)稍后保存

前缀树(trie)

特点:1、因为是40位的十六进制数(0~f),所以每个节点的分叉数最多为17(16个分叉+一个表示结束的标志,表示这个位置的分叉是否应该账户地址结束)

2、address()的查找效率与地址的长度有关

3.Trie不会碰撞

4.任意账户插入状态树,最终状态树是唯一的

5、更新操作的本地化更好。 例如,要更新一个账户的状态,只需要访问状态树中该账户对应的分支即可。

缺点:浪费内存

Compressed prefix tree (Patricia trie):路径压缩前缀树

Merkle Patricia trie:带有哈希指针的压缩前缀树,可用于在交易过程中证明账户中有多少钱

以太坊中使用修改后的压缩前缀树(Modified MPT):

比特币客户端使用_比特币分叉会影响比特币价格吗_比特币使用了哪种函数

区块链上每个区块的状态树是共享的,当状态发生变化时只需要修改某些账户状态,而状态没有发生变化的账户一般是指上一个区块状态树上对应的账户

合约账户的存储也使用了一个小型MPT

历史状态必须保存在区块链上。 目的是保证回滚操作的正常进行。 因为智能合约的存在,无法保存历史状态,无法进行回滚操作。

状态树包含每个账户的状态

比特币使用了哪种函数_比特币客户端使用_比特币分叉会影响比特币价格吗

交易树是由一个区块中的所有交易组成的树,可以用来证明一个交易被打包进了区块

Bloom filter:用于支持复杂的搜索方式(比如找到与智能合约相关的所有交易,通过几组哈希函数将所有交易映射到哈希表,直接在哈希表中搜索相关交易)

特点:误报,比如在集合中搜索一个元素,该元素肯定在集合中找到,但可能有其他元素映射到与该元素相同的地址,造成误报。

缺点:普通的bloom filter不能进行删除操作,因为hash冲突可能会有多个元素被删除

每笔交易执行后,都会有一张收据,收据中包含布隆过滤器,布隆过滤器包含类型、地址等信息

发布的区块在其区块头中有一个total bloom filter比特币使用了哪种函数,它是所有交易中bloom filter的并集

状态树、交易树、收据树的根哈希值都包含在区块头中

以太坊的运行过程可以看作是一个交易驱动状态机(transaction-drive state mechine)

GHOST协议

以太坊的出块时间已经缩短到十几秒,所以几个节点可能同时拥有记账权,同时拥有最长的合法链。 由于大型矿池的出现,部分节点区块可能会白挖,出现大型矿池收益大于其算力的情况。

以太坊最初是这样解决问题的:

例如链上同时出现三个分叉,其中一个分叉获胜,即其区块后有新的区块连接(已成为最长合法链),则另外两个区块为the winning blocks 后连接的新区块的叔块(叔块,一个块最多只能有两个叔块),两个叔块都可以获得(区块奖励*7/8)收益,新块只需要有一个叔块可以获得额外的(1/32 * 块奖励),最多可以有两个叔块,即一个块最多可以获得(2/32 * 块奖励)的额外收益。一个新块必须包含一个叔块以获得额外的块奖励。 如果一个区块没有叔块,则不会有额外的区块奖励

设计主要是为了鼓励区块链出现分叉后及时合并

改进:1、一个区块最多可以有两个叔块,一个叔块的额外奖励为(1/32*区块奖励)

2、一个区块只对7代以内的叔块有效,即一个区块最多只能有6级(代)的叔块,距离该块最近的叔块在后代块中包含的越远( 7/8 * 区块奖励)是从写入的区块开始,收益依次递减,第二个叔块只能得到(6/8 * 区块奖励),...,得到最远的叔块是仅(2/8 * 区块奖励)。 也就是说,如果同时出现两个以上的叔块,如果它们没有被包含在最近的后代块中,它们也可以被包含在后代块的后代块中。

链节点在区块上获得的所有收益=区块奖励+gas费//发布智能合约需要gas费,执行智能合约的矿工将获得gas费)

以太坊的区块奖励不同于比特币。 比特币的区块奖励会定期减半,最终趋于0,而以太坊的区块奖励与挖矿难度的调整有关。

只有分叉后的第一个区块才能获得叔叔奖励

挖矿算法

ASIC矿机:与普通电脑相比,算力强,但内存访问性能没有太大优势

Litecoin:设计初衷是ASIC Resistance,memory hard mining puzzle(增加puzzle对内存访问的需求),它的puzzle是基于scrypt(一种hash函数)

挖矿过程:先填数组:根据一个seed,取hash并生成一个伪随机数填入数组的第一个位置,后面的位置通过前面位置的值哈希得到。 关联,可以验证。 以伪随机顺序读取数组的元素进行哈希。首先读取数组中的一个元素,然后迭代更新数字得到下一个要读取的位置,再迭代更新该位置的数字得到下一个位置待读

比特币分叉会影响比特币价格吗_比特币客户端使用_比特币使用了哪种函数

与比特币的区别:它的出块速度是比特币的4倍,puzzle的计算方式不同(很多puzzle)

比特币谜题的设计思路:解难难,验证容易。

缺点:挖矿节点必须保存缓存以便于读取操作,轻节点也必须保存缓存以进行验证操作。 为了兼顾轻节点,其缓存的实际大小仅为128k,ASIC Resistance并未完全实现。

以太坊:

缓存:初始大小为16M。 首先通过扫描区块头生成一个seed种子,计算出seed的hash值放入缓存的第一个位置。 在缓存中,每个值都是通过对前一个值进行哈希计算得到的,例如第二个位置的值是通过对第一个位置的值进行哈希计算得到的,并且缓存中的值具有依赖性,并且值填充缓存的每个位置依次计算。 每 30,000 个区块将重新生成种子,并重新生成缓存。 缓存的大小也会增加原来缓存的1/128,即128k

dataset:初始大小为1G,dataset基于缓存生成。 先从缓存中读取一个数,通过哈希值计算出下一个要读取的位置,所以读取缓存中的256个数后得到的哈希值存储在数据集的第一个位置,数据集中的其他位置numbers是读取缓存中的256个数字后生成的hash值,数据集就是通过这样的操作生成的。 计算拼图时,使用数据集代替缓存,每30000个区块更新一次数据集,同时增加原始数据集的1/128,即8M

挖矿过程:通过区块头中的nonce值计算出一个初始哈希值,映射到数据集中的一个位置,同时读取下一个相邻位置的元素,即每次映射读取两个元素,通过计算映射位置,得到下一个要读取的位置,同时读取其相邻元素。 这个循环重复64次,即读取128个数字,最后得到一个哈希值,然后与拼图的目标阈值进行比较。 如果不满足目标阈值,则替换区块头中的nonce,然后执行上述操作,直到找到满足目标阈值的nonce。

数据集用于挖掘,缓存用于验证。 这样设计的原因是为了方便只存储缓存的轻节点验证区块的正确性(验证时使用缓存生成数据集对应位置的哈希值)

难度调整

比特币分叉会影响比特币价格吗_比特币使用了哪种函数_比特币客户端使用

比特币客户端使用_比特币使用了哪种函数_比特币分叉会影响比特币价格吗

比特币客户端使用_比特币分叉会影响比特币价格吗_比特币使用了哪种函数

股权证明

目前,比特币和以太坊都是基于工作量证明。 POS 的一大痛点是挖矿需要耗电。

基于权益证明(proof of stake):将部分货币预留给开发者,出售部分货币以获得加密货币开发所需的资金,其共识机制是基于拥有的货币数量由个人投票,这是一个虚拟挖矿过程(virtual mining),减少能源消耗和环境影响。这种股权证明类似于股份公司

在基于工作量证明的系统中,可以通过购买大量的挖矿设备来增加算力,并攻击相应的系统,尤其是对于刚刚诞生的新货币(AltCoin)来说,这种攻击(Infanticide)是一场灾难然而,在基于权益证明的系统中,如果一个节点想要发起恶意攻击,首先必须购买大量的货币,这将导致这种加密货币的升值,恶意节点将支付更大的价格。 这对开发人员来说不一定是坏事。

POS 和 POW 并不相互排斥,以太坊未来的发展方向是采用 POS+PSW 的模式。

POS+POW早期设计方式:挖矿难度与持币量有关,持币越多,挖矿难度越低,即可以通过注币降低挖矿难度。 规定挖矿难度降低后,注入的币需要一段时间,或者某个区块才能再次使用(存款证明)。 这个规定主要是为了限制持有大量币种的节点,保证相对公平的挖矿。 但是,这种设计方式遇到的一个问题是,当一个分叉产生时,节点在一个分叉上使用货币降低难度后,这部分货币在分叉上被冻结,而在另一个分叉上则没有。 可以重复使用,节点在分叉发生的地方存在“两面下注”(没有任何利害关系)的现象,即在两个分叉上都挖矿。

Casper the Friendly Finality Gadget (FFG) 以太坊过渡阶段:POW+POS 节点仍需挖矿,但挖出100个区块后,需要Finality来确定最长的合法链

验证者:节点通过提交部分以太币作为保证金成为验证者。 验证者的存在是为了推动系统达成共识,通过投票决定哪条链是最长的合法链,投票的权重与充值数量成正比

具体过程:

两阶段提交: 1、准备消息; 2、提交消息

比特币使用了哪种函数_比特币分叉会影响比特币价格吗_比特币客户端使用

1、每50个区块为一个epoch,进行投票。 前一个epoch是下一个epoch的prepare message,后者是前者的commit message

2.连续两个epoch获得2/3的选票,证明验证有效

3. 经过两轮投票,确定最终最长合法链

如果验证人因行政不作为和延迟投票而未能及时达成共识,将扣除验证人的部分保证金

如果验证者胡乱投票给两个冲突的分叉,验证者将被没收所有保证金,被没收的保证金将被销毁

验证人有任期。 期限届满后,有一段时间的等待期。 等待其他节点报告验证者是否有不良行为并进行惩罚。 等待期结束后,如果没有问题,验证者可以取回自己的保证金和相应的奖励

EOS 权益证明:委托权益证明

智能合约

合同调用

交易只能由外部账户发起,合约账户不能自己发起交易。因此,合约账户合约中的函数是由外部账户调用的。 具体调用了合约账户中的哪个函数在交易的数据字段(data field)中有说明

一个合约调用另一个合约中的函数

一、需要外部账户发起交易,调用合约,合约调用另一个合约中的函数

一个合约如何调用另一个合约

1.直接调用

比如合约B调用合约A,在合约A中定义一个事件,在合约A的函数中使用emit调用事件

B合约中的函数以A合约的地址为参数,首先生成A合约的实例,通过该实例调用A合约中的函数,从而触发A合约中的事件,完成调用

缺点:采用这种调用方式,如果在合约A中的函数调用执行过程中出现错误,合约B中的函数也会抛出异常,本次调用将被回滚

2.使用地址类型的调用函数:调用函数的第一个参数是被调用函数的签名,第二个参数是被调用函数的参数

e.gaddress.call(parameter 1, parameter 2) //address为合约A的地址

这种调用方式相当于切换到合约A的环境变量进行函数调用。 如果合约A中的函数调用失败,调用将返回false,不影响合约B中函数的执行。

3.代理调用delegatecall()

使用方法和call()一样,不同的是不需要切换到合约A的上下文

比特币分叉会影响比特币价格吗_比特币使用了哪种函数_比特币客户端使用

合约账户若要能够接收外部转账,必须标记为应付账款

eg 如果你在合约账户中调用一个函数将以太币转入合约账户,如果这个函数没有被标记为payable,就会抛出异常

fallback() 函数

它在两种情况下被调用:

1.直接转账到一个合约地址,不添加任何数据(即data字段不指定调用哪个函数)

2.调用的函数不存在

如果转账金额不为0,还需要标记payable,否则调用该函数会抛出异常

fallback()函数不一定要定义,但是如果有以上两种情况,没有定义fallback函数,调用会抛出异常

智能合约的创建和运行

智能合约的代码写好后,编译成字节码

外部账户向0X0地址发起转账交易,转账金额为0,但需要支付gas费,智能合约代码放在data字段,然后将交易发布到区块链上

缺点:智能合约的规则是由代码的逻辑决定的。 一旦在区块链上发布,任何人都无法更改。 但是,一旦智能合约设计不好,出现BUG,就没有办法修正智能合约

智能合约运行在 EVM 上

智能合约定义了每单位汽油的价格(Price)和合约愿意支付的最大汽油量(GasLimit)。 合约执行时,先扣除合约愿意支付的最大gas费。 合约执行后,计算实际消耗。 gas费,如果gas费剩余,会退还,如果gas费不够,会引起回滚操作。这个方法解决了智能合约中可能出现的死循环问题

事务是原子的:要么全部执行,如果事务过程中抛出异常,则回退到事务执行前

若智能合约执行过程中出现异常,执行合约消耗的gas费不予退还

错误处理

assert(bool conditon) //条件不满足,抛出错误——针对内部错误

require(bool condition) //条件不满足,抛出错误——针对输入和外部组件引起的错误

revert() //无条件终止操作并执行回滚操作

区块头中的GasLimit是指区块内所有交易可以消耗的gas费上限比特币使用了哪种函数,相当于在比特币系统中限制一个区块的大小不超过1M,用于限制以太坊中区块的资源分配。 消耗

矿工释放区块时可以在前一个区块的GasLimit基础上增加或减少1/1024

比特币客户端使用_比特币使用了哪种函数_比特币分叉会影响比特币价格吗

每个全节点在本地维护状态树、交易树和回执树。 在执行智能合约时,每个全节点运行智能合约,并从自己维护的本地状态树中扣除最大gas费。

每个新区块发布后,全节点执行新区块并更新其本地三棵树

挖矿的过程是先执行交易,包括交易中的智能合约,得到完整的区块头,然后进行挖矿,即计算nouce值

矿工在挖矿时需要消耗资源来执行智能合约,但执行智能合约的gas费只能由挖矿的矿工获得。 补偿

发布在区块链上的交易不一定执行成功,因为如果交易包含智能合约,需要扣除gas费,交易必须发布在区块链上才能获得gas费。receipt tree上的Status字段会识别交易的执行状态

智能合约转账

比特币分叉会影响比特币价格吗_比特币使用了哪种函数_比特币客户端使用

比特币使用了哪种函数_比特币客户端使用_比特币分叉会影响比特币价格吗

transfer 和 send 都是专门用来转账的函数。 不同的是调用transfer函数出错会抛出异常导致回滚操作,而send函数会返回false,不会影响调用该函数的合约执行。

call操作的本义是进行函数调用,但也可用于调用操作。 不同的是,transfer 和 send 函数只发送 2300 gas 费,而 call 函数发送合约的所有 gas 费

智能合约不支持多线程并发执行

The DAO:一个分散的类似众筹的组织

用户向The DAO发送Ether换取代币,The DAO获得收益后回馈给相应的用户

由于The DAO的代码逻辑存在漏洞,黑客发起了重入攻击,并从中盗取了大量ETH。 幸运的是,The DAO 中的 ETH 需要 28 天才能转入黑客的账户。 以太坊开发社区采取补救行动的时候到了。

补救:

1.采用软分叉,发布软件升级。 所有与 The DAO 相关的账户地址都不能进行任何交易。 是在将交易发布到区块链之前检查交易是否合法。 不幸的是,这个检查交易是否合法的过程是不收取任何gas费用的。 许多矿工升级软件后,收到大量非法交易。 检查交易的过程会浪费矿工的资源,所以很多矿工回到软件升级前的版本。 第一次修复失败。

2. 发布软件升级,创建新的智能合约,强制将The DAO中的所有资金转移到这个新的智能合约中。 此转账交易不需要合法签名,此智能合约会将钱返还给 The DAO 中的每个账户。 但部分用户不认同以太坊开发社区干预区块链,编写智能合约(无签名)),这些用户不认同这种补救措施,即不认同与区块链相关的区块转账交易(没有合法签名,属于非法交易),最终导致硬分叉,以太坊分裂成两条链,执行这笔转账交易的链是ETH,持不同意见的用户继续的链我的是 ETC(经典以太坊)。

美容连锁

USChain是一个部署在以太坊上的智能合约(交易所),它有自己的代币,可以与以太坊兑换,可以在USChain有自己的代币账户接收代币。

类比场景:公司发给每位员工等量的工资。 公司是发送方,每个员工都是接收方。 发送者首先计算要发送的工资总额:账户=员工人数*要发送给每个员工的金额(值),并确定他的余额足以支付工资。 最后两步,1)从自己的余额中减去待发工资(账户)的金额; 2)支付给每个员工的工资(值)

漏洞:由于计算account时的乘法运算,可能会出现overflow,即计算出来的account会变成一个很小的值。 这样一来,每个员工都拿到了相应的工资,但公司的总量并没有减少。 类似于区块链系统中代币数量凭空增加。

解决方案:不要直接使用乘法运算,而是调用Solidity的SafeMath库中的函数进行计算,进行溢出检查。