Libra新编程语言 :Move 的所有权模型灵感来源原来是它……

论坛 期权论坛 期权     
区块链大本营   2020-3-28 02:39   1297   0




作者 | Dieter Shirley

译者 | 火火酱  责编 | Carol
出品 | 区块链大本营(blockchain_camp)

智能合约是一类专用于管理有价值数字资产所有权的独特软件。尽管现有的编程环境可以用来跟踪资产的所有权,但是它们通常被用来反映所有权,而非直接定义所有权。智能合约的独特之处在于,它们所代表的价值往往直接体现在它们所维持的状态中。
随着区块链的持续发展,代表所有权的机制也在不断发展。比特币是由“未使用的交易输出(unspent transaction outputs)”或UTXO所定义的所有权模型构建的。虽然UTXO模型非常高效,但它也非常复杂,并且可能会产生一些异常的边缘情况,因此Ethereum采用了一种更直接的Ledger模型。 当Libra区块链发布时,围绕该项目的主要关注点在于Facebook建立的区块链的政治含义,但我们这群深入研究技术细节的人却从中发现了一些很有意思的新想法。尤其是,Libra团队以一个新的所有权模型为基础,为他们的Move VM定义了新的编程模型。该所有权模型的灵感来源就是线性类型(Linear Types):资源(Resources)。“Resources”是一种在编程语言中直接表示资产所有权的新方法。工程师们常常使用“所有权(ownership)”这个术语来比喻:跟踪某代码以管理某种数据结构或系统资源。
这种情况在编程环境中最为常见,在此环境中,内存管理并没有完全从程序员那里抽象独立出来,如果说代码中写了一个对象,那么就意味着该代码必须管理并释放分配给该对象的内存。
Resources将这一概念进行了扩展,我们可以利用一些机制来管理以前编程语言中的“所有权”,并用它来管理本地数字资产的真正所有权。源引于Move简介:
https://developers.libra.org/docs/move-overview#move-has-first-class-resources
Move 的关键特征是能够定义自定义资源类型(resource types)。资源类型可用于对具有丰富可编程性的安全数字资产进行加密。 Move 类型系统为资源提供了特殊的安全保障。Move资源不能被复制、重复使用或丢弃。资源类型只能由定义该类型的模块创建或销毁。这些保障是由Move虚拟机静态执行的。 Libra货币是作为一种资源类型实现的,在语言中并没有特殊的地位,每个Move资源都享有同样的保护。最后这两点非常重要: 1.Resource 对象的特殊状态必须由运行时(“Move虚拟机”)强制执行;如果其只是编译器抽象,那么恶意代码很轻松即可打破屏障。 2.然而!如果你能够正确地执行这些规则,则可以让网络中最重要的资产——本机代币——安全地存储在由用户提交的代码控制的数据结构中。厉害了!


到底什么是Resource?
我们可以通过一个不可替代代币(NFT)的示例(例如CryptoKitty)来理解Resource。每个CryptoKitty都是不可分割、不可复制的,并且有一个直接所有者,这与Resource编程结构是相吻合的。在像Ethereum这样的Ledger模型中,所有的CryptoKitties都以巨型列表的形式被存储在一个智能合约中。 通过在中央分类账中存储每个所有者的帐户ID来跟踪每个Kitty的所有权,更改Kitty所有权的唯一方法是联系该中央分类账并要求其更新与该Kitty相关的帐户ID。
  1. contract KittyLedger {
复制代码
  1.     struct Kitty {
复制代码
  1.     priv let kitties: {Int: Kitty}
复制代码
  1.     fun transfer(kittyId: Int, newOwner: AccountId) {
复制代码
  1.         if (msg.sender == kitties[kittyId].owner) {
复制代码
  1.             kitties[kittyId].owner = newOwner
复制代码
  1.         }
复制代码
  1.     }
复制代码
  1. }
复制代码
复制代码
复制代码
  1. transaction(signer: Account) {
复制代码
  1.     // tells the central ledger to assign ownership of
复制代码
  1.     // myKittyId to a different account
复制代码
  1.     centralKittyLedger.transfer(myKittyId, receiverAccountId)
复制代码
  1. }
复制代码
在Resource模型中,Kitty本身被表示为一个Resource对象,被直接存储在拥有它的帐户中。就像在现实世界中一样,通过占有来表示所有权。
你无需通过中央分类帐来查看自己是否拥有某物,你可以把它存在自己的帐户中,也可以不存。如果你拥有它,你就可以对其进行转移或控制;如果你没有拥有它,则无法捕获或改变它。
  1. contract CryptoKitties {
复制代码
  1.     // Accounts store a collection in their account storage
复制代码
  1.     resource KittyCollection {
复制代码
  1.         // Each collection has functions to
复制代码
  1.         // move stored resources in and out
复制代码
  1.         fun withdraw(kittyId: int): CryptoKitty
复制代码
  1.         fun deposit(kitty: CryptoKitty)
复制代码
  1.     }
复制代码
复制代码
复制代码
  1.     // The resource objects that can be stored in the collection
复制代码
  1.     resource CryptoKitty {}
复制代码
  1. }
复制代码
复制代码
复制代码
  1. transaction(signer: Account) {
复制代码
  1.     // Removes the Kitty from signer's collection, and stores it
复制代码
  1.     // temporarily on the stack.
复制代码
[code]    let theKitty
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:70
帖子:14
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP