相信大家如果有区块链交流群的话可能会看见最近都在转发这个消息:

作为一名正在学习区块链技术的苦逼,自然是不会错过这么好的一个教材案例(毕竟这可是斯坦福大学的材料呢!!)
课程大纲和材料大家感兴趣可以自己去感受感受 链接我放在这了:
https://cs251.stanford.edu/syllabus.html
今天的重点其实是这样一道题 在第二个链接斯坦福大学期末考试的卷子里面
链接在这:
https://cs251.stanford.edu/hw/final2021.pdf
当然需要大家有一定的区块链和solidity知识基础才可以看懂我们在讲什么
那么我们来看看题目:

这道题讲的是:这是一个ERC721代币标准发行总量为16384个NFT的智能合约,用户通过调用mint函数一次性可以铸造不超过20个NFT,并且所有的内部变量已经在构造函数里面正常初始化了(不与展示)
然后我们再来看看问题:

A) 假设已经铸造了16370个NFT,那么totalSupply()=16370。解释恶意合同如何导致超过16384个的NFT被铸造。攻击者可以造出的NFT的最大数量是多少?
提示:如果在呼叫地址收到的OnERC721是恶意的,会发生什么?仔细观察铸币循环,并考虑重新铸造缺陷
B) 假设totalSupply()的当前值为16370,为实现(a)部分攻击的恶意Solidity合约编写代码。
C) 你会在上一页的代码中添加或更改哪一行代码
为了防止你的攻击?请注意,单笔交易不应产生超过20个NFT。
大致意思就是这个合约里面存在一个漏洞,攻击者可以利用漏洞来铸造出超出总发行量数量的NFT。
看到这里留一些时间给大家自己研究研究代码~




















(既然都翻到这了想必大家都想知道答案了吧)
那么首先我们对原代码进行一个解读:

到这里我们可以知道要想调用函数铸造NFT得先通过前面的几个require检测,那么我们如果正常调用合约肯定是没有办法造出超过发行量上限的NFT的,注意我们在A问里面已经告诉了我们提示,假设我们铸造的地址本身是一个合约,这个合约里面又写入了恶意代码会怎么样呢?接下来我来给大家讲解解题思路:
首先我们要知道我们一次性只能铸造最多20个NFT,那么我们需要利用漏洞攻击必须要距离总发行量还差20个NFT之内的数量下才可以恶意攻击合约,根据代码的顺序,只要通过前面的require检测就可以开始铸造,我们只需要设计一套恶意代码(只要给合约地址铸造NFT就会触发重复调用mint(铸造)的代码)并且每一个地址都是这样的恶意合约地址。
打个比方,我在距离总发行量还差20个NFT的同时输入20个地址铸造NFT,合约就会传入20个数组,这20个数组都是可以通过前置的require条件的因为这20个铸造完总发行量正好会达到规定的16384个,那么在第一个恶意合约地址被铸造NFT的时候就会触发恶意代码并且重复调用mint函数并额外输入19个地址(原恶意合约地址+19个额外地址=20个剩余名额),那么第二个恶意合约地址就会触发额外输入18个地址(因为前面已经存在两个铸造的地址)以此类推,当20个地址全是恶意合约地址的时候,攻击者最多可以额外铸造19+18+17+16+15+14+13+12+11+10+9+8+7+6+5+4+3+2+1个NFT就是190个NFT,可以这么做的原理是利用了区块链的一个特点就是出块机制。

简单来说就是,调用智能合约功能的时候所有的参数和智能合约的状态都会打包成一个事务,当一个区块没有被打包完成出块时,这个区块里面发生的所有事务都还没有变成已经发生的“事实“,意思就是当区块没有出块时,这最后20个NFT是没有被实质性铸造出来的,所以当同时有很多个铸造20个NFT的事务同时出现的时候,这些事务都是可以全部通过前置的require检测的,这个漏洞导致了攻击者可以超出总发行量的数量来铸造NFT。
我们回到A问,假设已经铸造了16370个NFT,那么还剩余14个可以被铸造的NFT名额,利用我们上面的办法我们可以额外铸造13+12+11+10+9+8+7+6+5+4+3+2+1=91个NFT。
B问的恶意代码实现这里就不给大家做展示了,原理就是给把要铸造的地址做成恶意合约,当给合约铸造NFT的时候触发重复调用mint。
那么来到C问,既然我们知道了漏洞原理,我们如何防止这个合约被恶意攻击呢,其实非常简单,我们只需要在for循环后面加上一行:
require(totalSupply <= 16384);
意思是:在每个NFT被铸造之后检查NFT现在的发行量有没有超过16384个,有了这个后置require检查逻辑的话,使用恶意合约地址代码攻击将会失效,因为即使同时接收了多个铸造NFT的事务,当NFT铸造超过16384的时候整个事务就会失败无法出块变成“事实“。

区块链的世界充满无限的想象和创新,如果大家有全新的解题思路欢迎大家评论和留言,这里特别感谢我的导师:学开叶跟 (也是我导师的微信公众号,想学习更多区块链知识可以关注他)

目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非
文章目录1.任务背景2.任务目标3.相关知识点4.任务实操4.1安装配置JDK4.2启动FISCOBCOS4.3下载解压WeBASE-Front4.4拷贝sdk证书文件4.5启动节点4.6访问节点4.7检查运行状态5.任务总结1.任务背景FISCOBCOS其实是有控制台管理工具,用来对区块链系统进行各种管理操作。但是对于初学者来说,还是可视化界面更友好,本节就来介绍WeBASE管理平台,这是一款微众银行开源的自研区块链中间件平台,可以降低区块链使用的门槛,大幅提高区块链应用的开发效率。微众银行是腾讯牵头设立的民营银行,在国内民营银行里还是比较出名的。微众银行参与FISCOBCOS生态建设,一定
当音乐碰上区块链技术,会擦出怎样的火花?或许周杰伦已经给了我们答案。8月29日下午,B站独家首发周杰伦限定珍藏Demo独家访谈VCR,周杰伦在VCR里分享了《晴天》《青花瓷》《搁浅》《爱在西元前》四首经典歌曲Demo背后的创作故事,并首次公布18年前未发布的神秘作品《纽约地铁》的Demo。在VCR中,方文山和杰威尔音乐提及到“多亏了区块链技术,现在我们可以将这些Demos,变成独一无二具有收藏价值的艺术品,这些Demos可以在薄盒(国内数藏平台)上听到。”如何将音乐与区块链技术相结合,薄盒方面称:“薄盒作为区块链技术服务方,打破传统对于区块链技术只能作为数字收藏的理解。聚焦于区块链技术赋能,在
🎉精彩专栏推荐💭文末获取联系✍️作者简介:一个热爱把逻辑思维转变为代码的技术博主💂作者主页:【主页——🚀获取更多优质源码】🎓web前端期末大作业:【📚毕设项目精品实战案例(1000套)】🧡程序员有趣的告白方式:【💌HTML七夕情人节表白网页制作(110套)】🌎超炫酷的Echarts大屏可视化源码:【🔰Echarts大屏展示大数据平台可视化(150套)】🔖HTML+CSS+JS实例代码:【🗂️5000套HTML+CSS+JS实例代码(炫酷代码)继续更新中…】🎁免费且实用的WEB前端学习指南:【📂web前端零基础到高级学习视频教程120G干货分享】🥇关于作者:💬历任研发工程师,技术组长,教学总监;
我想为我的应用程序编写测试,尽管每次我查看rspec.info时,我真的没有看到一个明确的路径来实现“做正确的事情”并首先进行测试。我不止一次在rspec上观看了peepcode视频,但没有用。我想对自己的工作更加自豪,我认为测试会有所帮助。怎样才能突破这个心理障碍? 最佳答案 寻找可以奖励您进行测试的工具。例如,使运行所有测试变得非常容易并得到类似这样的消息73testspassed.尝试randomtesting因为您可以快速轻松地针对大量值进行测试。查看您的语言是否提供测试覆盖率分析工具,该工具可以为您提供语句覆盖率百分比或b
前阵InfoQ社区看到腾讯云腾讯云区块链服务平台(TBaaS)长安链体验活动,一顿操作猛如虎报了个名,体验完用一个字概括:强。非要再加几个字的话,总体感受下来装配模式灵活高效,配套工具完整辩解。话不多说开始主题本文目录结构分为区块链分类和TBaaS平台介绍、TBaaS平台上链教程三个部分一、区块链分类:大体上来说,区块链可分为公链,联盟链,私有链三种:公有链(PublicBlockchain)公有链是指任何人都能参与的区块链。公有链是去中心化程度最高的区块链,不受机构控制,整个账本对所有人公开透明。任何人都能在公有链上查询交易、发送交易、参与记账。加入公有链不需要任何人授权,可以自由加入或者离
时隔很久没有学习区块链了,今天重新搭建一下区块链网络,有了更多新的体会。我是跟着b站up主DevX_一步一步往下搭建的。这是大神的视频,简洁易懂而且很符合我目前的技术栈(java应用端+java链码),而且代码开源,非常适合新手学习!!DevX亡命天涯的个人空间-DevX亡命天涯个人主页-哔哩哔哩视频经过测试已成功。为了今后学习便利,记录一遍搭建过程。一、区块链搭建网络拓扑结构:本次环境搭建要求:3个Orderer节点以满足raft共识;2个组织:org1、org2;两个组织内都有两个peer节点。但是我懒得开多台虚拟机,索性利用一台虚拟机整多个端口来搞了,划分清楚端口就好。资源规划如下:节点
为学习贯彻党的二十大工作报告中关于加快发展数字经济、促进数字经济和实体经济深度融合的重要指示,不断推进数字化转型与金融科技创新,桂林银行联合全国大学生数学建模竞赛广西赛区组委会、广西应用数学中心(广西大学)共同主办2023年“桂林银行杯”数据建模大赛暨全国大学生数学建模竞赛广西赛区热身赛。本次大赛旨在向学科专业竞赛靠拢,鼓励大学生向创新型、应用型、复合型人才发展,更好地提升大学生的创新意识和金融科技能力,为数据分析与建模人才提供更广阔的发挥平台,为建设数字中国、数字广西提供新动能。赛道说明:赛道A:个人消费贷款申贷客户识别。此赛道面向本科及以下学历的高校在校生。赛道B:Z世代的信用卡消费行为分
智慧医院不良事件精细化管理平台——微信小程序总结一、实现的功能二、项目收获三、总结(经历分享)一、实现的功能到目前为止,微信小程序开发,到此就算是结束了,其中实现了不少功能,如下:1.1角色与权限(后端同学实现的,写这个方便介绍后面的功能)平台可以配置不同的用户角色并授予其不同的操作权限。每个用户在使用平台时都需要指定一个角色。1.2可视范围——根据角色绑定的权限菜单全体职工可以查看自己上报的事件(待审核、已通过、被驳回)。质控人员可以查看所有的事件(待审核、待评价、已通过、已驳回、已评价)。职能人员可以查看自己/自己部门负责的事件(待整改、待评价、已评价)。各科室医务人员可以查看本科室相关的
1.下列定义变量的语句中错误的是______。A、int_intB、doubleint_C、charForD、floatUS$答案:D知识点:常量、变量和标识符2.以下不合法的用户标识符是______。A、j2_KEYB、DoubleC、4dD、_8_答案:C知识点:常量、变量和标识符3.以下4组用户定义标识符中,全部合法的一组是______。A、_mainencludesinB、If-maxturboC、txtREAL3COMD、intk_2_001???答案:A知识点:常量、变量和标识符4.以下定义语句中正确的是______。A、chara='A'b='B';B、floata=b=10.0