快捷搜索:  as  xxx

Libra区块链编程语言解读。

数字资产治理

Move最吸引眼球的特点是它提出的一套完备的面向数字资产的编程体系。与现有的区块链编程说话比拟,Move着重强化了数字资产的职位地方。应用Move说话,开拓者能够更机动、安然地在链上定义和治理数字资产。

面临的寻衅

在区块链上定义数字资产具有寻衅性。由于物理天下中资产的一些特点,难以在数字天下进行表达。

稀缺性:资产的供应该当受到管控。资产不能被复制,创建新的资产是特权行径。

造访节制:系统要能够确保介入者自身的资产受到造访节制策略的保护。

现有办理规划

现有的区块链编程说话都具备在区块链上定义数字资产的能力,但仍具有一些不够和局限。下面以比特币和以太坊为例,作一个简要的阐明。

比特币经由过程UTXO的要领对其资产进行编码,并应用比特币脚原先定义资产的转移规则,确保稀缺性和造访节制。开拓者可以应用比特币脚原先定义各类不合的造访节制策略。

然而,比特币脚本具有相称的局限性,扩展性很差。比特币脚本不是图灵完整的说话,开拓者也不能在此中自定义数据类型和历程等。是以,想要在比特币区块链上定义一种新的数字资产,或者实现更繁杂的造访节制策略,只能借助一些外部的手段,对开拓者不友好。

以太坊应用数值代表以太币,并在系统层面包管了以太币的稀缺性和造访节制。开拓者可以应用EVM字节码来编写智能合约,与链上的数字资产进行交互。EVM字节码是一种图灵完整的说话,具有很强的扩展性。开拓者不仅可以应用它操作以太币,也可以自定义数字资产,编写繁杂的造访节制策略。此外,也可以应用更高档的Solidity说话来编写智能合约,Solidity代码在运行之前会被编译为EVM字节码。

然而,在以太坊中,自定义的数字资产的级别要低于以太币。以太币的安然性有系统级其余保护,而自定义数字资产的安然性只能由开拓者来保障。无论是底层的EVM字节码照样高档的Solidity,开拓者都只能用数值来间接代表数字资产。因为在编程说话的层面没有对稀缺性和造访节制供给支持,开拓者在编码历程中很轻易发生差错,从而导致严重的后果,比如资产的复制、重用和损掉等。

一等资本

针对上述问题,Move提出了一等资本的观点。开拓者不仅可以使用一等资本来实现安然的数字资产,也可为数字资产编写精确的营业逻辑。

Move将数字资产与其他数据类型(如整数、布尔等)区分开来,将其定义为资本类型。资本类型的语义受到了线性逻辑的启迪:一个资本不能被复制,也不能被隐式的丢弃(即在法度榜样停止时,资本处于无所属的状态),只能进行转移。除了上述差别以外,资本类型在其他方面与通俗的数据类型一样,都可以保存在数据布局中,可以作为历程的参数等。

Move应用模块对资本进行治理。首先,资本的类型布局定义在模块中,每个资本都一定定义在某个模块中。其次,模块中还定义了能够操作该资本的历程,例如创建、改动、销毁等。开拓者可以且只能经由过程模块供给的公开历程来对资本进行操作,不能自行编码改动资本。也便是说,当应用资本来定义一种数字资产时,其所有的营业逻辑,包括造访节制策略,均已经在模块中定义。而任何离开、绕过该模块对数字资产进行的操作都是不法的、不被容许的。

在Libra区块链中,Libra代币也被定义为一个资本类型,与用户自定义的资本同等。这意味着自定义数字资产与Libra代币都受到了同样的保护。

不过,必要留意的是,Move说话对数字资产供给的安然性约束仅限于模块之外,模块内部的安然性约束仍旧必要开拓者自行包管。

机动性

Move说话的另一个特征是其为Libra供给了更高的机动性,主要包孕以下两个方面。为便于理解,下文应用以太坊及Solidity说话作对照。

买卖营业脚本

以太坊的买卖营业中,包孕了目标智能合约的地址,以及供给给目标智能合约的输入数据。假如应用Solidity说话,则该输入数据的内容为函数署名以及参数列表。即,以太坊中的一笔买卖营业,实质上是调用了一个合约的一个接口(不斟酌合约间的调用)。

在Libra的买卖营业中,取而代之的是买卖营业脚本。买卖营业脚本是一段完备的、随意率性内容的Move法度榜样。在买卖营业脚本中,可以调用已经宣布在账本状态中的模块的历程多少次,并基于调用的结果做一些额外的本地处置惩罚,例如简单的节制流等。

买卖营业脚本为Libra供给了极大年夜的机动性。用户不仅可以像以太坊那样,调用某个模块的中的历程,还可以很随意马虎地履行一些一次性的行径。例如,一次性将某个代币转账给多小我,纵然该代币的模块没有供给批量转账的历程。

模块系统

以太坊和Libra均应用了基于账户的账本状态。

在以太坊中,账户分为用户账户和合约账户。用户账户不包孕数据(以太币除外)。合约账户中,既包孕了代码,又包孕了数据。从面向工具的角度来看,以太坊的智能合约就像是单例工具。因为数据无法直接保存在用户账户中,以太坊上的大年夜多半数字资产,都实现了一个零丁的ERC20 Token合约,在此中包孕了所有用户的资产信息。

Libra中可以使用Move模块实现类似智能合约的功能。但Move模块与以太坊中的智能合约在设计上并不相同,要更为机动。Move模块仅包孕代码(包括资本布局定义和历程),而数据保存在资本中。虽然对资本的操作必要经由过程模块中的历程来进行,但二者并没有绑缚在一路。同一类型的资本可以有多少个,并且宣布在不合的账户下。是以,在Libra中,数字资产保存在用户自己的账户下,而不是像以太坊一样集中保存。此外,可以在一个Move模块中定义多种资本类型布局。

虽然Move中模块、资本、历程的关系与面向工具编程中类、工具、措施的关系有些相像,但实际上有很大年夜的差别。Move模块的设计更像是函数式编程的风格。

安然性

Move在设计时充分斟酌了安然性,不相符安然性要求的Move法度榜样将会被拒之门外。

类型化的字节码

Move必须回毫不满意关键安然属性(如资本安然性、类型安然性、内存安然性等)的法度榜样,是以必要在法度榜样履行之提高行链上验证。为此,Move采纳了类型化的字节码作为可履行法度榜样的款式。

类型化的字节码介于高档说话和汇编说话之间。以以太坊为例,Solidity是一种高档说话,而EVM字节码可以觉得是汇编说话。Solidity中虽然也做了各类各样的验证,能够包管编译出的EVM字节码具有必然的安然性。然而,因为EVM在履行时所应用的是EVM字节码,而Solidity对安然性的包管实际上发生在编译历程中,若要进行链上验证,则必须把编译历程放到链上。否则,进击者完全可以绕过Solidity,直接编写具有破绽的EVM字节码。一方面,编译历程在链长进行势必会对机能造成影响。另一方面,EVM字节码短缺数据类型信息,难以进行验证。综上所述,采纳类型化的字节码,既供给了安然包管,也避免了编译带来的机能损耗。

更利于静态验证的设计

出于谋略资源的斟酌,Move的链上验证仅包孕了部分关键的安然属性。除了链上验证,Move也被设计为支持高档的链下静态验证。为此,Move做了以下设计,使其连大年夜多半通用说话更得当静态验证。

首先,Move不支持动态调整。所有调用的目标都能够被静态确定。这使得Move不必构建繁杂的调用图,就能正确地揣摸出法度榜样的履行效果。

其次,有限的可变性。Move借鉴了Rust的“借用反省”机制,确保每个值在同一时候最多有一个可变引用。

第三,模块性。Move模块对资本进行了强制的数据抽象和关键操作本地化。也便是说,对付模块以外的法度榜样来说,每个资本都是一个黑盒。外部代码无法得知资本内部的细节,只能经由过程模块的公开历程对资本进行操作。

虚拟机

字节码说冥器

Move字节码说冥器是基于客栈的,与CLR和JVM类似。指令应用客栈中的操作数,并在履行后将结果推入客栈。

Move支持六大年夜类字节码指令:

· 用于将数据从局部变量复制、移动到客栈的操作,如CopyLoc、MoveLoc等,以及用于将数据从客栈移动到局部变量的指令,如StoreLoc。

· 对类型化客栈值的操作,例如将常量推入客栈,以及对客栈操作数进行算术、逻辑运算。

· 模块相关的内建指令,例如:Pack和Unpack,用于创建、销毁模块的声明类型;MoveToSender、MoveFrom,用于在帐户下宣布、取消宣布模块的类型;以及BorrowField,用于获取对模块中某个类型的字段的引用。

· 引用相关的指令,例如:ReadRef用于读引用,WriteRef用于写引用,ReleaseRef用于开释引用,FreezeRef用于将可变引用转换为弗成变引用。

· 节制流操作,例如前提分支,以及历程调用和返回。

· 区块链特定的内建操作,例如获取买卖营业脚本的发送者地址、创建新帐户等。

除此之外,Move也供给了密码学原语,比如sha3。这些原语由标准库的模块实现,而不是字节码指令。

字节码验证器

字节码验证器为模块和买卖营业脚本强制履行安然属性。假如不经由过程字节码验证法度榜样,则无法宣布模块或履行买卖营业脚本。

字节码验证器主要进行三个方面的反省。

· 布局反省,确保字节码表的款式精确。经由过程布局反省,可以发明诸如不法表索引、重复表条款、不法类型署名等差错。

· 语义反省,用于发明不法参数、危险引用、资本复制等差错。

· 链接。经由过程将所用到的布局类型、历程署名与其声明模块关联,从而发明不法调用内部历程、历程与定义不匹配等差错。在此历程中,会造访全局账本状态。

您可能还会对下面的文章感兴趣: