}
Resources范例提供了实现基于本领的安详模子的“成果”观念所需的所有担保。本领是界说安详系统的一个强大机制,而且可以使遵循最小特权原则(安详系统中常见的最佳实践)变得容易得多。
transaction(signer: Account) {
// Removes the Kitty from signer's collection, and stores it
Flow的编程语言Cadence利用Resources
centralKittyLedger.transfer(myKittyId, receiverAccountId)
if (msg.sender == kitties[kittyId].owner) {
机动所有权
// Moves the Kitty into the receiver's account
Resources是在编程语言中直接暗示资产所有权的一种新要领。工程师常常用“所有权”这个词来比喻跟踪哪个代码认真打点某种数据布局或系统Resources。
1.每个Resources在任何给定的时间都刚好存在于一个处所。无论是通过编程错误或恶意代码,Resources不能被复制或意外删除。
}
尤其是,Libra团队为他们的MoveVM界说了一个新的编程模子,该模子是环绕着一个新的所有权模子(受Linear Types:Resources开导)界说的。
直接所有权模子答允任何利用Resources范例建模的资产被安详地存储在系统中的任那里所,包罗在适当的环境下“内部”其他资产。
let receiver = getAccount(receiverAccountId)
3.对Resources上要领的会见仅限于所有者。 譬喻,,只有加密猫的主人可以启动育种操纵,从而导致新猫的降生。
contract CryptoKitties {
你不需要查察中央分类账来查察你是否拥有某样对象,你可以把它存在你的账户里,也可以不存在。假如你有它,你可以转移它或以其他方法节制它,假如你没有,就没有步伐捕获或改变它。
}
priv let kitties: {Int: Kitty}
这就是为什么习用的Cadence气势气魄是为所有共享状态利用Resources的原因;拥抱Resources的智能契约作者再也不消思量可重入性裂痕了!
当Libra区块链公布时,环绕该项目标主要乐趣在于Facebook成立的区块链的政治寄义,但我们这些深入研究技能细节的人发明白一些很是有趣的新想法。
固然UTXO模子很是高效,但它很是巨大,大概会发生一些不寻常的边沿环境,因此Ethereum回收了一种更简朴的分类模子。
运行时系统可以维护所有的安详性和代价担保,同时为开拓人员释放缔造性的机动性,而不会带来不须要的巨大性。
我们对Resources范例的气力感想震惊,它是Cadence的界说特性之一,Flow的智能合约编程语言。Resources解锁了比EVM或WASM更富厚的可组合选项,而且很是适合数字资产(尤其是NFTs!)
利用分类账模子举办所有权限制了可用的所有者干系的种类。譬喻,ERC-721为NFTs界说了一个所有权模子,该模子假定只有以太坊地点才气拥有NFT。然而,在某些用例中,资产自己拥有其他资产(好比加密猫拥有一副大度的太阳镜)的想法很是有趣,需要建设一个新的类型(ERC-998)。
kitties[kittyId].owner = newOwner
最后两点很是重要:
fun withdraw(kittyId: int): CryptoKitty
正如在引言中提到的,智能合约是独一适合打点有代价资产所有权的,但大大都编程语言——甚至是那些专门为智能合约设计的编程语言——都没有任何当地抽象来打点所有权。在协议级别上包括这样的抽象显然是一个庞大的胜利。
// The resource objects that can be stored in the collection
}
跟着区块链的成长,代表所有权的机制也在成长。比特币是利用由“未利用的生意业务输出”或UTXOs界说的所有权模子构建的。
contract KittyLedger {
在Resources模子中,猫自己被暗示为一个Resources工具,它直接存储在拥有它的帐户中。就像在物质世界里,所有权是以占有为代表的。
ERC-998长短常强大的,但它也比ERC-721巨大得多。正确地实施它长短常坚苦的,而且追溯性地将它的特性应用到现有的ERC-721资产实际上是不行能的。
留意:为了保持对分类账和直接所有权模子之间差此外存眷,上面的两个例子忽略了会见节制、界说每个变量以及活代码需要思量的其他因素等问题。
2.Resources的所有权是由其存储位置来界说的。 在确定所有权时,不需要查阅中央分类账。
Resources扩展了这个想法,因此我们可以操作以前编程语言中的一些打点隐喻“所有权”的机制,并利用它来打点当地数字资产的真正所有权。
利用通过Resources范例的直接所有权模子,每只小猫将存储在其所有者的帐户内,以及该人的其他资产。谁需要为存储付出用度的责任是明晰的。更重要的是,小我私家用户(在他们的客户端软件的协助下)可以存档未利用的资产,以淘汰他们的本钱和淘汰网络上的负载。
// move stored resources in and out
最简朴的要领是利用非可替换代币(NFT)的示例来思考,好比加密猫。每个加密模块都是不行支解的、不行复制的,而且可以有一个直接所有者,直接与Resources编程布局匹配。
receiver.kittyCollection.deposit(kitty: <-theKitty)
struct Kitty {}
基于本领的安详性
fun transfer(kittyId: Int, newOwner: AccountId) {
transaction(signer: Account) {
按照分类账模子,很难知道谁应该付出这笔租金。譬喻,加密猫合约代表了数以万计的玩家,拥有近200万只小猫和高出111Mb的链上数据。以太坊没有步伐公正收取租金给所有这些猫主人。
消除重入性缺陷
// Accounts store a collection in their account storage
let theKitty <- signer.kittyCollection.withdraw(kittyId: myKittyId)
那么Resources到底是什么呢?
}
虽然,直接利用全局共享状态(绕过Resources工具的利用)仍然可以建设易受重入错误影响的代码。
以太坊汗青上最著名的智能合约裂痕源于可重入性问题,靠得住的开拓人员需要不绝提高鉴戒,防备引入易受可重入性进攻的逻辑流。
这种比喻在编程情况中最常见,在这种情况中,内存打点并没有完全从措施员哪里抽象出来,说代码“拥有”一个工具,意思是说代码必需打点和释放分派给该工具的内存。可是利用Resources尚有其他一些次要的长处,每一个都长短常重要的:
// Each collection has functions to
resource KittyCollection {
基于本领的安详模子凡是被认为更容易推理(这提高了安详性),同时答允更大的机动性。
Move系统为Resources提供了非凡的安详保障。不能反复、重用或扬弃Move Resources。Resources范例只能由界说该范例的模块建设或销毁。这些担保由Move虚拟机静态强制实施【...】可扩展的智能合约平台需要某种方法来收取“州租金”,这样存储在区块链上的数据要么需要付出用度,要么从事情会合删除。
Move的要害特性是界说自界说Resources范例的本领。Resources范例用于编码具有富厚可编程性的安详数字资产。}
1.Resources工具的非凡状态必需由运行时(“Move虚拟机”)强制实施;假如它们只是一个编译器抽象,恶意代码就很容易粉碎值担保。
智能合约是一个奇特的软件,专门用于打点有代价的数字资产的所有权。尽量现有的编程情况可以用来跟踪资产的所有权,但它们凡是用于反应所有权而不是直接界说所有权的场景。智能合约的奇特之处在于,它们所代表的代价往往直接表此刻它们所维护的状态中。
// tells the central ledger to assign ownership of
这好像是一个斗胆的主张!然而,从如何界说Resource就可以很自然地得出这样的结论:每个Resource都有一个单独的所有者,而且只有Resource的所有者可以挪用它上的要领。假如Resources要领是“在仓库上”,那么我们就知道对该工具的单一所有权引用已经在利用了;对付我们从该要领内部挪用的任何代码——无论何等间接地——都不行能得到对该工具的第二个引用来举办可重入的要领挪用。
每只猫的所有权是通过将每个所有者的账户ID存储在一其中央分类账中来跟踪的,改变猫的所有权的独一要领是接洽该中央分类账,并要求它更新与该猫相关联的账户ID。
fun deposit(kitty: CryptoKitty)
简而言之,将某个对象标志为“Resources”汇报编程情况,这个数据布局代表某种有形的代价,与该数据布局交互的所有代码都需要遵循一系列非凡的法则,这些法则将维护该数据布局的代价。
// temporarily on the stack.
// myKittyId to a different account
resource CryptoKitty {}
Libra钱币是作为一种Resources范例来实现的,而且在语言中没有非凡的职位,每一个Move Resources都享有沟通的掩护。
Cadence有一个舒适的,切合人体工程学的语法,使它很容易阅读。它利用一个强大的静态范例系统来最小化运行时错误,并答允所有的要领、接口和生意业务都包括预条件和后条件来强制实现预期的行为。我们认为,这将导致一种语言更容易进修,更容易审计,并最终比任何现有的替代方案更有效率。在像以太坊这样的分类账模子中,所有的加密猫都存储在一个智能契约中,形成一个庞大的列表。
2.然而!假如您正确地执行了这些法则,您就可以答允网络最重要的资产——本机代币——安详地存储在由用户提交的代码节制的数据布局中。多强大!
那么,这些法则是什么呢?
为什么Resources很重要?
去年,Flow开拓团队在对更智能的契约语言举办学术研究后,观测了区块链情况下线性范例的利用。险些在同一时间,Libra团队宣布了他们的劈头声明,包罗MoveVM的技能细节。
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。