斯坦福大学区块链期末考试题
相信大家如果有区块链交流群的话可能会看见最近都在转发这个消息:
作为一名正在学习区块链技术的苦逼,自然是不会错过这么好的一个教材案例(毕竟这可是斯坦福大学的材料呢!!)
课程大纲和材料大家感兴趣可以自己去感受感受 链接我放在这了:
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的时候整个事务就会失败无法出块变成“事实“。
区块链的世界充满无限的想象和创新,如果大家有全新的解题思路欢迎大家评论和留言,这里特别感谢我的导师:学开叶跟 (也是我导师的微信公众号,想学习更多区块链知识可以关注他)
斯坦福大学区块链期末考试题相关推荐
- a16z和斯坦福大学区块链研究中心将于5月4日举行NFT虚拟峰会
据官方消息,由 Andreessen Horowitz (a16z)和斯坦福大学区块链研究中心主办的 NFT 虚拟峰会将于太平洋时间 5 月 4 日 11:30AM 至 1:30PM (北京时间 5 ...
- c语言大学期末考试题及答案,大学C语言期末考试题4及答案
<大学C语言期末考试题4及答案>由会员分享,可在线阅读,更多相关<大学C语言期末考试题4及答案(9页珍藏版)>请在人人文库网上搜索. 1.大学C语言期末考试题及答案(4)1. ...
- 湖北工大的c语言期末考试题,天津工业大学C++语言期末考试题
天津工业大学C++语言期末考试题 -------------------------------------------------------------------------------- 一. ...
- 山东大学软件学院2021-6 《区块链》期末考试_孔老师_fromLWT_区块链期末考试题目回忆
前言 简单回忆记录2021学年春季学期的限选课区块链的期末考试题目,记忆可能有偏差,请谅解.相关内容为个人观点,不是正确答案- 个人观点:课程内容丰富(有请其他老师来拓展),孔老师与同学的课上互动很多 ...
- 北京工业大学c语言期末考试题,北京工业大学C语言部分练习答案.docx
北京工业大学C语言部分练习答案.docx 练习练习 1 分支分支 1. 若从键盘输入 58,则以下程序段的输出结果是(58 58 58) int mainvoid int a; scanf" ...
- 四川大学大学计算机基础期末考试题库,四川大学大学计算机基础
四川大学大学计算机基础 (11页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 第1部分 计算思维与计算机一. 计算思维1. 三种科学思维① ...
- 大一期末计算机应用基础考什么,大学计算机应用基础期末考试题
选填,简要介绍文档的主要内容,方便文档被更多人浏览和下载. 1.计算机系统由两大部分组成.系统软件和应用软件 2.计算机中所有的存储都采用是,二进制数11000000对应的十进制数是192. 3.对计 ...
- 大学C语言期末考试题库试题及答案(1)
1. 下列定义变量的语句中错误的是______. A.int _int B.double int_ C.char For D.float US$ 答案:D 知识点:常量.变量和标识符 2. 以下不合法 ...
- 大学C语言期末考试题库试题及答案(3)
11.设有以下定义,值为5的枚举常量是(). enum week{sun,mon=4,tue,wed,thu,fri,sat} w: A tue B sat C fri D thu 12.下面选项中正 ...
- 大学C语言期末考试题库试题及答案(2)
181. 执行下列程序时输入:123<空格>456<空格>789<回车>,输出结果是______. main() { char s[100]; int c,i; s ...
最新文章
- MySQL命令梳理_MySQL操作命令梳理(1)
- Activity Monitor 闪退 无法进入睡眠
- 如何构建一个拖垮整个公司的备份系统
- 存储器和寄存器数据传输(ARMv8)
- linux内存不足,swap交换分区创建
- 《构建之法》第四章读后感--软件工程
- springboot 学习笔记【1】开发第一个spring boot应用
- JavaSE实战案例贪吃蛇小游戏
- python学习大纲-Python学习大纲,全网最清晰学习思路
- project各版本网盘免费下载
- ASC转换BCD,ASC2BCD
- shiro.crypto.CryptoException: Unable to correctly extract the Initialization Vector or ciphertext
- 读书报告1500字计算机大学篇,大学生读书报告1500.doc
- 《计算机系统与网络安全技术》一页纸开卷/期末复习内容
- matlab设置图片的比例,Matlab 画图字体,字号的设定,图片大小和比例
- PDC钻头刀翼的设计方法
- 宏病毒组(四)|病毒注释软件介绍
- 任正非 采访 安卓 鸿蒙,法媒专访任正非透露“鸿蒙”系统“很可能”快过安卓...
- 《Android开发卷——自定义日期选择器(二)》
- ASTER: An Attentional Scene Text Recognizer
热门文章
- 虚拟机3-11-14:53,工作记录
- 人民日报海外版总编辑詹国枢谈新闻写作技巧:五句话妙手著文章
- Java入门,最全面最简单的Java基础教程
- Vijos 1523 贪吃的九头龙 【树形DP】
- Reservior Sampling(蓄水池采样) in Data Streams
- can滤波 dsp_CAN dsp 28335 CAN通信使用例程,已测试,可以正常 ,欢迎交流学习 DSP program 267万源代码下载- www.pudn.com...
- 计算机实践教程作业桌面管理截图,如何将电脑现在的桌面截图,并保存在考试题目里面...
- 5款高质量app界面ui设计实例欣赏
- App项目实战之路(三):原型篇
- 人类与计算机作文1500,人类群星闪耀时作文1500字