本文目标:资源、能力、全局存储、单元测试
介绍
Move语言使得在区块链世界中创造数字“事物”,以及拥有和转移它们变得非常容易。Move是一种非常简单的语言——这是有意为之。复杂性总是引入额外风险,漏洞会在意想不到的应用中显现出来。我们看到过利用智能合约导致数十亿美元资产被盗的恐怖故事。因此,我们希望数字资产是安全的。Move语言的简单性,为这种安全提供了一条实现路径。
本篇文章,首先比较理论,因为在深入研究代码之前,对于资源是什么、如何控制资源,有良好正确的感知非常重要。这会包括外行理论与学术理论。
资源:数字事物
Move中的“资源”就是是一种“数字事物”。那东西可以是你想要或想象的任何东西:演唱会门票、NFT、一本书、两个企业之间的合同、社交媒体文章等。你能想到的东西,都可以是一种资源。我们以Alice和Bob去参加一场演唱会,他们需要门票为例。在Move中,我们可以简单地这么创建门票类:
structConcertTickethaskey{seat:vector,ticket_code:vector,}
Move模块中的代码现在使我们能够向Alice和Bob发送门票。有了上面的结构,我们可以简单地创建一张门票:
游戏引擎Unity新增支持MetaMask、Aptos等区块链SDK开发工具:金色财经报道,Unity游戏引擎开发商Unity Technologies推出了一套新的去中心化技术工具,供希望为游戏添加去中心化功能的游戏开发者使用。Unity表示,游戏环境中的“去中心化”是指“游戏中的所有权模式,允许玩家创建、赚取或获得游戏内资源,然后他们可以出售或交易这些资源。”从本质上讲,开发人员现在可以将游戏内资产转化为NFT,并将他们的游戏与各种区块链和Web3生态系统集成。
Unity资产页面上的去中心化类别包括13个经过验证的解决方案,适用于允许不同功能的游戏开发人员。开发人员可以使用其中一些SDK轻松地将NFT、代币和链上程序集成到他们基于Unity的游戏中。基于Unity的游戏开发人员可以选择通过SDK在以太坊、Solana、Algorand、Tezos、Aptos和Flow区块链上进行构建。此外,开发人员可以将MetaMask集成到他们的游戏中,这似乎是目前唯一可用的基于钱包的SDK。[2023/3/1 12:35:17]
publicfuncreate_ticket(account:&signer,seat:vector,ticket_code:vector):ConcertTicket{letseat=vector;letticket_code=vector;ConcertTicket{seat,ticket_code}}
Binance借贷平台新增支持APT作为可抵押资产:10月19日消息,据Binance官方公告,其质押借币平台Binance Loans新增支持APT和PUNDIX为可抵押资产。[2022/10/19 17:32:46]
在“外行理论”方法中,可以把资源想象成离散的物理对象,而不是像程序员一样去思考。我们的“结构”是配方、建筑图纸、指令列表或任何你想使用的类比。让我们作个分解:
structWhatYouWantToCallIthasAbilities{any_name_i_want:one_of_a_few_type_choices,any_other_name_i_want:one_of_a_few_type_choices,this_is_the_last_one_i_need:one_of_a_few_type_choices}
你可以随意命名资源,但它必须以大写字母A-Z开头。之后,名称可以包含下划线_、字母a-z、字母A-Z或数字0-9。该结构将具有某些“能力”,我们将在稍后介绍。但现在,只要知道这些能力将包括“key”、“store”、“copy”和“drop”中的一种或组合。
在结构中,你可以拥有任意数量的键值对。键名应该用蛇形命名。每个键值对中的值必须是以下类型之一:
Aptos生态NFT市场Souffl3与Wav3达成战略合作:9月3日消息,Aptos生态NFT市场Souffl3与Wav3达成战略合作,将Wav3的多功能NFT工具集集成到Souffl3的启动板服务中,供创作者使用。同时Souffl3将启动NFT启动板服务。[2022/9/3 13:06:44]
boolu8u64u128addresssignervector:vector<{non-referenceMoveTypeId}>struct:{address}::{module_name}::{struct_name}::<{generictypes}>reference:immutable&andmutable&mutreferences
我们在这里给我们的包一个名子和版本号。另一个值得注意的是TicketTutorial="0xe110"行。对于我们上面谈到的结构和函数路径,这是我们设置地址的地方。一旦我们编译项目,我们会将字节码模块发布到Aptos区块链上的一个帐户。我们可以使用离散地址来调用结构和函数,例如:
0x95876b0492fe3912863e55bab6f74703::Module::Struct
Aptos公布测试网3激励标准,完成要求的用户将获得800枚代币奖励:8月20日消息,公链项目Aptos公布测试网3激励标准,满足以下条件的用户将获得800枚代币奖励:按时完成所有要求的目标;满足指标推送数据定义的节点活跃度≥95%;获得的链上奖励≥最大值的80%;成功参与Aptos创建的所有治理操作。此外,Aptos还将为使用开放的REST API运行验证器全节点以进行负载测试并完成所有操作的用户提供200枚代币的奖励。Aptos表示,美国的参与者无法获取奖励,奖励将在主网成功启动后提供并至少锁定一年时间。
此前消息,Aptos激励测试网3将于8月30日上线,9月9日结束测试。[2022/8/20 12:37:36]
但这有点麻烦。Move
这是一个简单的内联单元测试,以确保我们的代码在编译和部署之前在基础层面上工作。第一行是编译器指令,指示下一个函数是一个测试:
#
它还为我们提供了创建签名者的能力,我们可以使用@0x1地址表示法将其传递给测试函数。我们调用create_ticket函数来创建并提供签名者座位号“K24”,票证代码为“AB43C7F”。b"string"是一个字符串文字运算符,它给我们创建一个向量。通过这个函数调用,我们创建了ConcertTicket并将其存储在地址0x1的收件人帐户中。
动态 | 中国黑客组织APT41攻击加密公司:根据8月2日发布的FireEye威胁情报报告,中国黑客组织APT41攻击加密公司。除了针对医疗保健、电信、金融科技以及电影和媒体公司的攻击外,有证据表明,APT41已经渗透并网罗了一些从事加密行业的公司。2018年6月,APT41发送鱼叉式钓鱼电子邮件,促使其目标加入以加密货币计价的去中心化式游戏平台。同月,一个加密交易所被同一个电子邮件地址锁定,据报道是由Tom Giardino运营的。此外,在至少一个案例中,该黑客组织部署了恶意代码,将Monero挖矿机器人上传到目标计算机上,这正在发展成为一种常见的网络敲诈形式。(Coindesk)[2019/8/8]
这是一个测试,所以我们必须确保它有效。我们使用函数Signer::address_of将“recipient”的地址存储在我们的变量recipient_addr中。然后我们可以使用exists来查看ConcertTicket资源是否实际存储在该地址。exists指令是另一个具有exists(address):bool接口的全局存储操作符。传入我们的类和我们正在检查的地址,会给我们一个关于该地址是否存在资源的true/false响应。
最后,Assert!是一个类似于宏的操作,可以让我们测试一个条件,条件不满足时将退出并返回错误代码。如果我敲了接近4,000字对你们这些超级大脑来说还不够,更多细节在这里:
AbortandAssert
在我们的测试中,我们使用exists函数来判断资源是否存在,表示测试成功。让我们运行那个测试。
在项目目录中打开一个终端并运行:
cargotest
如果一切正常,你将得到以下输出:
Finishedtesttarget(s)in0.50sRunningunittests(target/debug/deps/tutorial-6df2116825e4520d)running1testCACHEDMoveStdlibCACHEDCoreFrameworkCACHEDAptosFrameworkBUILDINGtutorialsRunningMoveunittests0xe110::Tickets::sender_can_create_ticketTestresult:OK.Totaltests:1;passed:1;failed:0testmove_unit_tests::move_unit_tests...oktestresult:ok.1passed;0failed;0ignored;0measured;0filteredout;finishedin0.41sRunningunittests(target/debug/deps/tutorial-b1774daddf2e13d8)running0teststestresult:ok.0passed;0failed;0ignored;0measured;0filteredout;finishedin0.00sDoc-teststutorialrunning0teststestresult:ok.0passed;0failed;0ignored;0measured;0filteredout;finishedin0.00s
我们的测试设置正在多个地方尝试测试,但我们现在只专注于第一个测试并且它通过了!为了确保这一点,让我们把测试中的函数调用注释去掉
//create_ticket(&recipient,b"A24",b"AB43C7F");
并再次运行,得到这个输出:
RunningMoveunittests0xe110::Tickets::sender_can_create_ticketTestfailures:Failuresin0xe110::Tickets:┌──sender_can_create_ticket──────│error:testfailure│┌─/Users/culbrethw/Development/Tutorials/Tickets/sources/TicketTutorial.move:42:3│││36│public(script)funsender_can_create_ticket(recipient:signer){││------------------------Inthisfunctionin0xe110::Tickets│·│42│assert!(exists(recipient_addr),1);││^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^Testwasnotexpectedtoabortbutitabortedwith1here││└──────────────────Testresult:FAILED.Totaltests:1;passed:0;failed:1
这里显示失败!我们在错误消息中看到,Test不应该中止,但它在此处以1中止,其中with1是我们在Assert!失败时发出的错误代码。当然,有时我们希望测试在某些条件下失败,但我们的大脑需要看到全绿,以便我们知道一切都按计划进行。我们可以使用另一个编译器指令构建我们的测试,通过将我们的测试修改为:
##public(script)funsender_can_create_ticket(recipient:signer){
其中abort_code是我们预期的错误。再次运行cargo测试,我们又回到了全绿:
RunningMoveunittests0xe110::Tickets::sender_can_create_ticketTestresult:OK.Totaltests:1;passed:1;failed:0testmove_unit_tests::move_unit_tests...ok
你可以在这里深入了解单元测试:UnitTestsdiem.github.io
本章节谈了很多理论,但这至关重要。在下一章节中,我们将深入研究代码,让Alice和Bob能够购买门票,甚至可以交易或出售这些门票,并确保每个人都能在演唱会上获得他们想要的座位。敬请关注!
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。