关于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

相关文章

javafx 如何将项目打包为 Windows 的可执行文件exe

《javafx如何将项目打包为Windows的可执行文件exe》文章介绍了三种将JavaFX项目打包为.exe文件的方法:方法1使用jpackage(适用于JDK14及以上版本),方法2使用La... 目录方法 1:使用 jpackage(适用于 JDK 14 及更高版本)方法 2:使用 Launch4j(

Docker集成CI/CD的项目实践

《Docker集成CI/CD的项目实践》本文主要介绍了Docker集成CI/CD的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、引言1.1 什么是 CI/CD?1.2 docker 在 CI/CD 中的作用二、Docke

SpringBoot项目引入token设置方式

《SpringBoot项目引入token设置方式》本文详细介绍了JWT(JSONWebToken)的基本概念、结构、应用场景以及工作原理,通过动手实践,展示了如何在SpringBoot项目中实现JWT... 目录一. 先了解熟悉JWT(jsON Web Token)1. JSON Web Token是什么鬼

手把手教你idea中创建一个javaweb(webapp)项目详细图文教程

《手把手教你idea中创建一个javaweb(webapp)项目详细图文教程》:本文主要介绍如何使用IntelliJIDEA创建一个Maven项目,并配置Tomcat服务器进行运行,过程包括创建... 1.启动idea2.创建项目模板点击项目-新建项目-选择maven,显示如下页面输入项目名称,选择

Jenkins中自动化部署Spring Boot项目的全过程

《Jenkins中自动化部署SpringBoot项目的全过程》:本文主要介绍如何使用Jenkins从Git仓库拉取SpringBoot项目并进行自动化部署,通过配置Jenkins任务,实现项目的... 目录准备工作启动 Jenkins配置 Jenkins创建及配置任务源码管理构建触发器构建构建后操作构建任务

Nginx、Tomcat等项目部署问题以及解决流程

《Nginx、Tomcat等项目部署问题以及解决流程》本文总结了项目部署中常见的four类问题及其解决方法:Nginx未按预期显示结果、端口未开启、日志分析的重要性以及开发环境与生产环境运行结果不一致... 目录前言1. Nginx部署后未按预期显示结果1.1 查看Nginx的启动情况1.2 解决启动失败的

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定