Facebook加密数字货币项目Libra区块链编程语言解读

当前位置:首页 > 币圈百科 > Facebook加密数字货币项目Libra区块链编程语言解读

Facebook加密数字货币项目Libra区块链编程语言解读

2023-02-07币圈百科556

2019年6月18日,由脸书发起的加密数字货币项目Libra正式亮相。Libra的白皮书也与几个技术文档同时发布,重点是新的区块链编程语言Move和共识协议LibraBFT。本文从技术角度解读Move语言,带领大家对这种语言有一个初步的了解。

image.png

数字资产管理

Move最引人注目的特点是它提出了一套完整的数字资产编程系统。与现有的区块链编程语言相比,Move更强调数字资产的地位。使用Move语言,开发人员可以更灵活、更安全地定义和管理链中的数字资产。

挑战?

定义区块链的数字资产很有挑战性。由于物理世界中资产的一些特性,很难在数字世界中表达出来。

稀缺性:应该控制资产的供给。资产不能被复制。创造新资产是一种特权行为。

访问控制:系统应该能够确保参与者自己的资产受到访问控制策略的保护。

现有的解决方案

现有的区块链编程语言具有定义区块链上的数字资产的能力,但是它们仍然具有一些缺点和限制。我们以比特币和以太坊为例简单说明一下。

比特币通过UTXO对其资产进行编码,使用比特币脚本定义资产的转移规则,保证稀缺性和访问控制。开发者可以使用比特币脚本来定义各种访问控制策略。

但是,比特币脚本有相当大的局限性,扩展性差。比特币脚本不是完整的图灵语言,开发者无法在其中自定义数据类型和流程。所以,如果你想在比特币区块链上定义一种新的数字资产,或者实现更复杂的访问控制策略,只能求助于一些外部手段,这对开发者来说是不友好的。

以太坊用数值来表示以太坊,在系统层面上保证了以太坊的稀缺性和访问控制。开发人员可以使用EVM字节码来编写智能合同,并与链中的数字资产进行交互。EVM字节码是一种扩展性很强的图灵语言。开发者不仅可以用它来操作以太网币,还可以定制数字资产,编写复杂的访问控制策略。此外,还可以使用更高级的Solidity语言编写智能合约,Solidity代码会编译成EVM字节码后再运行。

但是,在以太坊,定制化的数字资产水平比以太坊低。以太网的安全性在系统层面得到保护,而定制数字资产的安全性只能由开发者来保证。不管底层的EVM字节码或高级可靠性如何,开发人员只能用数值间接表示数字资产。由于在编程语言层面没有对稀缺性和访问控制的支持,开发人员在编码过程中很容易出错,这将导致严重的后果,如复制、重用和资产丢失。

一流资源

为了解决上述问题,Move提出了一流资源的概念。开发者不仅可以利用一流的资源实现安全的数字资产,还可以为数字资产编写正确的业务逻辑。

Move将数字资产与其他数据类型(如integer和Boolean)区分开来,并将其定义为资源类型。资源类型的语义受线性逻辑启发:一个资源不能被复制或隐式丢弃(即在程序结束时,资源处于无所有权状态),只能被转移。除了上述区别,资源类型和普通数据类型一样,可以存储在数据结构中,并用作流程的参数。

Move使用模块来管理资源。首先,资源的类型结构是在一个模块中定义的,每个资源都必须在一个模块中定义。其次,该模块还定义了可以操作资源的进程,如创建、修改和销毁。开发者可以且只能通过模块提供的开放进程对资源进行操作,不能自己对资源进行编码和修改。 也就是说,当资源被用来定义一个数字资产时,它的所有业务逻辑,包括访问控制策略,都已经在模块中定义好了。离开或绕过该模块的任何数字资产操作都是非法的,也是不允许的。

在Libra区块链中,Libra令牌也被定义为一种资源类型,这与用户定义的资源一致。这意味着自定义数字资产和Libra令牌受到同等保护。

但是需要注意的是,Move语言为数字资产提供的安全约束仅限于模块外部,模块内部的安全约束仍然需要开发者自己来保证。

灵活性

move语言的另一个特点是为天秤座提供了更高的灵活性,主要包括以下两个方面。为了方便理解,下面是以太坊和实度的对比。

交易脚本

以太坊中的交易包含目标智能合约的地址和提供给目标智能合约的输入数据。如果使用Solidity语言,输入数据的内容是函数签名和参数表。即以太坊的交易本质上是一个契约的接口(不考虑契约之间的调用)。

在Libra的交易中,交易脚本被替换。交易脚本是一个完整的移动程序,可以包含任何内容。在事务脚本中,可以多次调用已经发布到总账状态的模块的流程,根据调用结果做一些额外的本地处理,比如简单的控制流。

交易脚本为天秤座提供了极大的灵活性。用户不仅可以像以太坊一样调用一个模块中的过程,还可以轻松地执行一些一次性的行为。比如一次性给多人转账一个令牌,即使令牌的模块不提供批量转账的流程。

模块化系统

以太坊和Libra都使用基于帐户的分类帐状态。

在以太坊中,账户分为用户账户和合约账户。用户账号不包含数据(以太坊除外)。合同账户包含代码和数据。从面向对象的角度来看,以太坊的智能合约就像一个单例对象。由于数据无法直接存储在用户的账户中,以太坊上的大部分数字资产都实现了单一的ERC20令牌契约,契约中包含了所有用户的资产信息。

Libra可以使用Move模块实现类似智能合约的功能。但是Move模块在设计上不同于以太坊里蓑衣网小编2023的智能合约,应该更加灵活。Move模块只包含代码(包括资源结构定义和流程),数据存储在资源中。虽然对资源的操作需要通过模块中的流程来进行,但两者并不是捆绑在一起的。同类型的资源可以有好几个,发布在不同的账号下。所以在Libra中,数字资产是保存在用户自己的账户下,而不是像以太坊一样集中保管。此外,可以在一个移动模块中定义多个资源类型结构。

虽然Move中的模块、资源、过程之间的关系有点类似于面向对象编程中的类、对象、方法之间的关系,但实际上差别很大。Move模块的设计更像是函数式编程的风格。

安全性

Move的设计考虑了安全性,不符合安全性要求的Move程序将被拒绝。

类型化字节码

Move必须拒绝不符合关键安全属性(如资源安全、类型安全、内存安全等)的程序。),所以程序执行前需要在链上进行验证。为此,Move采用类型化的字节码作为可执行程序的格式。

类型化字节码介于高级语言和汇编语言之间。以以太坊为例,Solidity是一种高级语言,EVM字节码可以认为是汇编语言。虽然在坚固性上做了各种验证,但是可以保证编译出来的EVM字节码有一定的安全性。但由于EVM在执行时使用的是EVM字节码,而Solidity的安全保障实际上是在编译过程中发生的,所以如果要在链上验证,编译过程必须放在链上。 否则,攻击者可以完全绕过Solidity,直接编写有漏洞的EVM字节码。一方面,链上的编译过程必然会影响性能。另一方面,EVM字节码缺少数据类型信息,很难验证。综上所述,使用类型化的字节码既提供了安全保障,又避免了编译带来的性能损失。

更有利于静态验证的设计

出于计算成本的考虑,Move的链式验证只包含了一些关键的安全属性。除了链上验证之外,Move还支持高级的链外静态验证。为此,Move做了如下设计,这使得它比大多数常见语言更适合静态验证。

首先,Move不支持动态调度。可以静态地确定所有调用的目标。这使得Move能够准确推断程序的执行效果,而无需构建复杂的调用图。

第二,有限的可变性。Move借鉴了Rust的“借用检查”机制,保证每个值同时最多有一个变量引用。

第三,模块化。移动模块强制对资源的关键操作进行数据抽象和本地化。换句话说,对于模块外的程序,每个资源都是一个黑盒。外部代码无法知道资源的内部细节,只能通过模块的开放进程来操作资源。

虚拟机字节码解释器

Move字节码解释器是基于堆栈的,类似于CLR和JVM。指令使用堆栈中的操作数,并在执行后将结果推送到堆栈上。

Move支持六种字节码指令:将数据从局部变量复制和移动到堆栈的

操作,如CopyLoc和MoveLoc将数据从堆栈移动到局部变量的指令,如StoreLoc。对类型化堆栈值进行

操作,例如将常数推送到堆栈上,以及对堆栈操作数执行算术和逻辑操作。

模块相关的内置指令,如Pack和Unpack,用于创建和销毁模块声明类型;MoveToSender和MoveFrom用于发布和取消发布accounts下的模块类型;和BorrowField,它用于获取对模块中某一类型字段的引用。

引用相关的指令,如ReadRef用于读取引用,WriteRef用于写入引用,ReleaseRef用于释放引用,FreezeRef用于将变量引用转换为不可变引用。

控制流操作,如条件分支、过程调用和返回。

区块链特有的内置操作,比如获取交易脚本发送方的地址,创建新账户。

另外,Move还提供了密码原语,比如sha3。这些原语是由标准库中的模块实现的,而不是字节码指令。

字节码验证器

字节码验证器强制模块和事务脚本的安全属性。如果没有通过字节码验证程序,就不能发布模块或者执行事务脚本。

字节码验证器主要从三个方面进行检查。

结构检查以确保字节码表的格式是正确的。通过结构检查,我们可以发现诸如非法表索引、重复表条目、非法类型签名等错误。

语义检查用于查找非法参数、危险引用、资源复制等错误。

链接。通过将使用的结构类型和流程签名与其声明模块相关联,可以发现内部过程的非法调用、过程与定义不匹配等错误。在此过程中,将访问全球分类帐状态。

总结

以上是对Move语言的简要解读,希望能让读者对Move语言的主要特性和设计有一个基本的了解。本文如有错误,请不吝指正。

Facebook加密数字货币项目Libra区块链编程语言解读 | 分享给朋友: