关于Facebook推出Libra项目,百度超级链XUPER有些要说的

2023-10-08 21:10

本文主要是介绍关于Facebook推出Libra项目,百度超级链XUPER有些要说的,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Facebook推出Libra项目产生了刷屏级的影响,一时间信息爆炸,观点纷至。关于Libra具体操作模式、落地场景、影响面、如何与监管交互等讨论已经很多。这次,我们想为关注国际区块链发展的开发者、爱好者们带来点不一样的!


百度超级链XUPER致力于国产自研的区块链技术研发,并积极推动区块链的商业化落地。在底层区块链技术上拥有120余篇专利保护,在超级节点、链内并行、立体网络、可插拔共识机制等技术上实现国产自主创新。


保持一直以来对区块链技术关注,百度的研发工程师们发现,Libra采用了一种全新的move语言,其核心是从设计上防止数字资产被复制,降低了出现意外漏洞或安全事件的风险。


怀着交流学习的态度,

冒着掉发秃头的风险,

百度研发工程师熬夜熬夜熬夜写稿,

为大家献上了这份热腾腾的move语言解读。

本期主讲“move基础介绍”,

未来将陆续推出“move语言语法”“move解释器”“静态代码验证器”等,

欢迎持续关注~


Libra白皮书中关于move语言的描述

Libra 区块链的三项决策:

1. 设计和使用 Move 编程语言。

2. 使用拜占庭容错 (BFT) 共识机制。

3. 采用和迭代改善已广泛采用的区块链数据结构。  

    

“Move”是一种新的编程语言,用于在 Libra 区块链中实现自定义交易逻辑和“智能合约”。由于 Libra 的目标是每天 为数十亿人服务,因此 Move 的设计首先考虑到安全性和可靠性。Move 是从迄今为止发生的与智能合约相关的安 全事件中吸取经验而创造的一种编程语言,能从本质上令人更加轻松地编写符合作者意图的代码,从而降低了出现 意外漏洞或安全事件的风险。具体而言,Move 从设计上可防止数字资产被复制。它使得将数字资产限制为与真实资 产具有相同属性的“资源类型”成为现实:每个资源只有唯一的所有者,资源只能花费一次,并限制创建新资源。Move 语言还便于自动验证交易是否满足特定属性,例如,仅更改付款人和收款人帐户余额的付款交易。通过优先实现这 些特性,Move 可帮助保持 Libra 区块链的安全性。通过减轻关键交易代码的开发难度,Move 可以可靠地执行 Libra 生态系统的管理政策,例如对 Libra 货币和验证者节点网络的管理。Move 将加快 Libra 区块链协议以及在此基础上 构建的任何金融创新的演变。我们预计将在一段时间后向开发者开放创建合约的权限,以支持 Move 的演变和验证。


下面进入百度研发工程师带来的move语言介绍


Move是一门强类型的字节码语言,基于栈式虚拟机设计,受Linear Logic类型系统的启发,将资源(数字资产)作为第一等公民,借助所有权转移和最多一次可变引用等规则保证资产安全。名字Move的来历也就自然而然可以理解了。

三个大特点

1. first-class resouces. 用资源表示数字资产是一等公民,然后通过语法借助borrow check等思路在合约编译期间保证资产的不可双花,不可消失,必有归属性;

2. flexibility 通过交易脚本来定义单个交易里面的一次性(不可重用)合约逻辑,交易脚本定义了合约的main函数,可以插入多个module实现复杂逻辑和可重用逻辑。合约的结构原语modules/resources/procedure,类比与面向对象的class/object/method,同时通过module做合约资源的声明周期管理,极大的提升了合约可复用性和安全性。

3. 强类型的字节码,在字节码层面的静态代码检查保证运行时的大多数错误都在编译期间被发现。Move没有动态指派(dynamic dispath),函数调用完全是在编译期间确定,没有什么类似c++的RTTI的机制,这样验证工具可以快速构建调用图验证,borrow check保证资源任何时候只有一个muttable引用,这样写操作就可以被严格检验。保证足够安全。

Move实例介绍

先举个Move写的合约例子:

public main(payee: address, amount: u64) {  let coin: 0x0.Currency.Coin = 0x0.Currency.withdraw_from_sender(copy(amount));  0x0.Currency.deposit(copy(payee), move(coin));}

合约接受2个参数转账接收人payee和转账金额amount。0x0表示账户地址,Currency表示module, 0x0.Currency.Coin表示资源类型,0x0.Currency.withdraw_from_sender这个procedure(过程)返回一个0x0.Currency.Coin类型的值coin,然后通过deposit这个过程,将coin转移到payee的地址下面去。 借助于linear logic的转移原则, 限制资源(数字资产的)的不可重用(只能转移一次),不可复制(不能copy资源)以及不可丢失(转移之后必有地址接受)。

Move通过一个地址到账户的map来表示global state。如下:

640?wx_fmt=jpeg

包含3个账户的global state的示意图

在一个账户里面,可以包含多个module或者resouces,但是不能同名,虽然不能同名,但是可以在一个账户里面,同时持有2个地址下面相同类型名的实例。例如:

resource TwoCoins { c1: 0x0.Currency.Coin, c2: 0x0.Currency.Coin })

例如声明一个名叫Coin资源如下:

module Currency {   resource Coin { value: u64 }// ...}

默认情况下,Coin是private的,外部需要通过module暴露的其他接口(实际操作的语义最终也只能是move)才能被访问,并且权限完全由module的创建者控制。

deposit的实现如下:

public deposit(payee: address, to_deposit: Coin) {  let to_deposit_value: u64 = Unpack<Coin>(move(to_deposit));  let coin_ref: &mut Coin = BorrowGlobal<Coin>(move(payee));  let coin_value_ref: &mut u64 = &mut move(coin_ref).value;  let coin_value: u64 = *move(coin_value_ref);  *move(coin_value_ref) = move(coin_value) + move(to_deposit_value);}

详细解释为:

  1. move(to_deposit)将销毁sender的to_deposit这个资源,并且将其存储在一个局部变量to_deposit_value上;

  2. 在接受人的空间下面创建一个引用coin_ref,然后创建一个存储coin_ref的value的可变引用coin_value_ref,

  3. 取出coin_value_ref的value,将其跟to_deposit_value相加,将结果存回到coin_value_ref。

其中注意的是,Unpack<T>是Move内嵌的用户销毁类型为T的变量,然后返回T的具体字段的值的procedure。BorrowGlobal返回一个Coin的资源的引用。

然后在看下withdraw_from_sender的实现:

public withdraw_from_sender(amount: u64): Coin {  let transaction_sender_address: address = GetTxnSenderAddress();  let coin_ref: &mut Coin = BorrowGlobal<Coin>(move(transaction_sender_address));  let coin_value_ref: &mut u64 = &mut move(coin_ref).value;  let coin_value: u64 = *move(coin_value_ref);  RejectUnless(copy(coin_value) >= copy(amount));  *move(coin_value_ref) = move(coin_value) - copy(amount);  let new_coin: Coin = Pack<Coin>(move(amount));  return move(new_coin);}

几乎是deposit的逆过程,流程如下:

  1. 获得转账发起方的地址,然后获得其Coin资源的实际的value, code_value;

  2. 从coin_value减去amount个币;

  3. 然后条用Pack创建一个新的Coin资源并且传回去。

综上可以看到,BorrowGlobal可以验证account是否有权限获得一个资源的引用(意味着马上要进行修改),然后通过Unpack实际的资源的value然后销毁资源,或者Pack来新建新的资源。然后上面各种语法&mut之类的,建议大家看看rust就好懂了。

下一节介绍Move语言的语法。


如果你对百度超级链(Xuper)技术及应用感兴趣,

欢迎添加“百度超级链·小助手“微信,进入微信群交流。

或者拨打合作咨询电话+86-10-59924296

640?wx_fmt=png

微信号:image-baidu

这篇关于关于Facebook推出Libra项目,百度超级链XUPER有些要说的的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/167983

相关文章

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

配置springboot项目动静分离打包分离lib方式

《配置springboot项目动静分离打包分离lib方式》本文介绍了如何将SpringBoot工程中的静态资源和配置文件分离出来,以减少jar包大小,方便修改配置文件,通过在jar包同级目录创建co... 目录前言1、分离配置文件原理2、pom文件配置3、使用package命令打包4、总结前言默认情况下,

python实现简易SSL的项目实践

《python实现简易SSL的项目实践》本文主要介绍了python实现简易SSL的项目实践,包括CA.py、server.py和client.py三个模块,文中通过示例代码介绍的非常详细,对大家的学习... 目录运行环境运行前准备程序实现与流程说明运行截图代码CA.pyclient.pyserver.py参

IDEA运行spring项目时,控制台未出现的解决方案

《IDEA运行spring项目时,控制台未出现的解决方案》文章总结了在使用IDEA运行代码时,控制台未出现的问题和解决方案,问题可能是由于点击图标或重启IDEA后控制台仍未显示,解决方案提供了解决方法... 目录问题分析解决方案总结问题js使用IDEA,点击运行按钮,运行结束,但控制台未出现http://

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

SpringBoot项目中Maven剔除无用Jar引用的最佳实践

《SpringBoot项目中Maven剔除无用Jar引用的最佳实践》在SpringBoot项目开发中,Maven是最常用的构建工具之一,通过Maven,我们可以轻松地管理项目所需的依赖,而,... 目录1、引言2、Maven 依赖管理的基础概念2.1 什么是 Maven 依赖2.2 Maven 的依赖传递机

Vue项目中Element UI组件未注册的问题原因及解决方法

《Vue项目中ElementUI组件未注册的问题原因及解决方法》在Vue项目中使用ElementUI组件库时,开发者可能会遇到一些常见问题,例如组件未正确注册导致的警告或错误,本文将详细探讨这些问题... 目录引言一、问题背景1.1 错误信息分析1.2 问题原因二、解决方法2.1 全局引入 Element

Python 中 requests 与 aiohttp 在实际项目中的选择策略详解

《Python中requests与aiohttp在实际项目中的选择策略详解》本文主要介绍了Python爬虫开发中常用的两个库requests和aiohttp的使用方法及其区别,通过实际项目案... 目录一、requests 库二、aiohttp 库三、requests 和 aiohttp 的比较四、requ