可是,利用Resources尚有一些其他值得一提的长处:
resource KittyCollection {
}
Move 的要害特征是可以或许界说自界说资源范例(resource types)。资源范例可用于对具有富厚可编程性的安详数字资产举办加密。
这好像是一个十分斗胆的主张!然而,它仅仅是自然地遵循了Resources的界说方法:每个Resources都有一个单独的所有者,而且只有其所有者可以挪用Resources上的要领。假如一个Resources要领在“仓库上”,那么我们就知道该工具的单个所有者引用已在利用中。我们从该要领内部挪用的任何代码都不行能(尽量是间接地)得到对该工具的第二个引用以举办可重入要领挪用。
Libra钱币是作为一种资源范例实现的,在语言中并没有非凡的职位,每个Move资源都享有同样的掩护。
centralKittyLedger.transfer(myKittyId, receiverAccountId)
简而言之,将某个对象标志为Resource就是在汇报编程情况:这个数据布局代表了某种有形的代价,与该数据布局举办交互的所有代码都需要遵循一系列非凡的法则,以维护该数据布局的代价。
Move 范例系统为资源提供了非凡的安详保障。Move资源不能被复制、反复利用或扬弃。资源范例只能由界说该范例的模块建设或销毁。这些保障是由Move虚拟机静态执行的。
在像Ethereum这样的Ledger模子中,所有的CryptoKitties都以巨型列表的形式被存储在一个智能合约中。
可组合性:
这就是习用的Cadence style对所有共享状态利用Resources的原因,能干Resources的智能合约作者无需再担心可重入性错误问题!
直接所有权模子可以或许让任何利用Resource Types举办建模的资产安详地存储在系统中的任何位置,包罗其他资产“内部”(假如合用的话)。
幸运的是,界说在Resource工具上的要领不会成为任何可重入性bug的受害者。
// tells the central ledger to assign ownership of
当Libra区块链宣布时,环绕该项目标主要存眷点在于Facebook成立的区块链的政治寄义,但我们这群深入研究技能细节的人却从中发明白一些很有意思的新想法。
Cadence具有舒适的、切合人体工程学的语法,易于阅读。它通过一个强大的静态范例系统来最洪流平地淘汰运行时错误,而且答允所有要领、接口和事务包括前置和后置条件,以强制执行预期的行为。我们认为,这会使语言变得更易于进修和审核,最终,会比现有的所有选择都越发高效。
// The resource objects that can be stored in the collection
那么,这些法则都有什么呢?
}
Ethereum汗青上最著名的智能合约bug是由可重入性问题引起的,Solidity开拓人员需要不绝提高鉴戒,防备引入易受可重入性进攻的逻辑流。
https://www.wired.com/2016/06/50-million-hack-just-showed-dao-human/
智能合约是一类专用于打点有代价数字资产所有权的奇特软件。尽量现有的编程情况可以用来跟踪资产的所有权,可是它们凡是被用来反应所有权,而非直接界说所有权。智能合约的奇特之处在于,它们所代表的代价往往直接表此刻它们所维持的状态中。 Resources将这一观念举办了扩展,,我们可以操作一些机制来打点以前编程语言中的“所有权”,并用它来打点当地数字资产的真正所有权。 这种环境在编程情况中最为常见,在此情况中,内存打点并没有完全从措施员哪里抽象独立出来,假如说代码中写了一个工具,那么就意味着该代码必需打点并释放分派给该工具的内存。
2. 为什么Resource很是重要?
· 基于本领的安详性(Capability-Based Security)
虽然,直接利用全局共享状态(绕过Resource工具的利用)仍然大概建设易受可重入性bug影响的代码。
transaction(signer: Account) {
// move stored resources in and out
kitties[kittyId].owner = newOwner
在分类账模子下,很难知道该由谁来付出这些租金。譬喻,CryptoKitties合约代表了数以万计的用户,有近200万Kitties和高出111MB的链上数据。Ethereum无法合理地向所有这些Kitty所有者收取租金。
fun transfer(kittyId: Int, newOwner: AccountId) {
去年,在对更好的智能合约语言举办了学术研究后,Flow开拓团队观测了区块链情况下Linear Types的利用。险些在同一时间,Libra的团队宣布了其最初通告,个中包罗MoveVM的技能细节。
1. Resource 工具的非凡状态必需由运行时(“Move虚拟机”)强制执行;假如其只是编译器抽象,那么恶意代码很轻松即可冲破屏障。
// myKittyId to a different account
// Removes the Kitty from signer’s collection, and stores it
http://www.cs.cmu.edu/~balzers/publications/digital_contracts_as_session_types.pdf
let receiver = getAccount(receiverAccountId)
struct Kitty {
}
// Accounts store a collection in their account storage
priv let kitties: {Int: Kitty}
· 机动所有权(Flexible Ownership)
尤其是,Libra团队以一个新的所有权模子为基本,为他们的Move VM界说了新的编程模子。该所有权模子的灵感来历就是线性范例(Linear Types):资源(Resources)。
· 消除可重入性Bugs(Eliminating Reentrancy Bugs)
fun withdraw(kittyId: int): CryptoKitty
我们可以通过一个不行替代代币(NFT)的示例(譬喻CryptoKitty)来领略Resource。每个CryptoKitty都是不行支解、不行复制的,而且有一个直接所有者,这与Resource编程布局是相吻合的。
就像简介中提到的,智能合约出格适合打点珍贵资产的所有权,可是大大都编程语言(甚至是专门为智能合约而设计的编程语言)都没有任何用于打点所有权的本机抽象(native abstractions)。在协议级中包括这样的抽象显然意义重大。
在Resource模子中,Kitty自己被暗示为一个Resource工具,被直接存储在拥有它的帐户中。就像在现实世界中一样,通过占有来暗示所有权。
2.然而!假如你可以或许正确地执行这些法则,则可以让网络中最重要的资产——本机代币——安详地存储在由用户提交的代码节制的数据布局中。锋利了!
resource CryptoKitty {}
fun deposit(kitty: CryptoKitty)
}
可扩展的智能合约平台需要通过某种方法来收取状态租金(state rent),以便为存储在区块链上的数据付出用度或将其从事情会合删除。
// Each collection has functions to
https://developers.libra.org/docs/move-overview#move-has-first-class-resources
if (msg.sender == kitties[kittyId].owner) {
Flow的编程语言Cadence利用Resources
固然UTXO模子很是高效,但它也很是巨大,而且大概会发生一些异常的边沿环境,因此Ethereum回收了一种更直接的Ledger模子。
Resource Types的强大成果令我们震惊,它是Flow的智能合约编程语言Cadence的界说成果之一。Resources解锁了比EVM或WASM更富厚的可组合性选项,是数字资产的完美选择(尤其是NFT!)
receiver.kittyCollection.deposit(kitty: <-theKitty)
通过在中央分类账中存储每个所有者的帐户ID来跟踪每个Kitty的所有权,变动Kitty所有权的独一要领是接洽该中央分类账并要求其更新与该Kitty相关的帐户ID。
let theKitty <- signer.kittyCollection.withdraw(kittyId: myKittyId)
· 状态租金(State Rent)
transaction(signer: Account) {
1. 到底什么是Resource?
跟着的一连成长,代表所有权的机制也在不绝成长。是由“未利用的生意业务输出(unspent transaction outputs)”或UTXO所界说的所有权模子构建的。
通过利用Resource Types的直接所有权模子,可以将每个Kitty都(与该用户的其他资产一起)存储在其所有者的账户中。付出存储付费的责任十理解确。另外,小我私家用户(在其客户端软件的辅佐下)可以归档未利用的资产,以低落本钱并淘汰网络负载。
1.每个Resource 在某一时刻只能存在于一个处所。Resources不能通过编程错误或恶意代码举办复制或意外删除。
}
将分类账模子用于所有权会限制可用的所有者干系种类。譬喻,ERC-721为NFT界说了一个所有权模子,该模子假定只有Ethereum地点才气拥有NFT。然而,在某些用例中,资产自己拥有其他资产(好比CryptoKitty拥有一副大度的墨镜)的想法很是有意思,这就需要建设新的类型(ERC-998)。
留意:为了将重点放在分类账和直接所有权模子之间的差别上,上面的两个例子都忽略了会见节制、界说每个变量、以及及时代码相关的其他因素。
}
“Resources”是一种在编程语言中直接暗示资产所有权的新要领。工程师们经常利用“所有权(ownership)”这个术语来比喻:跟踪某代码以打点某种数据布局或系统资源。
凡是认为,基于本领的安详性模子在提供了更强机动性的同时,也更容易举办推理(这加强了安详性)。
contract CryptoKitties {
https://hackernoon.com/software-composability-in-crypto-a705700c3816
你无需通过中央分类帐来查察本身是否拥有某物,你可以把它存在本身的帐户中,也可以不存。假如你拥有它,你就可以对其举办转移或节制;假如你没有拥有它,则无法捕捉或改变它。
最后这两点很是重要:
Resource Types为实现基于本领的安详性模子中的“成果(Capabilities)”观念提供了所需的一切保障。Capabilities是界说安详系统的强大机制,可以或许让遵循最小特权原则(Principle of Least Privilege)(安详系统中常见的最佳实践)变得越发容易。
contract KittyLedger {
Ethereum汗青上最著名的智能合约bug:
不行否定,ERC-998很是强大,但它也比ERC-721要巨大得多。要想正确地执行该类型长短常坚苦的,并且实际上,要将其有效地应用于现有的ERC-721资产是不行能实现的。
2.Resource 的所有权由其存储位置抉择。在确定所有权时,无需查阅中央分类账。
所有的安详性和代价保障都可以由运行时系统举办维护。在为开拓人员提供机动性的同时,又不会带来不须要的巨大性。
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。