Substrate 链下工作者:安全高效的计算密集型任务

许多区块链开发者、狂热者和技术人员常怀有疑问:“我们能够往区块链上放入什么内容?”。我们可引用早期的一种货币比如比特币,或者用搭建在以太坊网络中的去中心化应用和智能合约为例。我们也可举出近期的、特别的例子比如 UN World Food Programme’s Building Blocks project,该项目为银行和支付系统不可靠地区的难民提供现金换食品服务,甚至还可以通过使用 Mediledger Network 追踪全美范围内的药品供应情况。Parity Technologies 已经利用 Substrate 以及相关技术堆栈建立了该类技术,使得这些新型区块链针对任何项目或企业的设计和部署成为可能。我们的经验已经展示了我们能往区块链上放入什么内容的可能性。

然而哪些内容不应被放入区块链?哪种类型的系统和特征从计算方面来说其链上的运行成本过于昂贵?Parity 一直致力于推进链下工作方式标准的出台。Substrate 的链下工作者允许网络中特殊的节点处理过于密集的进程或者过于庞大的数据,与此同时还存储了关于如何进行链上工作的代码,以便确保参与者能够自动与他们链上最新的逻辑保持实时同步。

哪种类型的任务链下表现最好?

也许回答对立面的问题更为恰当:链上逻辑由整个网络来处理。因此处理每一笔交易所需的计算操作是昂贵的(你得向每个人付钱来让他们执行操作和储存结果)、缓慢的(每个人都必须花费时间通过以上执行结果)以及具有极端确定性的(每个人必须拥有完整的、完全等量的数据以计算出结果)。因此,如果计算量很大(像是复杂的民主机制比如代理投票)、存储占用空间很大(比如后期或许需要的质押信息归档)、时间的把握至关重要、计算要素必须保持私密性(比如管理自身最终身份证明的秘密节点)或者要执行的操作必须是不确定的或本地化的(比如传入随机数、读取来自一个网站的数据或者调用外部 RPC),链下逻辑就不单适用,而且是必需的。

所有这些以及更多的例子将丰富区块链和去中心化网络,并使其对大量的新兴市场和参与者们更有用。然而这些服务的发布,就算在链下,也存在问题。

在传统的链下环境中,链下运算的安全性方面具有两大主要的痛点。

  • 链下机制是一个独立的进程,因此它们需要调整后区别于区块链本身的专门的维护。这给整个网络带来了高昂的开销。为了保持并更新链下的功能,链下机制消耗了大量额外的精力和通信。这也许是需要实现新的需求,或者发现了必须被修复的漏洞。
  • 传统的链下运算同样通过 RPC 来进行通信,这一过程缓慢且不可靠。查询一个区块链的状态并得到必须的全部头信息既困难也不可靠。有时如果查询的状态过于庞大,网络中的节点将无法及时跟上进度。

就算这些痛点能够被缓解,提交那些数据的交易也需要很多的功夫,且与其贡献的价值相比成本也许过于高昂。

引入 Substrate 的链下工作者

为了使链下数据集成更加安全和有效,Substrate 衍生出了链下工作者。链下工作者子系统允许执行长时间运行和可能具有不确定性的任务(例如网页请求、数据的加密/解密和签名、随机数的生成、CPU 密集型计算、链上数据的枚举与聚合等等),这些任务也许会需要比区块执行更长的时间。

链下工作者的代码储存在链上并有介入链上环境的权限,但从来不作为分块处理的一部分来执行。链下工作者使正确代码的运行更便捷且能够在不占用区块链网络的情况下执行更长运行时间的任务。然而,链上代码允许在其运行的区块链上的状态转换功能中实现例如投票、均匀化和质疑等验证机制。 这取决于区块链/ oracle 网络的设计者和那些在网络上运行的节点判断到底是谁应该做什么,何时做以及对参与者的奖惩措施。

想看看代码的实际演练吗?看一下这个回调的例子。https://gnunicorn.github.io/substrate-offchain-cb/

当你希望传统的 oracle 通过多样化的节点和授权机构在你的网络上运行时,你会发现这是非常难以实现的,特别是在想将它们升级到新的版本时。链下工作者通过在网络中发布这一基础架构来解决此问题,从而能够使节点知道它们的版本是否过时。 随着这些网络的规模、复杂性和先进程度的不断增长,该优势使得运行中的 oracle 网络随着时间的推移更加容易部署和维护。

由于它们是运行代码的一部分而非作为一个独立的进程运行,它们通过 Substrate 自身以与状态转换功能在每个导入块上运行的相同方式来运行。它们不是在  WebAssembly (Wasm) 沙盒环境中执行,就是能够在当链上代码的版本与节点执行相吻合时从本机运行的性能改进中获利。

链下工作者 APIs

由于链下工作者在沙盒环境中运行,它们因为安全性的原因只对有限的一组 API 有访问权限。不过它们确实具有对任何链上状态的完全访问权限,以及通过扩展的一组 API 与外部世界通信的附加权限。

  • 本地存储。一个附加的、本地的关键值数据库在所有链下工作者中共享。
  • HTTP 请求 API。一个功能齐全的 HTTP 客户端有从外部服务中访问和获取数据的权限。
  • 一个安全的、本地的熵源,用于随机数生成。
  • 以准确时间和睡眠/恢复工作的能力访问本地节点的权限。
  • 访问本地密钥库的权限以签署和验证结算单或交易。
  • 将交易(已签名或未签名)提交回链上以发布计算结果的能力。

注意:以上这些 API 中有的依然处于研发中。更多的信息和有用的文件将在该 API 能够使用时发布。

访问 GitHub repo 试用 Substrate 链下工作者,并通过这个回调的实际演练或者与 Substrate 技术频道的开发者们交流来学习使用。

回调的实际演练:

https://gnunicorn.github.io/substrate-offchain-cb/

Substrate 技术开发频道:

https://riot.im/app/#/room/!HzySYSaIhtyWrwiwEV:matrix.org

来源:Parity 官方博客
翻译者:Silvia(PolkaWorld 超级探员)
原文:https://www.parity.io/substrate-off-chain-workers-secure-and-efficient-computing-intensive-tasks/