投资有风险 入市需谨慎
APP
下载火星财经客户端

扫描下载APP

微信公众号
火星财经二维码 火星财经

【技术篇】EOS 块数据结构:块内通信和跨链(一)

区块链研究实验室 ·

05月15日

热度: 169065

分析 EOS 中重要的数据结构 block,并解释 EOS 的两大优势:高效账户间通信和跨链机制。

timg (3).jpg

在之前的章节我们已经详细介绍如何让 EOS 在自己的本地跑起来以及智能合约编写、代币的发行。下面我们进入EOS块数据结构的详细讲解;

分析 EOS 中重要的数据结构 block,并解释 EOS 的两大优势:高效账户间通信和跨链机制。希望大家可以给多点时间学习和练习。

一、 块主要结构

「区块链研究实验室」EOS 块数据结构:块内通信和跨链(一)

block 是区块链中最重要的数据结构,EOS 在 block 结构中设计了 7 个参数,下面我们将一一进行分析解释。

previous

previous 为指向前一个区块的 hash 值,EOS 采用的 hash 算法是 SHA。

timestamp

timestamp 为时间戳,该区块的生成时间。

transaction_merkle_root

transaction_merkle_root 为该区块内所有交易的 merkle 根,用于快速验证交易的完整性。

producer

producer 为该区块的生成者。EOS 采用 DPOS 共识机制,预计每 3 秒生成一个区块。任何时刻,只有一个生成者被授权生成区块。

producer_changes

EOS 架构中区块的产生是以 21 个区块为一个周期,在每个出块周期开始前,21 个区块生成者会被投票选出。producer_change 就记录了未来的 21 个出块者。

producer_signature

producer_signature 是该区块的生成者对该区块的签名。EOS 采用的是 ECDSA签名算法,使用的椭圆曲线参数是 secp256k1。

cycles

EOS 设计的目标之一是使得两个账户(合约)能够在单个区块内来回交换消息(交易),而不必在每个消息之间等待 3 秒。为了实现这一点,EOS 将块内的消息分成了 cycle 来顺序处理。cycles 就是 cycle 的一个顺序向量,那么 A 发给 B的消息在 cycles[1]中处理,B 返回的消息就可以在后续的 cycles[4]中进行处理。区块生成器将不断把 cycle 添加到区块中,直到最长的区块时间间隔达到,或者没有新的可传送交易生成。

二、 Cycles 主要结构

前面提到了 EOS 为了提升消息交互的效率,在 block 中设计了 cycle 结构来实现了一条“小链”。而在 cycle 内部,EOS 设计了 threads 来实现消息、交易的快速并行处理。

「区块链研究实验室」EOS 块数据结构:块内通信和跨链(一)

相比较 cryptonomex 中的设计,EOS 的这种设计将更好的支持高并发管理,利于提升 EOS 的整体效率。

「区块链研究实验室」EOS 块数据结构:块内通信和跨链(一)

generated_input

generated_input 包含了一组 GeneratedTransaction 的 id,用于顺序查找和处理 GeneratedTransaction。我们将在后面对 transaction 的类别进行详细的解释和分析。这些 transaction 将被顺序处理。

user_input

user_input 包含了一组 ProcessedTransaction,这些是已经被处理过的交易。

thread

不同的 thread 将会根据主机的实际情况被并行处理。在同一个 cycle 内,当两笔交易 A 和 B 同时涉及到同一个账户时,这两笔交易将会被放在同一个 thread下进行处理。

三、 Transaction 结构

EOS 中主要使用三种 transaction 结构。其中 SignedTransaction 是由用户发出的交易请求,ProcessedTransaction 是由区块生成者处理完用户发出的交易请求后生成的交易实体,GeneratedTransaction 是由区块链生成的交易请求,特别的是由智能合约生成的交易请求。

「区块链研究实验室」EOS 块数据结构:块内通信和跨链(一)

Transaction

Transaction 作为所有 transaction 的父类,包含了 5 个参数。refBlockNum 用于指定之前的一个块,其中将包含一个由该交易签名者申明的已知状态申明,作为该交易执行的上下文。refBlockNum 只使用 16 个 bit,所以只能回溯到两天前的 65,536 个块。refBlockPrefix 就是被指定的块的 hash 的前 4 个字节(32 个比特)。expiration 给出了交易的内存过期时间,这样将保证节点的内存不用保存过多的交易。

scope 内将记载此次交易涉及到的账户信息。

messages 内将记载此次交易的实质内容,它可以包含多个消息。在设计上,只有所有的消息都被接受了,整个交易才会被接受,任何一个消息被拒绝都会导致此笔交易失败。这些消息将会在同一个线程里面顺序执行,因此将多个消息放到一笔交易里面在性能上并不理想(比如同时给两个人转账)。而且 EOS 会根据交易涉及到的用户数量数来收取手续费,因此涉及到多个账户的交易的时候,最好采用原子交易来进行(每笔交易只包含一个接收账户)。

SignedTransaction

SignedTransaction 比 Transaction 多了一个参数 signatures,将用于保存用户对该交易涉及的所有签名,每一个 message 至少对应一个 signature。

ProcessedTransaction

ProcessedTransaction 比 SignedTransaction 又多了一个参数 output,用于记录对用户发出的 SignedTransaction 进行处理后的输出。特别的,这个输出包含一条或多条交易信息 GeneratedTransaction。

GeneratedTransaction

GeneratedTransaction 是由区块链生成的交易,比如智能合约。它比Transaction 多了一个参数 id,用于方便查找到该交易。

「区块链研究实验室」EOS 块数据结构:块内通信和跨链(一)

值得注意的是,因为这个交易是由区块链(智能合约)产生的,它可以用于EOS 上不同应用间的通信。但又是因为它由区块链(智能合约)产生,因此它并不含有签名,所以它的验证必须要连同触发产生该交易的智能合约的交易一同被验证。

例如,当多家大宗交易所、普通用户向 OraleChain(智能合约)提交了目前的猪肉价格(以 SignedTransaction 形式)后,OraleChain 根据自己的 PoRD 机制计 算 得 到 一 个 可 信 猪 肉 价 格 , 然 后 连 同 所 有 搜 集 到 的 价 格 生 成 一 个GeneratedTransaction , 作 为 最 后 一 个 提 交 价 格 的 交 易 的 处 理 结 果ProcessedTransaction 的输出信息,发送给另一个智能合约 AgriculturalInsurance,AgriculturalInsurance 就可以根据这个可信猪肉价格进行保险赔偿等智能操作。

正是这样的巧妙设计,实现了 EOS 上不同的智能合约间的通信,也就是我们常说的跨链,这将极大的丰富 EOS 的生态圈,为开发者开发更丰富的应用提供了可能。


文章原标题:[区块链研究实验室]EOS 智能合约数据结构 API(一)  原作者:链三丰

推广
相关新闻
本文来源:

区块链研究实验室

原文标题: 【技术篇】EOS 块数据结构:块内通信和跨链(一)

涨幅榜

你可能感兴趣的内容
下一篇

区块链最强的装逼指南:118个Blockchain通关密码