1.EVMorWASM?
随着Ethereum的普及,我们在谈论智能合约时,往往默认都是利用Solidity语言开发,基于EVM的智能合约。然而,由于Ethereum本身出块时间慢,交易所需手续费高的一些缺点,越来越多的优化技术和新的公链得以推出。而WASM则是其中的一个代表性技术。作为一种全新的二进制语法,WASM有着诸多的优点,如指令体积小,运行速度快,并且内存安全。因此,运行在WASM上的智能合约可以大大减少占用的区块链资源,明显的提升出块速度和效率,并且运行时更加稳定,使得用户获得更好的使用体验。WASM支持多种不同的前端开发语言,包括Rust、C、C++、TypeScript、AssemblyScript等。考虑到适配以及工具链,并且语言本身的安全性,Rust是非常好的选择之一。
2.BlockSec的选择
BlockSec的使命是让整个Defi生态更加的安全。因此,我们除了提供审计服务之外,也希望可以从安全开发的角度给予社区更多的支持。基于Rust和WASM的诸多优点,我们决定专门针对这一技术栈给大家带来一系列的分享,也希望大家可以持续的关注我们。我们调研了如今一些比较流行的公链项目,其中NEAR公链也采用了同样的技术栈。NEAR原生支持WASM合约,并且支持Rust语言和AssemblyScript开发智能合约。因此,我们将以NEAR公链为基础,展开我们的分享与讨论。
MetaTrust:Ethereum上合约ENF ETHLEV被攻击原因是合约的“提款”函数中存在逻辑问题:金色财经报道,根据MetaTrust Alert发贴表示,Ethereum上的合约 ENF_ETHLEV 遭到攻击,漏洞的根据原因是“EFVault”合约的“提款”函数中存在逻辑问题,该函数允许用户在ENF_ETHLEV余额少于预期份额时烧毁用户的ENF_ETHLEV余额。
此前大约一小时前报道,部署在Ethereum上的合约 ENF_ETHLEV 遭到攻击。截止至现在,遭受攻击损失金额已达约 288 ETH,价值约536,000美元。所有代币已被入新的钱包 (0xee4b3d)。[2023/8/9 21:34:53]
3.用Rust开发智能合约
Rust语言由Mozilla主导开发,程序编译后的运行速度惊人,且有相当高的内存利用率,并且支持函数式和面向对象的编程风格。也许很多同学还对Rust这门语言比较陌生。不过不用担心,从本期博客开始,BlockSec会跟大家一起拨开Rust的迷雾,让每个人都能利用Rust开发出高效,安全的智能合约。
4.环境配置
4.1IDE使用
CoinsPaid:黑客攻击为Lazarus Group策划,客户资金完好无损:金色财经报道,CoinsPaid发布声明称,7月22日CoinsPaid遭遇黑客攻击,导致3730万美元被盗。我们怀疑最强大的黑客组织之一Lazarus Group应对此负责。其受害者名单还包括世界顶级公司:索尼(8100万美元)、Axie Infinity(6.25亿美元)、Horizo??n Bridge(1亿美元)、Atomic Wallet(1亿美元)和Alphapo(2300万美元)。该团队表示,作为第一要务,已确保客户资金完好无损。不幸的是,这次攻击影响了平台的可用性,公司的收入也受到了影响。
CoinsPaid首席执行官Max Krupyshev强调:“部分停机后,我们的服务正在新的安全环境中一项一项启动并运行。我们预计还需要几天时间来整理次要细节并确保系统顺利运行” 。几周内,CoinsPaid将组织一次圆桌会议,与所有Lazarus受害者宣布一项新举措,旨在最大限度地减少和防止未来此类攻击。[2023/7/27 16:01:14]
当我们在学习利用一门新的语言去开发时,选择一个优秀的IDE一定是有必要的。在此,BlockSec推荐大家使用VisualStudioCode配合Rust的插件(例如Rust-analyzer),几乎可以满足大家的日常所需。如果大家有条件,也可以尝试一下JetbrainsClion+Rust插件,学生可以免费使用哦。
Web3游戏STELLA FANTASY完成600万美元融资,KRUST UNIVERSE参投:9月13日消息,据外媒报道,RING GAMES旗下Web3游戏STELLA FANTASY宣布完成600万美元融资,韩国互联网巨头Kakao旗下公链KLAYTN主网开发商兼KLAYTN生态系统孵化器KRUST UNIVERSE参投。RINGGAMES首席执行官JoohoYUN透露,在KRUSTUNIVERSE支持下,预计能在年内为全球游戏玩家推出一款真正的P2E游戏,此外STELLA FANTASY第一次NFT预售将于9月14日开启。(雅虎财经)[2022/9/13 13:25:16]
4.2安装Rust工具链
当有了一个优秀的IDE后,我们自然还需要下载安装Rust。Rust提供了非常简单便捷的安装方法。在Linux系统中,我们只需要运行如下一行代码,即可自动下载安装Rust。
$curl--proto'=https'--tlsv1.2-sSfhttps://sh.rustup.rs|sh
安装完毕后,我们可以通过执行$rustup--version来检查安装是否成功。rustup作为Rust工具链的管理器,提供了安装、删除、更新、选择和管理这些工具链及其相关部件的方法。再此我们需要通过执行如下命令,将WASM(WebAssembly)目标添加到工具链:
Protego Trust Bank任命Ron Totaro为公司CEO:金色财经报道,Protego Trust Bank任命金融服务资深人士Ron Totaro为首席执行官,该银行继续努力为加密和数字资产的机构客户提供服务。Totaro最近的职位是Tassat Group的首席执行官,这是一家专注于数字支付的基于区块链的科技公司。
2021年,Protego在A轮融资中筹集了7000万美元,投资者包括加密货币交易所Coinbase(COIN)和FTX以及CoinDesk的母公司Digital Currency Group。据报道,5月,Protego正在寻求在B轮融资中筹集更多资金,这将使该公司的估值达到20亿美元。[2022/9/12 13:24:45]
$rustuptargetaddwasm32-unknown-unknown
5.第一个Rust合约
终于,我们到了正题。在这里,我们将通过深入剖析一个个智能合约的项目,带大家了解并且掌握如何利用Rust编写智能合约。如果大家对Rust语言本身感兴趣,网上有很多的教程,大家也可以参考。
5.1Rust的包管理器
Viktor Radchenko将卸任Trust Wallet CEO,Binance营销副总裁接任:3月29日消息,Viktor Radchenko在其社交平台发文表示将卸任Trust Wallet CEO一职,并表示将花更多时间在他的家人和有趣的项目上。Binance现任营销副总裁Eowyn Chen将接替Viktor。Viktor表示将始终支持Trust Wallet团队,并继续作为用户、导师和社区贡献者提供服务。[2022/3/29 14:24:54]
随着整个开源社区对Rust的支持,各种各样的第三方库层出不穷。为了更好的管理这些库,Cargo应运而生。上述的安装命令,也会同时帮大家安装Cargo。Cargo可协助开发者处理诸多任务,例如创建新的Rust项目,下载并编译Rust项目所依赖的库,以及完整地构建整个项目等。
5.2创建第一个Rust合约项目
当我们准备好开发环境后,首先利用Cargo新建一个合约项目,并命名为StatusMessage。
$cargoinit--libStatusMessage
该项目的目录树如下:
StatusMessage/├──Cargo.toml└──src└──lib.rs
5.3声明一个合约
一个智能合约(SmartContract)往往需要维护一组合约状态数据。如下一段编写于src/lib.rs的代码声明了一个简单的合约,叫做StatusMessage。
1#2#3pubstructStatusMessage{4records:LookupMap<String,String>,5}
接下来,我们将仔细的分析上述的五行代码。第1,2行以#开头,类似注解。事实上,这是Rust中的一种宏的表现形式。它会接收第3-5行作为输入,根据宏的定义,产生输出。例如,第一行中的#事实上是在near-sdk-macros-version包中通过nearbindgen函数定义,这是利用宏自动生成注入代码的地方(Macros-Auto-GeneratedInjectedCode,简称M.A.G.I.C.)。
如果不理解,没关系。我们只需要知道第1,2行的作用即可。具体的来说,被#注解的struct将会成为NEAR上的一个智能合约。而其他的struct只是普通的struct。因此是由NEAR开发并且提供给开发者使用的包。而第2行中的#则是用来做序列化和反序列化,从而将合约的状态可以在链上以二进制格式传输。第3-5行即为一个名为StatusMessage的结构体,其维护了一个智能合约的状态。而状态的内容在第4行中被描述。这一结构体中只含有一个成员变量,名为records。其类型为LookupMap,这里可以简单的看作一个字典类型。key和value都是普通的字符串类型。
5.4设定合约默认值
当我们声明了一个合约后,我们往往需要定义其默认值。如下代码设定了合约StatusMessage的默认值。
1implDefaultforStatusMessage{2fndefault()->Self{3Self{4records:LookupMap::new(b"r".to_vec()),5}6}7}
其中,第1行声明了这是对于StatusMessage默认值的一个实现。第2行声明该方法名称为default,返回值为Self。Self在Rust中即表示当前的模块作用域,具体来说,即代表一个StatusMessage实例。而第3-5行即为该实例的定义。由于该实例仅包含records一个类型为LookupMap的变量。通过传入一个二进制数组b"r".tovec(),即可将LookupMap初始化。其中LookupMap的new方法由NEAR自己定义,b"r".tovec()表明存储于该LookupMap中键的前缀。
5.5定义合约方法
当我们用一个结构体定义了合约的状态后,我们还需要定义一系列方法,从而可以通过外部交易,去调用这些暴露出来的方法。如下是两个定义的方法,分别可以修改和获得当前合约中的records值。注意,定义合约的方法时,也需要我们加上#,如第1行所示:
1#2implStatusMessage{3pubfnset_status(&mutself,message:String){4letaccount_id=env::signer_account_id();5self.records.insert(&account_id,&message);6}78pubfnget_status(&self,account_id:String)->Option<String>{9returnself.records.get(&account_id);10}11}
第2行impl关键字表明,我们在对StatusMessage做具体的实现。
第3-6行定义了方法setstatus。该函数用来设置当前合约的状态。其中第三个声明了方法名和变量。该函数共有两个变量,分别为&mutself和message:String。&mut表示对self的引用,并且可能修改self的内容。而message:String表明了message的类型为String。同时该函数用关键字pub修饰,注意,只有被pubfn修饰的函数才可以被外部的交易调用,表明其是public。
第4行会定义一个局部变量accountid,其值通过env::signeraccountid()中获取,表明发起这笔交易签名的用户id。
第5行将accountid做为键,message做为值插入到records中。注意,message是一个String类型的变量,由用户传入。而&message则表示对message的引用。
第8-10行则声明了另外一个函数名为getstatus。不同于setstatus,getstatus会返回一个None或者是String类型的值,这里我们用Option表示。
第9行则是通过查询用户给定的account_id,得到对应的message。
本期总结和预告
这是BlockSec针对Rust合约开发的第一期blog,本期我们讲述了Rust合约的背景,以及如何基于NEAR链去创建一个简单的合约。下一期我们将进一步描述如何利用Rust对我们创建的合约编写单元测试用例,从而调试我们的合约。
标签:USTSTASTATSMEJustCarbon Removalstarl币白皮书Wrapped StateraSMETA价格
撰文:Footprint分析师Lynn数据来源:FootprintAnalytics-HECOChainDashboard(https://footprint.
中创热点:AllinMetaverse(元宇宙),扎克伯格在豪一个未来!仅一个小时的时间,有关“Facebook正式改名Meta”的消息就冲到了微博热搜前五,引发了近3亿人讨论关注.
有一种流行的独创网络的策略,我喜欢称之为"始于功能,终于社交网络"。最开始,用一个单人工具吸引用户,然后随着时间的推移,让他们参与到网络社交中.
11月12日星期五下午16:00,由DefiCliq发起,焦点区块链主办,行业深度对话访谈AMA在焦点社区拉开帷幕。本期特别邀请DefiCliq创始人ShantanuSharma出席嘉宾.
今天凌晨,白宫宣布,拜登提名前总统特朗普任命的杰罗姆·鲍威尔(JeromePowell)连任美国联邦储备委员会主席,美联储相当于美国的中央银行.
作者|Wayne出品|白话区块链什么是Web3.0呢?用一句话来说,Web3.0是更加以用户为中心、专注于使事情更加人性化的、透明的、安全的互联网.