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

相关文章

解决Maven项目报错:failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.13.0的问题

《解决Maven项目报错:failedtoexecutegoalorg.apache.maven.plugins:maven-compiler-plugin:3.13.0的问题》这篇文章主要介... 目录Maven项目报错:failed to execute goal org.apache.maven.pl

Python开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3

SpringBoot项目中报错The field screenShot exceeds its maximum permitted size of 1048576 bytes.的问题及解决

《SpringBoot项目中报错ThefieldscreenShotexceedsitsmaximumpermittedsizeof1048576bytes.的问题及解决》这篇文章... 目录项目场景问题描述原因分析解决方案总结项目场景javascript提示:项目相关背景:项目场景:基于Spring

解决Maven项目idea找不到本地仓库jar包问题以及使用mvn install:install-file

《解决Maven项目idea找不到本地仓库jar包问题以及使用mvninstall:install-file》:本文主要介绍解决Maven项目idea找不到本地仓库jar包问题以及使用mvnin... 目录Maven项目idea找不到本地仓库jar包以及使用mvn install:install-file基

springboot项目如何开启https服务

《springboot项目如何开启https服务》:本文主要介绍springboot项目如何开启https服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录springboot项目开启https服务1. 生成SSL证书密钥库使用keytool生成自签名证书将

将Java项目提交到云服务器的流程步骤

《将Java项目提交到云服务器的流程步骤》所谓将项目提交到云服务器即将你的项目打成一个jar包然后提交到云服务器即可,因此我们需要准备服务器环境为:Linux+JDK+MariDB(MySQL)+Gi... 目录1. 安装 jdk1.1 查看 jdk 版本1.2 下载 jdk2. 安装 mariadb(my

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

springboot项目中常用的工具类和api详解

《springboot项目中常用的工具类和api详解》在SpringBoot项目中,开发者通常会依赖一些工具类和API来简化开发、提高效率,以下是一些常用的工具类及其典型应用场景,涵盖Spring原生... 目录1. Spring Framework 自带工具类(1) StringUtils(2) Coll

Spring Boot项目部署命令java -jar的各种参数及作用详解

《SpringBoot项目部署命令java-jar的各种参数及作用详解》:本文主要介绍SpringBoot项目部署命令java-jar的各种参数及作用的相关资料,包括设置内存大小、垃圾回收... 目录前言一、基础命令结构二、常见的 Java 命令参数1. 设置内存大小2. 配置垃圾回收器3. 配置线程栈大小

Spring Boot项目中结合MyBatis实现MySQL的自动主从切换功能

《SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能》:本文主要介绍SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能,本文分步骤给大家介绍的... 目录原理解析1. mysql主从复制(Master-Slave Replication)2. 读写分离3.