为什么Movescriptions是更适合智能合约链的铭文2.0设计?
前言
前几天在sui生态中出现了一个创新性的铭文标准MRC20,其首个代币$Move在社区中引起了一定的热度。我在接收到消息之后,也是在第一时间点进官网:https://mrc20.fun/ 准备mint。
官网做得十分简洁,在铸造页面,只有如下的一些铭文的基本信息以及一个蓝色的Mint按钮。在按钮下方用一句话概括出该铭文标准的创新点--“所有的铸造费用都会存储在你的铭文之中,你可以通过燃烧你的铭文取回你的铸造费用,在每轮周期结束之后你的铭文会被发送到你的地址”。
由于之前完全没有接触过Move语言再加上这句话,让我对其实现原理产生了很大的好奇,于是仔细研究了作者的推特,博文以及github开源的代码,输出了这篇文章。
作者背景
jolestar(推特:@jolestar) 是一个善于编程和写作的技术大牛,从他的个人博客网站(https://jolestar.com/)可以看到,他从2007年就开始坚持输出技术文章和人生感悟。从他的个人Github主页也可以看到简介中的三个项目都是与Move语言相关的。
jolestar自述从19年就开始捣鼓Move,此外他还发起了一个Move语言教育类公益项目--星航计划(致敬电影星际迷航),完成课程顺利毕业还可以拿到现金奖励,旨在为Move生态引进更多的开发者。
所以,从上述资料我们可以得知jolestar是一个对Move生态非常熟悉的开发者。
SFT
我们都知道BRC20是在铭文中嵌入JSON文本来表示代币的名称和数量等信息,用NFT(Non-Fungible Token,非同质化代币)的形式来实现FT(Fungible Token,同质化代币)的功能,本质上可以把它归类为一种SFT(Semi-Fungible Token,半同质化资产)。
当然SFT并非jolestar首创,早在2022年9月就由我们华人团队@SolvProtocol主导设计并且正式通过成为以太坊新的代币标准ERC-3525。
同质化代币是指每个代币在功能和价值上都是相等的,没有任何区别,可以互相替换,1 BTC=1 BTC,非同质化代币是指每个代币都是唯一的不可以替换的,1 BAYC ≠ 1 BAYC,半同质化代币结合了同质化代币和非同质化代币的特性,其关键在于Slot,简单来说Slot代表了一种分类,同一个Slot下会有多个ID(唯一标识),每个ID虽然都可以拥有不同的Value(代币数量),但是同一个Slot下不同的ID可以被认作是相同的可以交换组合拆分的实体。
就拿会员卡积分来举例,假设有两个Slot,分别是肯德基会员卡和星巴克会员卡,中本聪和马斯克分别在肯德基和星巴克办理了会员卡,很显然肯德基的积分和星巴克的积分无法通用,这就是非同质化的,但是肯德基下中本聪卡1的积分可以划转到卡2和卡3下,同理,星巴克下马斯克卡2和卡3的积分可以合并到卡1,在同一个slot下不同ID下的积分就是同质化的。
将上述积分替换为brc20的ordi和sats,如下图所示。每一种代币类型可以看成是一个slot,每个slot下记录着不同数量的铭文可以看成一个半同质化代币,每个铭文都拥有一个唯一的铭文id,每个铭文中包含的ordi都是没有区别的。
设计理念
在讲Movescription的设计理念之前,我们先来看看前段时间“万链齐飞”的日子,大多数evm链在设计铭文时参考的是eths的模式,即“通过自转或者往黑洞地址发送一笔转账,并在calldata中附带一组类似于brc20的JSON格式的文本,然后再构建一个索引器来索引链上的数据来完成记账”,这种方式是从链上存储数据的方式来模仿brc20,可谓是“形似而神不似”,没有把链本身智能合约的优势发挥出来。
于是作者在以下推文中提出了他的设计理念(以下文字为精简摘要,全文请点击链接:https://x.com/jolestar/status/1737652966142959982?s=20 查看)
Bitcoin上由于没有智能合约,所以需要使用铭刻JSON的方式来发行FT,而其他智能合约链完全没有必要去使用JSON,所以我总结了铭文的几个启示:1. 它是一种半同质化资产,它的流动性并不如 FT,但这在市场起步阶段是优势。2. 它发行资产的门槛比各链上的 FT 都要低,认知成本也低。各链上发行资产一般都需要部署个智能合约,识别也主要是通过合约地址,而这对新手来说比较困难。而铭文这波把这个门槛基本降到了最低。3. 它的公平发行模式,Bitcoin 上可以理解成通过 Gas 租赁矿工矿机的 PoW 发行模式。
那既然这样,我们为什么不用智能合约来实现一个铭文协议,并且兼具以上特性呢?于是我尝试用 Move 实现了 Movescriptions 协议。首先,它是一种通过 Move 表达的半同质化资产协议。Move 基于数据结构的资产表达方式,非常适合表达这种协议。1. 通过 tick 这个全局唯一的名字来表达类型,借鉴 BRC20,符合 KISS 原则,简单直观。2. value 可以用来表达 FT 的余额,或者 NFT 里面的关键值。3. Metadata 可以附加任意类型的数据。其次,它支持通过 PoW 来分发资产,保证资产的分发更公平,更分散。我称之为智能铭文。
-jolestar
资产的表达方式
“Move基于数据结构的资产表达方式,非常适合表达这种协议”。我们该如何理解jolestar所讲的这段话。
首先Move语言引入了Resource的概念,这也是Solidity和Move最大的一个区别,它在弱化数字属性,强调资产属性,使得Move变得安全且强大。
Solidity语言体系下的资产在EVM中被编码为 "地址-->资产”的映射,资产的传递只能通过在不同的地址中加减数值,它无法作为参数传递,从函数返回或者存储到另一个资产中,而且这种记账方式很容易被黑客找到漏洞进行重入和双花攻击,如下图所示,这便是一个典型的erc20代币的工作原理。
而在Move语言体系下,资产被定义为Fisrt-class Resource,直译为资源是一等公民,就是表示资源需要作为被首要考虑的编程对象,并且具有两种约束,即稀缺性和访问权限。
现实生活中稀缺性是实物资产的重要属性,比如黄金,既不会凭空增发也不会突然消失,但是在数字资产中并不存在固有的物理稀缺性。所以Move认为数字资产必须以某种编程方式强制执行这种稀缺性,于是Move为各种类型抽象了四个属性:copy(可复制)、key(可索引)、可丢弃(drop)、可储存(store)。
但是一旦该变量声明为Resource类型,它只能使用Key和Store属性,无法被添加Copy和Drop属性,如此便从语法结构上保证了资源类型的稀缺性。
一个简单的Resource如下图所示,这就解释了作者所说的基于数据结构表达资产的方式。
我们再来看看Move体系下资源是如何转移的。首先,所有的Resource数据都必须存储在账户下,因为只有分配了账户,才会存在对应的Resource资产,其次,每个Resource只要从账户中取出,就必须要被“使用”,使用内置的move_to方法将资产从账户中取出后,要么将其作为返回值传递给新的账户,要么将其销毁。如下图所示:
资产的可组合性
前面介绍了Resource是一种特殊的结构体,在Move中结构体是可以互相嵌套的,就拿Movescription为例,在Movescription中嵌入了Balance
如此一来,MoveScription便打破了Brc20上很多铭文只有Meme叙事的魔咒,可以搭建出各种生态应用,比如作为游戏中的资产,作为Defi中的抵押物等等。
总结
行文至此,我相信你已经可以了解到Movescription这种铭文的设计理念与BRC20有异曲同工之妙。在钱包中,每一个Movescription就是一个NFT(类比Inscription),每一个Movescription都拥有一个Object id(类比Inscription id),账户的代币余额同样需要索引来实现。但是其优势在于很好地利用了Move语言对于资产的表达优势,真正做到了“形似且神似”。
参考资料:
3.https://mirror.xyz/bocaibocai.eth/q3s_DhjFj6DETb5xX1NRirr7St1e2xha6uG9x3V2D-A