原标题:Parity的开发人员们对Rust语言在2020年的新期望
在Parity,我们从很早就开始搭乘Rust的列车。除了一些例外,Parity的整个代码库都有Rust的身影 - 包括Parity的以太坊客户端、Substrate区块链开发套件、基于Substrate的Polkadot网络。
我们可能是最大的Rust用户之一、也可以说是最大的Rust代码库之一,这也让我们Parity生态系统在开发时有不同的视角。为什么我们不去开发Rust? Rust is great. 当我们有了Rust的类型系统、借用检查器(the borrow checker) 和提供的工具,我们就能快速地开发新功能和进行区块链项目实验。
Rust不断的发布期也影响深远。我们的Substrate代码库需要最新的稳定版,因为我们经常在新发行版发布的那一天、就立即使用最新的稳定版功能,同时合并代码。
而且我们许多人实际上是连轴转进行开发的。对所有实现快速周转版本迭代的人们表示敬意!
尽管有些人可能认为这样的快速发布周期会牺牲稳定性或质量,但我们从来没有经历过、当然也没有特征蠕变或其他副作用。相反,总体而言,我们认为Rust正在朝着正确的方向发展。 例如,当前async / await命令符对我们的代码库而言虽然并不重要,但它是一个很好的添加,它在未来会使代码更具可读性。我们很高兴看到此版本的发布,并看到整个异步的旅程继续推进。
与之同时,在庞大的代码库里也面临一些问题和挑战:一些bug和“增加新特性的要求”(feature requests)、一些关于编译器的人体工程学和安全性,以及总体治理。
即使是很小的错误也需要引起重视,因为在庞大的代码库中这些bug会一直累加。 当前,对Parity来说一个非常棘手的问题是cargo库的特征泄漏问题(feature leakage):我们有很多打包的模组,并且为了使集成测试更容易,我们经常在dev依赖项中包含更大的设置,这常常导致烦人的循环依赖项。同样,我们正在同时为Wasm和本地构建我们的项目(的一部分),但是由于这会通过std泄漏,因此我们不得不求助于一些我们不想做的n ... ifty hacks。https://crates.io/crates/substrate-wasm-builder
同样,从语言的角度来看,Substrate是一个最通用的区块链开发框架-通用于您使用的加密项目和数据库。通过Rust提供的出色特性框架,可以做到这一点。但是,在这里我们遇到了一些瓶颈、我们克服了其中限制、但其实宁可希望这不会发生。
例如,在特质声明(trait declaration)中添加“ where”子句会迫使:想要将类型绑定到此特质时复制此where绑定。https://github.com/rust-lang/rust/issues/44591 https://github.com/rust-lang/rust/issues/24159 我们相信,大多数这些特质解析问题将通过在rustc中切换为chalk来解决。 https://github.com/rust-lang/chalk
在未来Rust语言会进一步专业化。目前,Substrate正在使用大量所谓的“魔术”(macro magic)来防止用户一次又一次无意识地去编写相同的代码。但是,许多用户不满意我们如此依赖宏,因为它隐藏了很多实际的实现。我们相信,当Rust在发布新版本“Specialization”后,可以通过大大简化宏来减少宏的使用。
除了特定的错误和功能外,编译器的人机工程学和安全性也很重要。我们十分感谢和欣赏在编译器在性能优化和编译时间改进方面的进步工作。但是在这里,我们也不得不诉诸于中间方案的丑陋之处。有了一个现在可以容纳1000箱以上并超过160kLOC的代码库,即使是很小的更改也很容易就意味着“the beast”需要八分钟的编译时间。 “The beast” 是我们内部的构建服务器,我们可以远程将其装载到该服务器中,并且操作起来很简便,“The beast”服务器性能是我们目前使用的笔记本电脑硬件的两倍。即使启用了增量构建和sccache,每次重复都能简单实现:代码-尝试-重复周期。其他工具例如Rust analyzer和RLS其实也很简便,但是在我们的大型项目就难以运行(choke)。
当我们试图让人们开始实操Substrate时,装机速度慢会带来更不方便的情况。Substrate是开发套件。我们必须提供完整的源代码并将其全部构建在用户计算机上,而不是dylib或二进制文件,以便他们可以构建其库。因为Rust还不是一个广泛可用的开发环境,虽然输入一个脚本就能进行所有安装,但这会耗时45分钟。
尽管过去的优化主要集中在后续构建上,但是裸机首次设置和构建时间仍然非常长。这在教人们开始接触Rust时,真的很煎熬。不过最终,们完成了安装程序,使用者还是能告诉我们Rust很棒、并且适合他们要搭建的项目。
除了人机工程学之外,安全性对我们来说也是最重要的。我们的项目在不受信任的环境中运行去中心化的对等网络。一个主要功能是允许所述网络的管理机构通过提供新的Wasm编译二进制文件来升级其业务逻辑。我们非常感谢那些为认证的编译器继续推进而付出的努力。 https://ferrous-systems.com/blog/sealed-rust-the-pitch/
但是,对于我们的用例而言,更令人关注的是确定性构建(deterministic builds)。显然,您不能期望每个人都对Wasm Blob进行内省,并弄清楚它是否按照预期的方式工作。但是,如果您可以提供源代码,并且当有人使用相同的编译器版本进行构建时,他们会提供与二进制文件完全相同的副本,那么他们可以只查看源代码并信任它。但是目前还无法应用于实例,即使对于non std-wasm。
我们认为这也可能是解决首次构建问题的部分解决方案:如果我们具有确定性构建,则我们可以跨系统共享构建缓存,甚至可以运送预先填充的资产,而不必总是在本地构建-至少不是从0构造的纯Rust的一切。我们很高兴地注意到人们已经恢复了确定性构建的工作。https://github.com/rust-lang/rust/issues/34902
对于上面提出的许多问题,我们也很乐意为其他问题提供帮助和帮助。Parity是一家Rust语言为基础的公司,我们相信语言、其生态系统和社区,并希望成为其中的宝贵参与者。除此之外,稳定性及其持续进步对我们的业务至关重要。因此,所有对Rust core、std及其直接工具的贡献都在Parity内部得到了拥护,即使这些工具您是全职工作者...也不容易掌握。
我们也有一些团队成员有兴趣帮助专业化培训或修复一些bug。但是,我们还没有定下来这项工作是否值得。对于企业而言,很难确定:一个人要花一两个月的时间来开发一项新功能,而又不能保证所采用的方法会被接受。 就个人而言,我认为如果一个人兼职志愿工作的成果被抛弃被冷落、会使志愿者感到更加沮丧。但是,仍然没有明确的途径可以达成正式协议,只有个人保证。但是作为一家倡导透明治理的公司,我们认为必须有更好的方法。
关于这种不清楚的决策过程如何造成损失的一个例子是异步等待讨论。尽管最终以一种优雅而令人满意的方式解决了该问题,但是讨论对参与者造成的情感损失表明,可能会有更好的方法。 还有旁观者效应:面对如此紧张和困难的人群的潜力可能会导致贡献者犹豫不决。特别是,非英语母语者可能不会熟练地捍卫自己的立场,或者参与者可能没有时间参加讨论。
当然,这是许多志愿者项目共同面临的挑战:随着捐款、交流的增加,在某些时候,所有核心团队似乎正在做的是交流和协调,这可能不是团队所喜欢的。我们担心看到人们因这个问题和相关问题而离开社区。我们无法建立一个可持续的社区。
当想知道我们作为一家公司如何能够帮助或贡献资源来解决某些结构性和较大的问题时,这取决于与个人和特定团队进行对话,而不是公开透明。奇偶校验是在分布式,协作治理业务中;我们重视透明度和实用主义。我们不希望任何实体(包括我们)对Rust拥有完全控制权,但希望它成为一种参与性、包容性、透明和民主的过程。
我们认为,(大型)公司将在2020年显示出更多参与Rust的兴趣,因为目前我们正需要更多正式的、大型的参与途径/渠道,这可能使得公司通过雇用有影响力的人来使用关系来在议席上“购买”席位 。 我们高度赞赏合伙人和治理工作组的成立(本文的原作者是Parity治理工作组兼职人员,不代表正式立场),并热切希望了解这些工作组的成果以及我们的工作方式 帮助。
总体而言,我们期待着2020年的Rust。我们对Rust的热情比以往任何时候都高,并感谢Rust社区中的公开讨论。我们绝对可以值得选择合适的语言和社区作为赌注。 想打造互联网的未来?Parity正在招聘中 https://www.parity.io/jobs
关于PolkaBase
PolkaBase是以波卡技术为基础的区块链3.0生态,致力于打造一个能推动区块链技术与应用落地、产生优质内容和产品价值、并吸引区块链行业外部资源与团队的新一代社区;在技术普及、生态孵化、高校与产业联合、价值用户和国际化五大方面,弥补现有社群的不足,推动生态的深化与发展。