您正在查看: EOS-优秀转载 分类下的文章

Mandel 将于 2022 年收购 EOSIO

自两年多前发布 EOSIO 2.0 以来,EOS 网络没有进行过重大升级。从那时起,block.one 产生了 EOSIO 2.1 和 EOSIO 2.2 的候选版本;然而,由于各种原因,Clarionos 团队和更广泛的 EOS 社区不希望所有代码都与最新版本捆绑在一起。

展望未来,Clarionos 团队会将 EOSIO 代码库分叉到一个新的代码库中,我们称之为 Mandel(Mandelbrot 的缩写)。在所有 EOSIO 驱动的区块链之间达成更广泛的共识之前,Mandel 名称是一个占位符。

Mandel 的第一个版本将是 3.0,并将从 EOSIO 2.0 派生,同时从 EOSIO 2.1 和 EOSIO 2.2 中挑选一些最有价值的增强功能。Mandel 3.0 还将引入两个新的硬分叉:合同支付、增强的可配置区块链参数。此外,它将从 EOSIO 2.1 中挑选可配置的 WASM 限制硬分叉。

虽然 EOS 区块生产者大部分仍使用 EOSIO 2.0,但一些 EOS 基础设施节点和其他下游软件已升级到 EOSIO 2.1。在迁移到 Mandel 3.0 之前要求这些节点“降级”到 EOSIO 2.0 可能会造成不必要的短期负担;因此,Clairionos 还将发布源自 EOSIO 2.1 的 Mandel 2.3 版本,该版本对 Mandel 3.0 启用的新硬分叉支持精选支持。EOSIO 2.1 节点应该能够无缝升级到 Mandel 2.3,同时与网络保持同步。
Clarionos 的目标是将尽可能多的 EOSIO 2.1 增强功能迁移到 Mandel 3.0,而不会延迟关键硬分叉的交付。

即将推出的硬分叉功能

1. 可配置的 WASM 限制

这种硬分叉允许区块生产者增加可以部署的智能合约的规模,这将允许部署更大、更强大的合约。出于安全目的,EOSIO 必须限制各种 wasm 参数,例如内存、函数数量等。一旦合约达到这些限制之一,开发人员就被迫将其代码划分为多个合约。早在 EOSVM 为 EOS 带来巨大的性能提升之前,就已经建立了最初的限制。我们现在认为增加这些限制是安全的。我们没有一次性增加,而是使它们可配置。这使网络有能力在未来扩展或在攻击者以某种方式利用额外容量时对其进行调整。

2. 合同支付

开发人员面临的最具挑战性的事情之一是使他们的应用程序易于使用。要求用户从网络租用 CPU、NET 和 RAM 资源以便与应用程序交互是一个主要的可用性障碍。在理想的世界中,智能合约将支付合约用户所需的所有资源。
当今存在的 EOS 要求每笔交易都必须由至少一个密钥签名,并且每个权限级别的阈值至少为 1。这限制了合约获取用户所需资源的潜力。
我们开发了一种不需要硬分叉的合同支付方法,但“黑客”涉及发布任何人都可以签名的“私人”密钥。当我们可以简单地允许相同的交易发生而没有任何密钥对其进行签名时,这会给网络带来不必要的负担。
在没有任何密钥的情况下可能发生的操作的一个示例是合约需要执行一些维护任务。合约愿意支付自己的维护费用,它不关心谁授权了交易。如果没有要执行的维护,那么合约将简单地拒绝交易并避免任何资源使用。维护任务的一个示例可能是当前由已弃用的延迟事务执行的许多任务。
通过合约支付,可以实现与比特币交易结构相同的交易。这消除了那些只想将 EOS 用作货币的人的帐户创建成本。它还将使实施 隐私令牌成为可能,而不会让您的隐私受到资源系统的损害。虽然这些事情将通过合同支付成为可能,但它们超出了当前路线图的范围。

有关合同付款的更多信息,请点击此处

3. 增强的可配置区块链参数

这个硬分叉功能使添加/删除/配置未来的目标功能变得更加容易。不必为每个新功能或可配置参数添加新的本机内在函数,合约可以调用一个内在函数。这允许合约根据特征的存在或配置参数的值进行有条件的操作。此功能主要在 EOSIO 2.1 中实现,但经过审查,Clarionos 团队得出结论,需要进行一些小调整以确保更一致的操作。

系统合约升级

Clarionos 团队对 EOS 系统联系人有一个拉取请求,该请求将通过发布“私钥”来启用合同支付功能。这将允许应用程序在等待硬分叉生效的同时开发增强的用户体验。硬分叉后也需要利用该特性。

时间线

以下时间表是理想的,可能会随着发展的变化而变化。

  • 2022 年 1 月 31 日— Mandel 3.0 的候选版本
  • 2022 年 2 月— Mandel 3.0 测试网络启动和社区验证
  • 2022 年 3 月 1 日— Mandel 3.0 最终版本
  • 2022 年 3 月 2 日——网络部署 Contract Pays 系统合约
  • 2022 年 4 月 1 日——Mandel 2.3 发布
  • 2022 年 4 月 9 日——下一次伊甸园选举
  • 2022 年 5 月 19 日——硬分叉激活。(2022年的黄金分割率)

这将标志着 EOS 独立于 block.one 的象征性完成,因为这将是 EOS 网络第一次运行不是由 block.one 开发或发布的软件版本。
资金
EOS 网络基金会已与 Clarionos 达成协议(待区块生产者批准),在 Mandel 3.0 候选版本交付后(2022 年 1 月 31 日)向 Clarionos 支付 200,000 EOS。然后,Clarionos 将支持社区修复在测试阶段发现的任何错误。

未来方向

该路线图是 EOS 独立的最短路径,也是振兴 EOS 多年计划的第一步。您将在下一次路线图更新中看到的一些项目包括:3 秒确定性、加速 EVM 支持的内在函数以及加速隐私应用程序的内在函数。
EOS 即将以多年未见的速度加快发展速度。

原文地址:https://medium.com/edenoneos/eos-mandel-to-takeover-eosio-in-2022-2e25bf5451f0

EVM+:帮助EOS实现EVM兼容

引言:EVM+工作组正在采取行动,在EOS上部署以太坊虚拟机

概述

EOS正在凝聚社区力量共同开发生态所需的关键项目,从而进一步推动EOS生态的复苏。我们拥有才华横溢的开发人员,能够做出重大贡献的社区领袖,以及责任心和行动力都非常强的EOS网络基金会。
EOS正在开辟自己的前进道路,并开启一个新的协作时代。
目前,由EOS网络基金会资助成立的六大核心工作组正在高速运行,每个工作组都在其领域发挥重要作用,其中API+、Core+、Wallet+和Audit+四个工作组蓝皮书已接近完成,每份蓝皮书都是重要的研究成果,将详细阐述发展目标,各自领域如何取得成功的可行策略等。
今天,我们将带领大家认识EVM+核心工作组,在正式介绍之前,我们先来了解一下六大核心工作组的概况。

六大核心工作组介绍

目前,EOS网络基金会赞助成立了六个核心工作组,他们分别是:

  • API+:主要负责提供数据接口,帮助EOS生态以外的应用程序更好的集成EOS网络。
  • Core+:主要负责维护EOS系统使EOS更适合运行各种类别的应用程序。
  • Wallet+:主要负责配合软件将EOS集成到外部应用程序中。
  • Audit+:主要负责为EOS应用提供安全分析工具和合约审计的整体框架。
  • EVM+:主要负责实现与EVM的兼容以及探索EOS可行性的经济激励措施。
  • Recover+:主要负责建立危机处理框架,通过制定紧急联络、反应机制、DAO保险和白帽奖励等措施,帮助EOS项目在遭遇黑客攻击后以更合理有效的方式应对危机及追回丢失资产。

核心工作组将会与EOS生态中最有经验的人和组织合作,在落实EOS路线图方面发挥重要作用。这将是一个评估EOS生态现状、识别潜在问题并为未来发展制定路线图的绝佳机会。

每个工作组都收到了来自EOS网络基金会提供的20–25万美元的资助,另外EOS网络基金会还支出10万美元成立了一个监督小组,专门监督工作组的整体进展。

但出于社区呼声和生态需求的考虑,EVM+工作组与其他工作组的工作流程略有不同。在EOS Argentina的领导下,EVM+工作组将采取更敏捷的方式进行开发。

EVM+工作组不撰写蓝皮书,而是直接进行开发和产品交付,从而更快的在EOS智能合约层面实现EVM兼容。另外, EVM+工作组的初始预算资金为20万美元。

EVM+工作组介绍

EOS目前面临的最重要的问题之一是区块链的互操作性。
区块链领域最容易产生的问题是向内聚焦发展,而忽视了向外兼容取长补短,这样的问题在EOS表现的很明显。开发人员经常陷入一种思维逻辑:EOS拥有最好的技术,所以EOS是最好的地方,即使其他公链生态的人都还没有意识到EOS的潜力。

这样的想法会使EOS与更广阔的区块链世界隔绝开来,很容易坐井观天错过许多机会。许多开发者离开EOS,转投以太坊,原因就是虽然以太坊存在缺陷,但是却拥有更好的兼容性。

这也是我们成立EVM+工作组并加速这方面工作的重要原因,在EOS上部署以太坊虚拟机是一件非常重要的工作,我们需要推动EOS融入更广阔的区块链生态,不断的引进来、走出去,兼容并蓄快速发展。

从技术及业务角度来看,实现EVM兼容能够在释放EOS潜力方面发挥至关重要的作用。我们需要更多的以太坊开发者和用户加入EOS生态,而帮助EOS实现EVM兼容是吸引他们加入的最佳方式。

站在成功的肩膀上,吸引开发人才

EVM+工作组的领导团队是EOS创世区块生产者EOS Argentina,该团队也是Evodex和EOS Metamask钱包背后的开发人员。
为EVM+工作组提供协助的还有EOS生态的著名开发者Syed Jafri,他在2020年凭借EOSIO.EVM赢得了Block.one举办的EVM挑战赛, EOSIO.EVM使Solidity开发人员能够在EOSIO上快速启动并以高达100倍的速度和低于1000倍的成本运行应用程序。可以说,Syed Jafri在帮助EOS实现EVM兼容方面十分有经验。
EVM是EOS急需的创新。EOS公链在过去几年中面临的主要问题之一是资金匮乏。让我们和以太坊生态做一个对比:
以太坊速度更慢、效率更低而且Gas成本非常高,但以太坊和其他基于EVM的公链之间拥有更高的网络效应和代币流动性。另一方面,一部分以太坊上的开发人员能够通过创造基于Solidity编写的模块化、可重复利用、安全开源的智能合约获得高额回报,另一部分开发者可通过OpenZeppelin等组织的收录的代码库获得丰富的开发工具和教程。一个不可否认的事实是:EVM生态系统中的开发人员工具、代码库、可供dApp开发人员使用的开源代码一直在快速增长。
反观EOS生态,开发人员只能使用不太成熟的工具从头开始构建许多代码库,一个不恰当的比喻是:以太坊生态的开发者制造汽车就像是搭积木,把现成的车轮、方向盘、发动机等拼接在一起就好,而EOS生态的开发者想要制造汽车,需要从制造车轮开始。
EOS网络基金会赞助的其他工作组正在专注于改善EOS开发人员的体验,提供更多可用的本地工具,但都需要一些时间才能充分实现。
因此,我们和社区都认为,我们可以利用EVM已经存在的人才和资源,并通过EVM兼容将这些引入EOS,以此挖掘出EOS生态的潜力。
EOS发展已经进入极其重要的一年,EOS仍然面临两个巨大挑战:
一方面,EOS必须向潜在的开发者展示其巨大的潜力和价值;
另一方面,EOS必须消除开发者进入生态的障碍,尽可能降低门槛,吸引更多开发者加入。
即使项目方或开发人员相信EOS更好,但如果进入EOS生态的过程漫长、繁琐,项目方和开发人员也不会加入。因此帮助其他公链的开发人员以无障碍、低门槛的方式,将项目部署、迁移或克隆到EOS生态,是更行之有效的方式。
EVM+工作组:在EVM和EOSIO之间架起桥梁
EVM+的总体目标是从开发人员和用户的角度,使EOS成为一个兼容的EVM平台。为此,以下是工作组正在解决的关键问题:
智能合约级别的兼容与本地节点实施:EOS Argentina正在努力开发基于智能合约的解决方案,使 EVM 能够在 EOS VM WASM 运行时正常运行。 这将允许EOS网络在不进行协议升级的情况下升级EVM运行(无需分叉)。
ETH 预编译合约:这不仅有利于EOS上的EVM,同时也有利于智能合约开发人员。 EOS与其他链一样,交易执行时间有限(协议为150毫秒,BP为30毫秒)。 尽管EOS VM功能强大且速度很快,但仍有一些类型的操作在Web汇编中执行时,缺乏它们在本机代码中可以进行的优化。 为了加快速度,EVM+工作组正在寻求将ETH预编译实现为EOS内在函数(本地代码)。
完全兼容RPC:该领域的计划仍在开发中,但EVM+团队的目标是至少支持大多数RPC,以允许在ETH上使用通用工具/开发环境。这将是该计划最重要的工作之一。
确定性Gas消耗/计费:EOS链使用三种资源:CPU(主观度量/可变价格)、NET(客观度量/可变价格)和RAM(客观度量/可变价格)计费。这方面工作的挑战是为用户提供确定性的Gas消耗和有竞争力的Gas价格,同时防止Web3 API被滥用。
支持Metamask:这意味着EOS生态将支持Metamask钱包,以便EOS本地合约和使用Solidity编写的EVM合约进行交互。
EVM+工作组将按照上述方向快速推进工作,为EOS实现EVM兼容创建最佳解决方案,并计划在2022年夏天之前产生切实可行的解决方案。
目前的六个工作组正在构建一个框架,使开发人员和用户更容易参与EOS,促进EOS网络的增长,使EOS生态系统更具吸引力。 EOS的未来从未如此光明。 我们邀请您加入我们,共同创造区块链世界最伟大的公链回归故事。
请继续关注EOS网络基金会赞助的其他工作组的深入研究。
关于EOS网络基金会
EOS网络基金会是一个非营利性的组织,旨在倾听社区声音、传达社区意愿并扶持社区优质项目发展,成为EOS社区的信息共享桥梁,并为EOS生态提供资金、技术、运营、未来规划、生态构建等关键基础设施支持,进一步发挥EOS作为世界上速度最快的治理型区块链的全部潜力。
EOS网络基金会Discord
EOS网络基金会中文Twitter
EOS网络基金会中文Medium
EOS网络基金会中文电报订阅号
EOS网络基金会中文电报群

https://medium.com/eos-network-foundation/evm-bringing-the-ethereum-virtual-machine-to-eos-f26b88466d99

EOS 希望与 Dan Larimer 一起履行 2017 年的承诺

关键要点

EOS 网络基金会通过招募网络架构师 Dan Larimer,在加强其独立于 Block.one 方面迈出了重要一步。
Larimer 和他的团队将分叉 EOSIO 代码库。
多年来,该项目的创始公司 Block.one 一直未能兑现承诺,社区普遍对此表示不满,但这些进展都是如此。

EOS 网络基金会已聘请 EOSIO 的创始开发者 Dan Larimer 帮助其接管 EOS 生态系统的方向。该合作伙伴关系是在 EOS 社区投票停止授予其创始支持者 Block.one 之后的。

EOS Network Foundation 的目标是更美好的未来

EOS 网络基金会的目标是复兴。

Dan Larimer 是 EOS 的架构师,之前是该项目的创始支持者 Block.one 的一部分,现在将帮助该基金会重振该项目的生态系统。为了进一步建立与 Block.one 的独立性,Larimer 和他的团队将分叉 EOSIO 代码库。

分叉将发生在两个主要升级中:Mandel 2.3 和 Mandel 3.0。EOS Network Foundation 获得了 200,000 EOS 来帮助 Larimer 和他的团队执行分叉。

Larimer 在新闻稿中表示,Mandel 代码分叉是“通往 EOS 独立的最短路径”。他还将分叉描述为“振兴 EOS 多年计划的第一步”。

今天宣布的事态发展是在 EOS 社区多年的困境之后发生的。EOS 在 2017 年声名鹊起,当时 Block.one 通过 ICO 筹集了 41 亿美元来资助该项目。它是加密社区中被称为“以太坊杀手”的几个区块链之一。然而,它未能兑现承诺。在筹集资金之后,Block.one 提出了一些在几年后仍未推出的举措。

Block.one 的失误导致 EOS 社区内长期存在分歧。该公司被指控阻碍了该项目的进展,EOS 网络基金会的首席执行官不断声称由于 Block.one 未能执行而遭受了损失。在两个阵营之间多年的紧张关系之后,EOS 区块生产者在 12 月投票停止了 6700 万个 EOS 代币的归属,这些代币计划在未来六到七年内为 Block.one 解锁。该拨款目前价值约 1.8 亿美元。

EOS 网络基金会希望加入 Larimer 将使该项目更接近于实现其最初的愿景。上周,它从 EOS 社区获得了 2100 万美元的资金,以实现其目标。能否卷土重来,还有待观察。

英文原文:https://cryptobriefing.com/eos-wants-fulfill-2017-promises-with-dan-larimer/

EOS的BFT-DPOS共识机制的进化过程及背后逻辑

不知道是阅读量到了质变,还是后面引用的这篇文章太好,我终于对BFT-DPOS有了更深刻的理解

POS:
出块不再由算力说了算,由节点持有的stake说了算,解决了POW算力资源被大量无用消耗,但由于无条件信任代表,节点作恶非常容易 , 比如nothing at stake攻击

DPOS:
动态产生一定数量的代表比如21个节点代表,只由这21个节点生成区块,降低了作恶的概率,同时用事后惩罚限制节点代表作恶行为,但始终不够安全(怎么惩罚,使用抵押物?抵押物需要多少?作恶导致的失败交易的损失都是可以量化的吗?如果不能量化抵押物就没有意义),同时确认速度确实也慢(需要14个block)

BFT+DPOS:
一个区块生产后通过BFT协议立马确认,解决了DPOS确认慢问题,需要超过1/3节点才能作恶,相比POW 51%作恶条件,这个1/3值相对来说还是偏低了点,但是这是一个折中,也只能这样了

BFT + DPOS + 小块:
该协议是为了加快出块速度,该改进的核心思想是让同一个节点产生6个小块。这个能提升性能的核心原因是6个小块的产生没有等待确认的环节。在BFT+DPOS算法中,一个节点要创建新块,必须等上一个块被确认(或者超时),因为它不确定上一个节点是否作恶是否会被确认,所以它只能等。但是如果上一个块时也是该节点产生的,它自然不需要等上一块确认,因为它知道上一个块是真实的,不是作恶的块,最后肯定会被确认,所以安心生产下一块。

可见DPOS+BFT+小块机制中,区块生成和确认以pipeline的方式进行,是同时进行的,加快了出块速度。

何为作恶:

各种共识算法,节点基本都会进行数据检验功能,因而数据伪造作恶基本不可能。那真正的作恶是什么?

主动作恶:节点主动生产两个区块,给一部分节点发送新区块A,另外一部分节点发送区块A1,这样系统就产生分叉了。

被动作恶: 块传播因为网络延时或者中断,会导致一部分节点缺失该块的信息,进而会产生分叉,然后后续区块生产者发现分叉后,如果遵循只选择一个分支生产区块就会让分叉收敛(能收敛最后就能达成共识),但是如果继续保持并加重这个分叉,最后就会导致整个链变成一颗森林,最后节点就永远没法达成共识, 这是被动作恶。比如POS的noting at stake攻击,当系统出现分叉时,生产者基于自己的利益会在两个分叉区块上各自生成一个区块(这样不管哪个分叉获胜,自己都能获得收益),这其实间接助长和加重了分叉

因而要阻止这些作恶行为,有三种方法:

1)机制保证,让生产者没有时间来生成2个区块(POW)

2)利益保证,生成两个区块最后肯定没用(BFT算法, 大家最后只会认可一个快),生产者获取不了什么好处,自然没必要生产两个区块

3)事后惩罚,比如DPOS,这种方法其实没啥用,因为事后发现作恶节点后,系统没法回溯区块,只能惩罚作恶节点,但是这个作恶损失是不确定的(前面提到过),起不到惩罚作用,且抵押物模式是一种限制,不利于生态发展

引用原文

区块链中最重要的便是共识算法,比特币使用的是POW(Proof of Work,工作量证明),以太币使用的POS(Proof of Stake,股权证明)而EOS使用的是BFT-DPOS。

什么是BFT-DPOS呢?即拜占庭容错式的委任权益证明。

要想明白BFT-DPOS的运行机制,首先就要先明白什么是DPOS。

由于POW在比特币的共识算法中极大地消耗了算法的资源。而且会有算法集中的问题,所以在2014年的时候Dan Larimer提出了一个相较于POW来说更加高效,轻便的共识机制即DPOS。该共识机制一边能让网络成本小型化,另一方面有回复语每个持股人一定的投票权。

这些超级节点呢能够:供相关计算资源和网络资源,保证节点的正常运行;当轮到某超级节点拥有出块权时,超级节点收集该时段内的所有交易,并对交易验证后打包成区块广播至其他超级节点,其他节点验证后把区块添加到自己的数据库中。这种共识机制采用随机的见证人出块顺序,出块速度为 3 秒,交易不可逆需要45秒。为什么需要 45 秒呢?因为 DPoS 下,见证人生产一个新区块,才表示他对之前的整条区块链进行了确认,表明这个见证人认可目前的整条链。而一个交易要达到不可逆状态,需要 三分之二以上的见证人确认,在 EOS 里就是 14 个见证人。DPoS共识算法也有极强的抗分叉能力,因为区块添加到一条区块链分叉的速率与拥有该共识的超级节点比例是相关的。当一个超级节点设法在两条分叉上同时生产区块时,EOS的持有者会在下一轮投票中将该超级节点删掉,并且EOS社区会给予相关恶意节点一定的惩罚。因此,在一般情况下,使用DPoS的EOS都是很难经历分叉的。

其次,我们还要明白BFT所代表的的意义。

拜占庭容错技术(Byzantine Fault Tolerance,BFT)是一类分布式计算领域的容错技术。拜占庭假设是对现实世界的模型化,由于硬件错误、网络拥塞或中断以及遭到恶意攻击等原因,计算机和网络可能出现不可预料的行为。拜占庭容错技术被设计用来处理这些异常行为,并满足所要解决的问题的规范要求。

拜占庭容错技术来源于拜占庭将军问题。拜占庭将军问题是Leslie Lamport在20世纪80年代提出的一个假象问题。拜占庭是东罗马帝国的首都,由于时拜占庭罗马帝国国土辽阔,每支军队的驻地分隔很远,将军们只能靠信使传递消息发生战争时,将军们必须制订统一的行动计划。然而,这些将军中有叛徒,叛徒希望通过影响统一行动计划的制定与传播,破坏忠诚的将军们一致的行动计划。因此,将军们必须有一个预定的方法协议,使所有忠诚的将军能够达成一致,而且少数几个叛徒不能使忠诚的将军做出错误的计划。也就是说,拜占庭将军问题的实质就是要寻找一个方法,使得将军们能在一个有叛徒的非信任环境中建立对战斗计划的共识。在分布式系统中,特别是在区块链网络环境中,也和拜占庭将军的环境类似,有运行正常的服务器(类似忠诚的拜占庭将军),有故障的服务器还有破坏者的服务器(类似叛变的拜占庭将军)。共识算法的核心是在正常的节点间形成对网络状态的共识。

简单形容就是:通过在一群数量有限的节点中,使用轮换或者其他算法来筛选出某个节点作为主节点。并且赋予该节点出块的权利。在主节点是将该时段的交易打包成区块后用自己的私钥对该区块签名,并将其广播到所有节点。当主节点收到至少三分之二的不同节点的签名区块后,则该区块完成了所有节点的验证成为不可逆区块串联到区块链中。

BFT与DPOS二者相结合就诞生了BFT—DPOS共识算法。

、为了挖掘 EOS 系统的性能,Daniel Larimer 在以上基础上又进行了修改。首先,他将出块速度由 3 秒 缩短至 0.5 秒,理论上这样可以极大提升系统性能,但带来了网络延迟问题:0.5 秒的确认时间会导致下一个出块者还没有收到上一个出块者的区块,就该生产下一个区块了,那么下一个出块者会忽略上一个区块,导致区块链分叉(相同区块高度有两个区块)。比如:中国见证人后面可能就是美国见证人,中美网络延迟有时高达 300ms,很有可能到时美国见证人没有收到中国见证人的区块时,就该出块了,那么中国见证人的区块就会被略过。

为解决这个问题,Daniel Larimer 将原先的随机出块顺序改为由见证人商议后确定的出块顺序,这样网络连接延迟较低的见证人之间就可以相邻出块。比如:日本的见证人后面是中国的见证人,再后面是俄罗斯的见证人,再后面是英国的见证人,再后面是美国的见证人。这样可以大大降低见证人之间的网络延迟。使得 0.5 秒的出块速度有了理论上的可能。

为了保证万无一失,不让任何一个见证人因为网络延迟的意外而被跳过,Daniel Larimer 让每个见证人连续生产 6 个区块,也就是每个见证人还是负责 3 秒的区块生产,但是由最初的只生产 1 个变成生产 6 个。最恶劣的情况下,6 个区块中,最后一个或两个有可能因为网络延迟或其他意外被下一个见证人略过,但 6 个区块中的前几个会有足够的时间传递给下一个见证人。

再来讨论 BFT-DPoS 的交易确认时间问题:每个区块生产后立即进行全网广播,区块生产者一边等待 0.5 秒生产下一个区块,同时会接收其他见证人对于上一个区块的确认结果。新区块的生产和旧区块确认的接收同时进行。大部分的情况下,交易会在 1 秒之内确认(不可逆)。这其中包括了 0.5 秒的区块生产,和要求其他见证人确认的时间

使用上述BFT-DPoS协议就可以使得EOS的出块间隔从原来的3秒降低到500毫秒,这也使得跨链通信的时延大大缩短,单位时间内可确认的交易数量大大提升。笔者相信如果这样的机制在EOSIO1.0的正式版本中成功实现,那无疑是区块链技术向支持百万级别用户的目标迈出的巨大一步。

引用原文来自:金色财经
转载自:https://www.cxyzjd.com/article/ITleaks/80359033

先进的EOSIO编程理念

在审查EOS智能合约时,我注意到每个开发人员都有自己的编程风格,并且有许多不同的方法可以执行相同的操作,例如处理时间或将操作发送到其他合约。这篇文章是一些EOSIO库函数的思想转述,我觉得这些函数很优雅且有用。

1. eosio::same_payer

第一个只是一个常量表达式,可以在修改多索引表的条目时使用。使用eosio::same_payer时,将使用的新RAM(如果有)将分配给已为表条目支付的同一帐户。
用法:

statstable.modify( st, eosio::same_payer, [&]( auto& s ) {
    s.supply += quantity;
});

它在[multi_index.hpp]中定义,只是空name(value:0)""_n 或者name(0)的常量表达式,一些开发人员仍然使用它来表示同一个付款人。

2. get_first_receiver,get_self()

在contracts.hpp中定义的两个getters get_selfget_first_receiver返回正在运行的操作的执行上下文的一部分。(在EOSIO.CDT1.6中实现了get_first_receiver以支持旧的get_code,现在不推荐使用。)get_self方法返回当前运行代码的合约,而get_first_receiver返回动作源自的帐户。除非涉及通过require_recipient的通知,否则这两个帐户是相同的。

例如,通过侦听eosio.token的传输操作的通知,get_self()返回你的合约部署到的帐户,而get_first_receiver()返回eosio.token帐户。这是因为该行为来自向你的合约帐户发送转移操作到eosio.token帐户的帐户。

用法:

[[eosio::on_notify("eosio.token::transfer")]] void cryptoship::transfer(name from, name to, const asset &quantity,
                          string memo) {
  print(get_self()); // cryptoship
  print(get_first_receiver()); // eosio.token
}

3.action_wrapper

许多用例需要将合约代码中的新操作发送到另一个合约。这是合约可以相互积极沟通的唯一方式。同样,有很多方法可以做到这一点,但最优雅的方法之一是使用eosio::action_wrappers。它为特定智能合约代码的特定操作创建操作模板,然后可用于调用此操作。

第一个参数是操作名称,第二个参数是操作的方法声明。
用法
eosio.token标头为eosio.token.hpp header file中的所有操作定义了动作包装器:

[[eosio::action]]
void create( name   issuer,
            asset  maximum_supply);

[[eosio::action]]
void issue( name to, asset quantity, string memo );

[[eosio::action]]
void retire( asset quantity, string memo );

[[eosio::action]]
void transfer( name    from,
              name    to,
              asset   quantity,
              string  memo );

// ...

using create_action = eosio::action_wrapper<"create"_n, &token::create>;
using issue_action = eosio::action_wrapper<"issue"_n, &token::issue>;
using retire_action = eosio::action_wrapper<"retire"_n, &token::retire>;
using transfer_action = eosio::action_wrapper<"transfer"_n, &token::transfer>;
// ...

我们现在可以通过包含此头文件向任何eosio.token合约发送内联操作。

需要注意的是,只需要包含带有声明的头文件。意思是,即使对于具有未知实现细节的闭源合约,也可以轻松编写动作包装器。只需要写出声明,动作签名,可以从ABI获得。

使用eosio-cpp的-I标志包含头文件的附加包含目录。

包含头文件后,将发送内联传输操作,如下所示:

#include <eosio_token/include/eosio_token.hpp>

// can specify the contract to send the action to as first argument
token::transfer_action payout("eosio.token"_n, {get_self(), "active"_n});
// transfer arguments are now passed as postional arguments
payout.send(get_self(), to, quantity, memo);

对于使用to_action方法的延迟交易,同样适用:

token::transfer_action payout("eosio.token"_n, {get_self(), "active"_n});

transaction t{};
t.actions.emplace_back(payout.to_action(get_self(), to, quantity, memo));
t.delay_sec = 10;
t.send(0 /* sender id */, get_self(), false);

4. EOSIO时间类time_point,time_point_sec,microseconds

EOSIO库在time.hpp header中定义了两个日期类,它们的精度不同。time_point_sec类是一个标准的UNIX时间戳,用于存储自1970年1月1日以来在uint32_t中的秒数,time_point具有更精确的精度,用于存储uint64_t中经过的microseconds(而不是毫秒数)。从两个类转换都很容易。

要使用时间算术,可以使用microseconds,它带有有用的助手,如secondsminuteshours

用法:

eosio::time_point tp = eosio::current_time_point();
eosio::time_point_sec tps = eosio::current_time_point();
eosio::microseconds micros = tp.time_since_epoch();
uint64_t count_micros = micros.count();
uint32_t count_seconds = tps.sec_since_epoch();

// no more 60*60*24*1e6
const auto MICROSECONDS_IN_DAY = hours(24);
count_micros += MICROSECONDS_IN_DAY;
// no more 60*60*24
count_seconds += hours(24).to_seconds();

eosio::time_point_sec lastGame = /* ... */;
check((eosio::time_point_sec)(current_time_point() + minutes(1)) >= lastGame,
      "last game not finished");

使用microseconds及其助手可以避免任何类型的常量,如const auto SECONDS_PER_DAY = 60*60*24,使代码更容易推理。

转载自:http://blog.hubwiz.com/2019/06/28/eos-programming-concepts/