从Polkadot的角度来看VM(虚拟机)

上次我们从Substrate的角度来解释Polkadot的利基,以及他执行的方法。这礼拜我们来解释何谓VM (Virtual Machine),这个在现代公链上有着主足轻重地位的技术,最后我们从Polkadot的角度来看,他在VM 的设计上尝试想要解决什么样的问题。

何谓Virtual Machine?

我们先来定义一下Virtual Machine (虚拟机):

VM: 能够执行某种特殊语言来达成目的的一个程序

没错,你没看错,他是一个程序。在讲解VM 的作用之前,我们先来简单讲解一下一个程序的执行流程。整个流程会因为你是什么样的程序语言不一样而有些不同,这边先简单粗分为编译式语言跟直译式语言。

编译式语言 :

首先,我们用语言写一个程序,然后这个程序被compiler 编译成机器看得懂的语言,这个语言我们把它称为组合语言,再由组译器去把这组合语言换成对应的机械语言。这种每一次都会生成跟机器看得懂的语言我们把它称之为编译式语言

直译式语言:

相对来说,所谓的直译式语言,并没有经过翻成机器语言这个步骤。他是把你写的语言转换成那个语言的执行环境所提供的直译器看得懂的表示语言,然后再由这个直译器去执行对应程序代码的动作,等于跟机器沟通的事情交由直译器来做, 在现代的电脑科学中,很多语言使用的直译器就是一种虚拟机,因为他本质上就是在模拟一个虚拟的电脑。

大致上来说, 使用VM执行有几个好处:

1.跨平台:

因为语言要翻成机械语言需要针对每个环境(ex. Windows, Mac, Linux) 不一样而有所不同,就像你的程序windows跟mac他的执行环境就不一样, 所以当你写一个程序由A 平台要转到B 平台去执行的话, 就需要重新做一次编译的动作。这其实相当麻烦,更不用说这中间还有特殊套件支援问题。

很多时候,这都是程序无法直接转换平台的主因。举个例来说好了,如果你在Mac上上写的C 语言程序,拿到Windows上面,是无法直接执行的,你需要从原始码再重新编译一份出来,才能跑,根据你的程序架构不同,你可能还要修改原本的程序代码才能编译通过。

但在直译式语言上面,通常在那个平台上的执行环境问题会由开发VM 的工程师团队帮你解决,所以如果这个语言在某个平台上有支援,你其实不太需要去在意这类跨平台的问题。

2. 灵活性

在编译式语言里面,因为编译的关系,当你修改程序的时候,你要重新进行Compile,所以你可能必须要关掉原来的程序,等到你改完、编译后再重新开启程序。这个在更新上可能也会造成困扰,因为在重新开机的时候,无法保持这台电脑本身执行的状态。虽然这点在编译是语言也有相对应的做法,但就是你必须在程序设计上先做规划,不然做起来会比较费力。

反过来说,VM是一个虚拟的机器,你可以想像在软体上可以在创造一个电脑,这个软体的电脑可以一直开着,其他状态可以一直维持着,但是他所执行的程序可以再不关闭程序的前提下去做转换,如此一来我可以在保持状态下选择更新的程序代码来执行。

举例来说,我们的插座有些是两个孔有些是三个孔的,当你的插座是两个孔的时候,你就只能买两个孔的插头来使用。因为他是直接跟插座相对应得。而虚拟机的概念可以把它想成是一个转接头,他可以接受二个孔或三个孔的,然后他直接对应插座,所以你在插头上就可以自行去改变。

区块链上的应用:

在软体开发上,更新本来就是一个相对来说比较麻烦的问题,尤其是散布在用户的程序上,因为我们无法确定每个人更新的时间跟版本。而这件事情放在分散式的网络上又更麻烦了,区块不断的在产上,链不断的再增长,每个机器所在的时区都不一样。

以比特币来说好了,他的程序代码是使用C++来编写的,他的共识更新是需要重新开启程序的,有可能在更新的时候,同时间有两群电脑的共识版本是不一样,有一方使用新的版本,一方还在使用旧的版本,导致前后共识不一样,互相无法接受对方的block,进而分出了两条不同的链。

透过VM 的做法,我们不用进行重新的编译及重新开机来进行更新,我们可以在连线的状态下进行更新,可以保存当下的执行状态,让这个状态维持在同步的情况,就有可能避免这种情况发生。

当Polkadot的client跟主链同步连线之后,理论上全部有连上线的client都会去检查版本,如果有新的版本他就会使用VM 的版本(及为Webassembly的程序代码),如果没有就可以执行本地端的版本,所以他可以确保有在连线的Client 都执行到最新的版本,而这个机制是写在整个Runtime 里面的,无法透过人为去修改的。因此,理论上他可以使用这个机制来在整个链上都维持连线的状况下来更新有关共识状态的程序代码,而不用更新整个Client的程序。

假设这份状态在链上都一直保持一致的状况下,我们就可以在理论上确保硬分差产生两条链的状况发生的机会很小。当然,整个Polkadot的机制是不是完全没有问题,我们还有待时间的验证,但至少会是个好的开始。

今天关于VM 的知识就讲到这边为止,以后有机会我们可以再详细讲一下Webassembly,以及为什么他们想要选择这样的技术,而这样的技术又跟VM 有什么关系呢?

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。