自去年矿难以来,业界充满了对区块链唱衰的声音,链圈有很多人都开始对区块链的价值产生怀疑。而Facebook不断爆出的区块链项目的消息可谓是给链圈打了一剂强心针,盼望着,盼望着,今年6月,Facebook发布了加密货币Libra的白皮书并上线了官网。可以预见,Libra离落地不远了。
Libra以非营利组织的形式管理,其创始成员包括大名鼎鼎的银行卡巨头Visa,万事达,以及传统在线支付巨头PayPal,颇有挑战当下全球金融货币体系的趋势。
Libra最近越来越火。不少开发人员已经开始跟进Libra项目,希望在这个全球性的区块链项目中抢占先机。而Libra的编程语言Move则是开发人员眼中的重中之重。
为了帮助开发人员做好入门工作,加州大学伯克利分校区块链实验室研究学者,TuringChain联合创始人兼首席技术官LeeTingTing从开发人员的角度分析了Move语言的典型特征以及它与以太坊Solidity的异同,为我们带来了这篇Move语言的入门指南。
Move语言的白皮书长达26页,本篇文章是对该白皮书的精华介绍,文中也会直接放出一些白皮书上的原文。Move是Facebook公司为其加密货币产品Libra开发的全新编程语言。
作为开发人员和区块链社区爱好者,希望通过这篇文章帮助你快速入门Move语言。
关于Move
Move是一种用于实现Libra自定义交易和智能合约的可执行的字节码语言。
它与以太坊Solidity语言有以下两个区别:
Move是一种字节码语言,它可以直接在Move虚拟机中运行,而以太坊的Solidity语言是一种更高级别的语言,它需要先编译成字节码再加入到以太坊虚拟机中运行。
Move语言不仅可以用来实现智能合约,还可以用来实现自定义交易,而Solidity语言只能用来实现以太坊中的智能合约。
Move语言的一个关键特性是它能够定义受线性逻辑启发的带语义的自定义资源类型。在这种情况下资源永远不会被复制或被隐式丢弃,它只能在程序的存储位置之间转移。
安全公司:Telegram交易机器人给用户带来了重大安全风险:金色财经报道,据区块链安全公司称,Telegram交易机器人已将消息传递平台变成了准加密货币市场,给用户带来了重大安全风险,需要进一步审查。区块链安全公司CertiK表示,虽然此类交易机器人已经存在多年,但随着加密货币市场的增长和相关机器人代币价格的上涨,它们最近受到了关注。据Coin Gecko称,截至撰写本文时,Telegram机器人代币的总市值已接近2.5亿美元。其中最大的是Unibot;其他流行的机器人包括Wagie Bot和Mizar。这些机器人是通过Telegram运行的自动化程序,允许用户通过应用程序向去中心化交易所(DEX)发送消息来进行交易。[2023/8/11 16:19:37]
这是一个与Rust语言类似的特性。Rust语言中的数值一次只能分配给一个命名。如果你将某个数值分配给其他命名则将无法再使用之前的命名访问到该数值。
就比如说,下面这段代码将会输出一个错误:使用转移了的值“x”。
这是因为Rust语言没有垃圾回收机制。当变量超出范围时,变量引用的内存也会被释放。
这样解释有点麻烦,为了简单起见,我们可以这样来理解,每个数据在同一时间内只能有一个“所有者”。在这个例子中,x是数据初始的所有者,后来y也成了数据的所有者,所以程序会报错,如下面代码所示。
在开放系统中编码数字资产
将现实世界中的物理资产编码成区块链上的数字资产,主要存在两大难题:
稀缺性:区块链系统中资产的供应应该受到严格管控。应该禁止复制现有的资产,同时也应该禁止普通用户随意创建新资产。
访问控制:区块链系统中的参与者应该能够使用访问控制策略保护自己的资产。
这也是所有数字资产都需要实现的两个关键特性,这些特性被认为是现实世界中物理资产的自然表征。就比如说,现实世界中稀有金属就是很稀缺的,在现实世界中你只能花属于自己的钱,换句话说就是自己有访问权限的钱。
为了更好地阐述这两个关键特性是如何实现的,让我们先从以下三个示例说起:
去中心化交易平台Spin将向早期用户提供空投:11月22日消息,基于NEAR Protocol的去中心化交易平台Spin现已正式确认将向早期用户提供空投,并将在本周公布更多关于空投的细节和线索。
据悉,Spin成立于2021年6月,致力于为链上衍生品交易构建多链解决方案。[2022/11/22 7:55:55]
示例1:不考虑稀缺性和访问控制的最简单的规则
左边为交易脚本的格式,右边为区块链状态的评估规则
G:=n表示使用加密货币数额n来更新账户K在区块链全局状态中存储的加密货币余额。
transaction?Alice,100?表示将Alice的账户余额设置为100。
上述的实现方式存在两个很严重的问题:
Alice可以通过不断发起交易transaction?Alice,100?让自己拥有无限多的加密货币。
Alice与Bob之间的加密货币转账也变得毫无意义,因为Bob也可以使用相同的手段向自己发送无限多的加密货币。
示例2:在数字资产中加入稀缺性
左边为交易脚本的格式,右边为区块链状态的评估规则
现在我们强制要求在交易发起时发起方Ka的账户余额至少为交易的金额n。
虽然这种实现方式可以解决稀缺性的问题,但是现在还存在一个问题,就是你可以将任何人的加密货币余额转给自己,这是因为我们还没有加入对谁能发起交易的检查,也就是对加密货币所有权的检查。
示例3:在数字资产中同时加入稀缺性和访问控制
左边为交易脚本的格式,右边为区块链状态的评估规则
为了实现加密货币的访问控制,我们可以在稀缺性检查之前使用数字签名机制verify_sig来检查所交易加密货币的所有者,这意味着Alice可以使用她的私钥来签署交易并证明她是所交易加密货币的所有者。
现有的区块链编程语言
现有的区块链编程语言往往都会被以下问题所困扰,令人欣慰的是,Move语言完美地解决了所有这些问题。主要体现在以下两方面。
Cory Van Lew 称某大型拍卖行拖欠其拍卖款,用户猜测其或为苏富比:5月20日消息,数字艺术家 Cory Van Lew 在推特爆料称,某大型拍卖行从去年 10 月起就一直在拖欠其艺术品的拍卖款,目前已聘请了律师解决该问题。Cory Van Lew 表示,这就是为什么区块链对艺术家如此有价值,他可以通过区块链建立自己的拍卖平台而无需受限于传统的销售方式。另一位艺术家 Drift 表示该拍卖行或为苏富比,而苏富比也存在拖欠其拍卖款的情况,但 Drift 发表的该条推特目前已被删除。[2022/5/20 3:30:48]
间接地表示资产。有些区块链编程语言使用整数对数字资产进行编码。这种编码方式十分牵强,因为这些整数值与数字资产根本就不是一回事。事实上,这些区块链中并没有任何类型或数值来表示比特币/以太币/山寨币!这使得编写与数字资产交互的智能合约变得十分笨拙且容易出错。在这些区块链中实现诸如资产转入/转出以及将资产存储在数据结构中这样的操作都需要特殊的语言支持。
稀缺性是不可扩展的。这些语言往往只能表示一种稀缺资产。除此之外,稀缺性保护直接在语言语义中进行硬编码。开发人员如果想要创建一个自定义的资产,遗憾的是他得不到该语言的一丝帮助,他将不得不重复造轮子,重新实现资产的稀缺性。
相信你可能已经看出来了,这些正是以太坊智能合约中存在的问题。ERC-20通证等自定义资产使用整数来表示资产和总供应量。每当生成新的通证时,智能合约代码必须手动检查交易是否满足稀缺性。
此外,资产的间接表示会给区块链带来很多的问题,就比如说资产复制、资产重复使用、资产意外丢失等漏洞。
当然,除了上面两点以外,还包括:访问控制不够灵活。
这些区块链强制执行的访问控制策略只有基于公钥的数字签名方案。与稀缺性保护一样,访问控制策略也被深深嵌入到语言语义中。
如果开发人员想要设置自定义的访问控制策略,那么他还是会陷入重复造轮子的困境。
以太坊也存在这样的问题。以太坊智能合约缺乏对使用公钥私钥密码学实现访问控制的本地语言支持。面对这种需求。开发人员不得不手动编写访问控制,就比如说使用OnlyOwner函数。
库币回应MASK开盘溢价:将补贴溢价买入用户:据官方消息,2月24日,Mask Network (MASK)上线库币并开启交易。由于开盘时MASK的流通量较少且项目本身热度较高,库币平台的开盘初期价格出现较高溢价,导致部分开盘初期买入MASK的用户亏损。
对此,库币已发布补贴方案,对于2月24日11:15PM之前净买入(净买入量:买入量 - 卖出量)的成本高于51 USDT(交易开始前15分钟的成交均价)的用户,库币将按照51 USDT为用户补贴溢价损失。同时,库币官方也表示,将对新项目开盘流程进行优化,以避免未来类似事件的发生。[2021/2/25 17:51:34]
尽管我是以太坊的忠实粉丝,但我坚持认为以太坊在这些资产属性方面存在欠缺。从安全方面考虑,这些资产属性本应得到原生的语言支持。
特别是,将以太坊转移到智能合约中需要用到动态分派(dynamicdispatch,处理编程语言的语言方法调用的一种计算机制),这又会带来一类新的漏洞:可重入性漏洞。
这里的动态分派意味着代码的执行逻辑将在代码运行时确定,而不是在代码编译时确定。
因此,在Solidity语言中,当智能合约A调用智能合约B的函数时,智能合约B可能会运行智能合约A的设计者从未预料到的代码,这可能会导致可重入性的漏洞。
Move语言的设计目标
一流的资源
从较高的层次上来说,Move语言中模块/资源/程序之间的关系类似于面向对象语言中的类/对象/方法之间的关系。
Move语言中的模块类似于其他区块链语言中的智能合约。模块声明资源类型和程序,而这些资源类型和程序编码用于创建,销毁和更新所声明资源的规则。
模块/资源/程序只是Move语言中的一些术语。下文中我们将会用一个例子来介绍它们。
灵活性
Move通过交易脚本为Libra增加了很多灵活性。每笔Libra交易都包含一个交易脚本,该脚本实际上是交易的核心。
交易脚本可以用来执行一次性的行为,也可以用来执行可重用的行为。
从上面我们可以看出,Move的交易脚本通过同时支持一次性的行为和可重用的行为为Libra引入了更多的灵活性,而以太坊只能执行可重用的行为。
以太坊被称为“可重用”的原因是智能合约中的函数可以被多次执行。
安全性
Move的可执行格式是一种类型化的字节码,它比汇编语言更高级但比源语言更低级。在区块链上字节码验证器会检查字节码的资源,类型以及内存安全性,然后字节码解释器会直接执行字节码。这种设定使得Move在提供与源语言相关联的安全保证的同时,省去了将源编译器添加到可信计算基础(TrustedComputingBase,TCB)以及编译到交易执行的关键路径的成本。
将Move构建成一种字节码语言确实是一种非常简洁的设计。由于它不需要像Solidity一样从源代码编译成字节码,因此不必担心编译器中可能出现的故障或漏洞。
可验证性
我们的方法是尽可能多地在区块链上执行核心安全属性的轻量级验证,但同时我们也在Move语言中加入了对链下高级静态验证工具的支持。
从这里我们可以看出Move更倾向于执行静态验证而不是在区块链上执行验证工作。尽管如此,正如白皮书末尾所述,Libra团队未来将会开发完善验证工具。
模块化
Move模块强制执行数据抽象并本地化执行资源的关键性操作。模块启用的封装与Move类型系统强制执行的保护相结合,强强联手可以确保模块外部的代码不能违反模块类型规定的属性。
这是一个非常好的数据抽象设计!这意味着智能合约中的数据只能在智能合约范围内修改,而不能在外部修改。
Move语言实操
这个交易脚本的示例说明了模块外部的恶意开发人员或粗心的开发人员不可能违反模块资源的关键安全不变性。
这一部分中我们将讨论在进行Move语言开发时,实际使用到的模块、资源和程序分别是什么东西。
点对点支付交易脚本
Move语言的点对点支付交易脚本,如下面代码所示:
amount表示所交易加密货币的金额,这些加密货币将从交易的发起方转移给接收方payee。
代码中有几个新的符号,其中红色的小字是我记的笔记:
0x0:存储模块的帐户地址
currency:模块的名称
coin:资源类型
程序返回的coin值是一个类型为0x0.Currency.Coin的资源值
move:该值不能再次使用
copy:该值可以再次使用
代码功能解读:
在第一步中,发送方从存储在0x0.Currency的模块中调用了名为withdraw_from_sender的程序。
在第二步中,发送方通过将加密货币的资源值转移到0x0.Currency模块的存款程序中从而将资金转移给收款人。
以下是三种会报错的代码示例:
1.通过将转移加密货币move(coin)替换为复制加密货币copy(coin)来复制加密货币。
资源值只能被转移。尝试复制资源值将在字节码验证时引起错误。
因为coin是一个资源值,所以它只能被转移。
2.通过两次转移加密货币move(coin)来重复使用加密货币。
在上述的示例代码中加入一行:
0x0.Currency.deposit,move)
就可以让发送方两次花费同一笔加密货币,第一次交易的收款人是payee,第二次交易的收款人是some_other_payee。现实生活中的物理资产可以完全杜绝双重支付,幸运的是,Move也可以做到。3.忘记执行转移加密货币move(coin)导致加密货币丢失。
忘记转移资源将触发字节码验证错误。这种机制可以保护Move开发人员不会有意或无意地丢失资源。
货币Currency模块
模块入门:Move语言的执行模型
三个账户的区块链全局状态示例
每个帐户可以拥有零个或多个模块和一个或多个资源值。就比如说,地址0x0处的帐户拥有一个名为0x0.Currency的模块和一个0x0.Currency.Coin类型的资源值。地址0x1处的帐户拥有两个资源值和一个模块;地址0x2处的帐户拥有两个模块和一个资源值。
需要注意的是:
交易脚本的执行只有两种结果:成功或是失败,不会存在中间的状态。
模块是在区块链全局状态中发布的长期存在的代码。
区块链全局状态的结构为从帐户地址到帐户的映射。
帐户最多只能包含一个给定类型的资源值,并且最多只能包含一个具有给定名称的模块。
所声明模块的地址是类型的一部分。
开发人员仍然可以通过自定义的包装器资源来实现一个帐户拥有多个给定资源类型的实例。(resourceTwoCoins{c1:0x0.Currency.Coin,c2:0x0.Currency.Coin})
开发人员仍然可以通过名称引用资源而不会产生任何冲突,就比如说,你可以使用TwoCoins.c1和TwoCoins.c2这两个名称引用这两个资源。
声明加密货币资源:
在名为Currency的模块中定义一个由模块管理的名为Coin的资源类型。
需要注意的是:
Coin是一种结构类型,其字段容许的值类型为u64。
只有Currency模块的程序能够创建或销毁coin类型的值。
其他模块和交易脚本只能通过模块提供的公共可访问的程序来写入或引用值字段。
实现存款操作
这段程序将Coin资源作为输入,并将其与存储在收款人payee帐户中的Coin资源组合,具体的步骤如下:
销毁输入的加密货币并记录其数值。
获取对存储在收款人帐户下的Coin资源的唯一引用。
将程序传递过来的加密货币的数值加到收款人账户余额中,并更新收款人账户余额。
需要注意的是:
Unpack,BorrowGlobal是内置程序。
Unpack是唯一一种删除类型为T的资源的方法。它将类型为T的资源作为输入,删除它,并返回绑定到资源字段的数值。
BorrowGlobal将地址作为输入,并返回对该地址下唯一的T实例的引用。
&mutCoin是对Coin资源的可变引用,而不是对Coin。
实现撤销存款withdraw_from_sender:
这个程序分为三步:
获取对发送方帐户下唯一的Coin类型资源的引用。
用输入的数额减少引用的Coin的数值。
创建并返回值为更新后金额的新加密货币。
需要注意的是:
任何人都可以调用存款函数deposit,但撤销存款函数withdraw_from_sender具有访问控制策略,因而只能被加密货币的所有者调用。
获取交易发起人账户函数GetTxnSenderAddress类似于Solidity语言中的msg.sender。
除非满足什么条件否则就拒绝函数RejectUnless类似于Solidity语言中的require。如果此项检查失败,则当前交易脚本会停止执行,并且它执行的任何操作都不会更新区块链全局状态。
Pack也是一个内置程序,它主要用来创建一个T类型的新资源。
与Unpack一样,Pack只能在资源T的声明模块中调用。
写在最后
现在你已经了解了Move语言的主要特征,基本语法以及它与以太坊的差异。
最后,如果你想从事Move语言开发,我强烈建议你阅读Move语言原始的白皮书。白皮书中包含许多Move语言的设计原则以及许多很好的参考资料。
尊敬的ZT用户: CXC上线ZT交易所,携手ZT双重大礼,狂撒千枚CXC糖果。 一重礼:竞猜答题赢糖果 凡前10000名参与竞猜答题的用户,无论猜对与否即有机会瓜分千枚CXC糖果,答对3题可额外.
事件视界已越过,一切都不可返回。Facebook将携手Libra共同进军数字资产行业。在我开始分析之前,让我们先明确一件事;Libra没有去中心化,也不能抵制审查。Libra不是加密货币.
BTC近期走势,从4小时级别观察,空军砸过3波,而多军也组织过2波反弹,多空双方的交战区域开始发生重合,围绕大阳线的高低点进行4小时级别的震荡,如图所示大致震荡区间位10800-12000.
据消息称,Facebook推出名为Libra的新型加密货币的计划受到了来自印度的最新质疑,因为亚洲第三大经济体印度并不热衷于允许这种数字货币进入该国.
文章系金色财经专栏作者供稿,发表言论仅代表其个人观点,仅供学习交流!金色盘面不会主动提供任何交易指导,亦不会收取任何费用指导交易,请读者仔细甄别,谨防上当.
Facebook,JPMorgan,耶鲁基金会等机构投资者的资金不会外溢到Altcoin,只会进入主流币;1CO数量在19年并没有变多.