作者 |dfuse 责编 | Carol 出品|区块链大本营(blockchain_camp) 在本文中,我们将重点介绍以太坊上复杂的交易生命周期;开发者在这些情况下尝试让 dapp 提供理想的用户体验的挑战;以及 dfuse 是如何帮助突破这些挑战的。每当一笔交易提交到以太坊网络上时,它会经历一系列相当复杂的状态,而并非每个状态转换都是向前的——交易可能回滚到较早的状态、可能被另一个交易替换、还可能完全分叉。(下文中会详细描述交易的生命周期。)在 dapp 中跟踪交易的进程并为用户提供良好的体验是具有挑战性的。如今,许多基于以太坊的 dapp 都可以提供吸引人但还是相对静态的用户体验:应用能显示某个时间点上的交易状态,但必须通过刷新(点击刷新或 dapp UI 定期刷新页面)才能得到信息的更新。市面上有相对更动态的接口,但提供的数据粒度还是不够细,或者/同时以高网络流量为代价,在其底层区块链节点上施加高负载。接下来我们讨论下造成这种情况的原因,以及如何以高效利用网络和服务器的方式、细粒度的交易状态更新在 dapp 中提供符合现代标准的、流畅的用户体验。 当今的 Dapp 接口 每个 dapp 都需要向用户显示正在执行的交易的区块链底层信息——无论是 Ether 转账、代币转账还是智能合约调用,而当下的许多 dapp 的界面显示这些信息的时候显示的是区块链在单个时间点上的状态。用户在交易过程中经常需要更新信息(例如,知道转账什么时候完成了),因此 dapp 会在界面上放一个 “刷新” 按键(或定期自动为用户刷新页面),或者用户需要直接点击浏览器的刷新按钮来获取更新。有些用户体验更成熟的 dapp 会向用户显示交易的动态更新。它们会在后台轮询 AJAX 请求,重复检查其以太坊节点是否有更新,然后将更新发布到前端。这么做是非常复杂的,因为 dapp 必须进行大量 API 调用,查询许多不同的数据源(包括区块、内存池和网络条件),从而才能从头到尾的跟踪交易的生命周期。这种处理方式会有弊端:要么交易的更新不频繁、信息粒度大,导致用户想去重复点击“刷新”而去更快地获取更新;或者 dapp 必须高频轮询区块链,从而产生大量网络流量,在底层区块链节点上施加高负载。 为什么不使用基于链上事件的接口? 对于 dapp 开发人员,做静态页面或轮询一直是仅可用的两个选项,这反映了以太坊节点提供的 API 的性质。如果有一个基于链上事件的接口,可以接收推送到链上的交易状态更新并实时反馈用户,dapp 才能提供更好的用户体验——而标准的以太坊节点并不提供丰富的实时交易数据。以太坊节点确实提供了链上事件的流读取功能,但功能有限,只能通过使用以太坊的 JSON-RPC 接口的 PUB/SUB 功能才可用(在使用 GraphQL 时不可用)。PUB/SUB 接口允许 dapp 接收一些事件类型的通知: newHeads——每次新的区块 header 附加到链上 logs——根据指定的条件过滤匹配包含在新导入的区块中的日志 newPendingTransactions——进入待处理状态并被节点中可用密钥签名的所有交易的哈希(而这种情况在公共节点上很少见) syncing——指示节点何时开始或停止同步 根据这些事件类型获取信息很受限,dapp 无法通过它们跟踪交易的完整生命周期。 以太坊交易生命周期 以太坊交易是有复杂的生命周期的。每个交易都会经过多个的 state (状态),在整个过程中经历各种 state 的变更,可能前进也可能回滚。 交易状态 以太坊交易从提交上链到(在一定的成功几率下)入块,它会经历如下的一系列状态: UNKNOWN (未知):一个未被网络检测到或未被处理的交易被定义为处于 UNKOWN 状态。 PENDING (待处理):交易在等待矿工拣选和处理,位于我们所称的 mempool (内存池)中。矿工通常会首先选择 gas 价格较高的交易,因此 gas 价格较低的交易可能会长期处于PENDING状态。Gas 价格最低的交易可能永远都不会被选中,那就会导致它们无限期地处于PENDING状态。 IN_BLOCK(入块):当矿工成功选择交易并将其处理进入区块,交易将进入IN_BLOCK 状态。如果交易进入 IN_BLOCK 状态,但它所在的区块分叉了,则交易可能回到 PENDING 状态。 REPLACED(被替换):在以下两种情况下,交易可以从PENDING状态变为REPLACED状态: 另一笔来自同一发送者且有相同 nonce 的交易进入了 IN_BLOCK 状态,或另一笔来自同一发送者且有相同 nonce 但 gas 价格高出12%的另一笔交易进入了 PENDING 状态下图显示了这些状态以及它们之间的过渡。 States(状态)转换 如上所述,以太坊上的交易的生命周期是非常复杂的,这使得 dapp 很难去准确的跟踪它并向用户提供无缝式、流畅的更新。 毫不费力地跟踪交易状态 dfuse 平台为提供了一个丰富的、能够串流监听的接口,该接口支持实时详细跟踪以太坊交易的生命周期。dfuse 以太坊交易状态跟踪器 API 使开发人员能够提交以太坊交易,然后在同一数据通道上即刻获取精细的状态更新,跟随交易在其整个生命周期中的进展。使用 GraphQL,您可以实时监听指定类型交易的变化,同时可以精确指定每次交易发生变化时您想收到的数据。dfuse 平台处理了跟踪交易这项工作的复杂性,并会在事件发生时实时传输给 dapp。这样一来,您无需撰写和运行复杂的后台逻辑和重复进行轮询,也不会浪费带宽和多次运行同样的查询。简单地监听您所需的更新,然后在界面中把这些更新反馈给用户。下面的动图展示的是一个经历了这种复杂生命周期的交易——它经历了八个状态转换,最后才被包含在区块中并得到确认。如果没有使用 dfuse,dapp 则必须一次次的访问区块链以捕获交易经历的所有转换再更新给用户,并且后端代码需要去准备好应对每个状态转换。使用 dfuse,dapp 仅需要通过单个连接获取串流更新,dfuse 会为您跟踪交易经历的各种曲变化,直到它的命运被最终确定。 为先进的 Dapp 提供的现代化平台 dfuse: https://www.dfuse.io/zh/%E4%B8%BB%E9%A1%B5 本文来源:区块链大本营 —- 编译者/作者:区块链大本营 玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。 |
建议收藏!告诉你以太坊交易可能经历的8个状态以及DApp该如何应对
2020-03-09 区块链大本营 来源:火星财经
LOADING...
相关阅读:
- 最早启动、最先回调、又再次爆发领涨的以太坊能否带起第二波行情?2020-07-31
- 三少解币:7月31比特币 以太坊 柚子等行情分析操作建议2020-07-31
- 注意:只要参加过uniswap之类的defi,你钱包里的钱就有可能不是你的了!2020-07-31
- 区块链3.0大潮,国产去中心化稳定币的推出至关重要2020-07-31
- 美国证券交易委员会警告,随着山寨币价格上涨,ICO骗局再次出现2020-07-31