eocs跨链合约区块数据结构设计与实现

核心数据结构分析

123456
struct  {    block_timestamp_type timestamp;    account_name producer;

    static uint32_t num_from_id(const block_id_type& id);}

结构体中timestamp是块打包好的时间戳,previous是前一个块的id,transaction_mroot表示所有交易的merkle root, action_root表示 action的merkle root。
num_from_id通过blockid找到blocknum。

1234
struct signed_block_header : block_header {   signature producer_signature;   EOSLIB_SERIALIZE_DERIVED(signed_block_header, block_header, (producer_signature))};

struct signed_block_header :
该结构体继承了block_header,内部包含了producer_signature,提供了生产者的签名
struct block_header_state:
包括块基本的信息,blockid,blocknum,以及signed_block_header签名头信息。

struct block_header_with_merkle_path:
包括block_header_state 类型的block_header,以及由id序列构成的merkle_path,这个merkle_path中的blockid需要一个链接一个,不能间断,此外最后一个blockid需要指向block_header的前一个id。

struct action_receipt :
表示一个action的收据,包括接受者,摘要信息,授权顺序,接受顺序,编码顺序等。
用UML图表示上述各类之间关系:

核心api解析

1234
uint32_t block_header::num_from_id(const block_id_type& id){? ? return endian_reverse_u32(uint32_t(*reinterpret_cast<const uint64_t*>(id.hash)));}

取出id的hash值,然后将高32位反转获得blocknum

123456
checksum256 block_header::id() const {auto result = sha256(*this);*reinterpret_cast<uint64_t*>(result.hash) &= 0xffffffff00000000;*reinterpret_cast<uint64_t*>(result.hash) += endian_reverse_u32(block_num());return result;}

计算id时,将自身256hash值去高32位,与之前获得的blocknum()高32位反转后相加,得到id号。

123
digest_type block_header::digest() const {return sha256(*this);}

获取摘要,就是将自己进行256hash得到摘要。

1234567
template <typename T>checksum256 sha256(const T& value) {auto digest = pack(value);checksum256 hash;::sha256(digest.data(), uint32_t(digest.size()), &hash);return hash;}

sha256是我们eocs团队自己封装的基于万能类型模板实现的hash函数,首先将value打包,然后将hash结果保存在变量hash中,返回此结果作为digest。

123456
void block_header_state::validate() const {auto d = sig_digest();assert_recover_key(&d, (const char*)(header.producer_signature.data), 66, (const char*)(block_signing_key.data), 34);

eosio_assert(header.id() == id, "invalid block id"); // TODO: necessary?}

该函数先计算摘要,然后根据摘要去除header的生产者签名信息和块签名key值。
接下来判断header的id是否和自己的id匹配。

123456
producer_key block_header_state::get_scheduled_producer(block_timestamp_type t)const {// TODO: block_interval_ms/block_timestamp_epoch configurable?auto index = t.slot % (active_schedule.producers.size() * producer_repetitions);index /= producer_repetitions;return active_schedule.producers[index];}

该函数获取轮询的生产者,producer_repetitions为重复的生产者数量,index除以该数量获取轮询的次数,进而根据轮询表里index索引取出对应的生产者。

1234567891011
uint32_t block_header_state::calc_dpos_last_irreversible()const {vector<uint32_t> blocknums;blocknums.reserve(producer_to_last_implied_irb.size());for (auto& i : producer_to_last_implied_irb) {blocknums.push_back(i.second);}

if (blocknums.size() == 0) return 0;std::sort(blocknums.begin(), blocknums.end());return blocknums[(blocknums.size() - 1) / 3];}

该函数计算最后一个不可逆区块num,首先定义了blocknums的序列,然后根据producer_to_last_implied_irb(包含不可逆区块的生产者map),将对应的区块nums放入blocknums序列,之后,根据序列大小-1再除以三得到区块索引,就是最后的不可逆区块号。

到此为止

原文:大专栏  eocs跨链合约区块数据结构设计与实现

原文地址:https://www.cnblogs.com/chinatrump/p/11601641.html

时间: 2024-10-07 03:07:34

eocs跨链合约区块数据结构设计与实现的相关文章

PalletOne调色板跨链的BTC实现

之前已经讲到了PalletOne调色板跨链以太坊ETH和ERC20的技术原理,接下来我们来讲解PalletOne跨链比特币BTC的技术原理. 一.BTC充币 假如用户A持有一定数量的比特币BTC,他希望换一些PTN,那么他可以通过BTC充币合约,将BTC兑换成等值的PBTC(PalletOne上发行的与BTC1:1兑换的映射Token),然后用PBTC即可与持有PTN的用户进行互换.BTC充币合约是运行在一个选定的陪审团上的用户合约,陪审团由4个选出的陪审员组成,每个陪审员都部署了PalletO

PalletOne调色板Token PTN跨链转网的技术原理

之前一直在忙于通用跨链公链PalletOne的研发,没有怎么做技术分享的博客,最近PalletOne主网上线也有几个月的时间了,即将进行PTN(PalletOne上面的主Token)从ERC20到主网的转网工作.在转网进行时,正好将这其中的技术原理与大家分享. 一.Token转网的方式 因为ERC20同质化通证标准的流行,大量区块链项目都是通过先在以太坊上以ERC20的形式发行Token,进行募资.糖果发放.Token买卖等,等到自己的主链研发完成,就会将ERC20上的Token销毁或者冻结,而

区块链的跨链技术介绍完整版

如果说共识机制是区块链的灵魂核心,那么对于区块链特别是联盟链及私链来看,跨链技术就是实现价值网络的关键,它是把联盟链从分散单独的孤岛中拯救出来的良药,是区块链向外拓展和连接的桥梁. 自比特币七年前诞生以来,数以百计的竞争币被开发出来,有着各种新的优势和特性,但比特币的霸主地位依然屹立不倒,而很多复制竞争币却湮灭在历史中.虽然比特币有不少缺点和限制,但比特币却又是最去中心化.最多分布节点.最公平区块链,从数字货币地位.节点数量.去中心的权威等方面比特币还是很有优势.同时,类似以太坊.比特股的区块链

侧链:区块链技术革命时代的跨链创新,价值网络实现的关键

自中本聪2009年推出比特币以来,数以百计的竞争币被开发出来.以太坊.比特股等类比特币网络的出现,已经对比特币网络的权威带来了极大的挑战.如何提升比特币网络的竞争力,激活比特币网络的创新,成了区块链信徒们比较关心的问题.侧链真是在这样的情况出现的.一.侧链的概念侧链(sidechains)实质上不是特指某个区块链,而是指遵守侧链协议的所有区块链,该名词是相对与比特币主链来说的.侧链协议是指:可以让比特币安全地从比特币主链转移到其他区块链,又可以从其他区块链安全地返回比特币主链的一种协议.显然,只

区块链与大数据的整合,未来必然趋势

大数据与区块链是当今最热门的两个话题,带动了一系列的投资热潮.不论是风投领域,还是传统的金融领域,只要有这两个关键词出现,往往能让企业获得特别的关注.这也说明了这两个词在当今社会的火爆程度. 各个维度对 区块链 进行了详细阐述,那么大数据又是什么呢?现在很多人都认为,大数据的本质是「大」.也就是说,它的数据量必须非常的广泛和巨大,可能是海量级的.其实这并不准确. 大数据所指的「大」其实更偏向于全,也就是尽可能地接近某个统计范畴内最全面的数据,甚至达到全数据的统计结果.只有这样才能真正实现大数据的

【比原链】如何从比原节点拿到区块数据?

作者:freewind在前一篇中,我们已经知道如何连上一个比原节点的p2p端口,并与对方完成身份验证.此时,双方结点已经建立起来了信任,并且连接也不会断开,下一步,两者就可以继续交换数据了. 那么,我首先想到的就是,如何才能让对方把它已有的区块数据全都发给我呢? 这其实可以分为三个问题: 我需要发给它什么样的数据? 它在内部由是如何应答的呢? 我拿到数据之后,应该怎么处理? 由于这一块的逻辑还是比较复杂的,所以在本篇我们先回答第一个问题: 我们要发送什么样的数据请求,才能让比原节点把它持有的区块

2019年,你为什么一定要投资去中心化跨链交易所BDEX?

如果说"去中心化交易所是未来"已经成为了区块链行业内的共识,那么去中心化跨链交易所,一定是未来最璀璨的明星.经历过内测.公测.延期.跳票之后,BDEX去中心化跨链交易所终于要临来正式上线了. 2019年最吸引眼球的去中心化交易所是币安DEX,有得人说这是一场币安的自我革命.但是,更加深刻的现实却是,随着行业的发展,人们对资产安全.对自我掌控的要求愈来愈强,这导致了中心化交易所必然迎来终结.因此,币安看似是自我革命,实际是不革命就难以活长命,这同时也是所有头部大交易所面临的问题.相对于币

跨链技术之ILP详解及应用

Abstract:As the booming of BlockChain technology, the requirement of asset transfer between different ledgers is as imperative as possible. as the kernal of the value network, the technology about inter ledgers is more and more important.On studying

大变革 区块链+OR+区块链?

2015年中国经济转型的同时"互联网+"火爆了,随之而来的又多了一个"+互联网"的概念.无论"互联网+"还是"+互联网"本质上是相同的,但具体做法和含义上又存在一定差异. 区块链主链侧链开发 中心化和去中心化场内场外交易所开发 区块链跨境支付 区块链游戏 区块链供应链开发 (13161319707) 微信 xiandakeji.无论"互联网+"还是"+互联网"只是一个手段.一个方法.一个