数据结构论坛

首页 » 分类 » 定义 » 区块链note填坑FISCOBC
TUhjnbcbe - 2021/6/19 12:00:00

导语

《有关FISCOBCOS的有关概念-1》的填坑文章,将展开对交易的数据结构与执行流程的讲解。含有FISCOBCOS平台有关源码和相关数据结构分析。

鉴于本人是在校学生,水平有限,如有错误,欢迎指正。

Part.01

交易与智能合约部署流程总览

普通交易(如转账)或合约调用的过程:

1)发送交易请求。客户端(用户A)按照格式要求在以太坊网络中发起一个交易请求,该请求被传向用户A的对等节点,如下图所示:

2)交易请求验证和广播交易。以太坊网络上的节点(用户B)同步到此交易,检查交易签名是否合法:

a.若非法,则丢弃。

b.若一笔交易合法,则节点会进一步检查该交易是否重复出现过。

i.若出现过,即另一笔来自同一发送者且有相同nonce的交易。则原本待处理的(pending)的交易可能被新交易替换(replace)。

ii.若从未出现过,计算可能的最大交易费用,确定发送方的地址,并在本地的区块链上查看发送者的余额并减去相应的费用,如果账户余额不足,则返回错误,这条交易废弃。对符合要求的交易请求,用户B将其放在交易池中。其他收到交易请求的节点重复用户B的处理过程。如下图所示:

3)记账节点(可以当做矿工)打包交易成区块、执行交易区块和广播区块。若交易池中有交易时,矿工(Sealer线程)负责从交易池中按照先进先出的顺序取出一定数量的交易,组装成待共识区块,随后待共识区块会被发往各个节点进行处理,并且转发给其他节点。

节点在收到区块后,会调用区块验证器把交易从区块中逐一拿出来执行。

a.对于转账交易,获得记账权的节点将该交易和其他交易一起打包到区块中;

b.对于合约交易,矿工将该交易和其他交易一起打包到区块中,并在本地的EVM上运行被调用的合约代码,直到代码运行结束或Gas用完。

i.如果代码并未结束而Gas已经用完,那么代码运行而改变的状态会回滚到代码运行之前,但是已经支付的交易费用不可收回,交易费用有获得记账权的矿工获得。

ii.如果代码运行结束Gas还有剩余,那么矿工也只会获得消耗GasxGasPrice作为手续费,不会收取剩余Gas对应的手续费。交易执行的结果和状态会封装在交易回执(收据)中返回。如下图所示:

4)区块广播。用户B把包含用户A的交易请求的区块发送至对等节点,并在全网传播。如下图所示。

5)交易共识。区块链要求节点间就区块的执行结果达成一致才能出块。其他节点收到该区块后,验证区块,如果区块通过验证,节点将交易池中原来用户A的交易请求删除,同时同步该区块,将其添加到本地的区块链中。对于区块中的执行智能合约的交易,其他节点会在本地的EVM上运行该智能合约,并互相验证运行的结果。如下图所示。

插个(羞~〃?〃):FISCOBCOS中一般采用PBFT算法保证整个系统的一致性,其大概流程是:各个节点先独立执行相同的区块,随后节点间交换各自的执行结果,如果发现超过2/3的节点都得出了相同的执行结果,那说明这个区块在大多数节点上取得了一致,节点便会开始出块。

通过上面五个步骤,整个交易的过程已经结束。但是一般来说,当包含交易的区块链被同步到区块链后,出于安全性的需求,还需要再挖掘一些块,这笔交易才能算是真正地被确认。

智能合约部署过程

回顾一下上篇文章知识点:以太坊上两种账户类型:a.个人账户b.合约账户。

合约在部署时,就会创建一个合约账户,合约代码的可执行字节码(Bytecode)保存在合约账户(CA)中。具体来说就是存在账户codehash指向的存储区域;codeHash是代码的hash值,创建后不可更改。如下表格,是外部账户,即个人账户,在分布式存储数据库(AdvancedMassDatabase,AMDB,姑且先不纠结是什么数据库就当做是你熟悉的数据库)中的键值(key-value)存储形式

keyvaluebalancenoncecodealive

1)合约创建,发送创建智能合约请求。发送者(用户A)按照一定的格式要求,在以太坊中发起一个创建智能合约的交易(transaction)请求(这里以solidify预言编写智能合约),客户端会填补accountnonce(tx计数器)、

1
查看完整版本: 区块链note填坑FISCOBC