1. What?

在区块链中删除代码的唯一方法是该地址的合约执行自毁操作,即 selfdestruct()。

存储在该地址的剩余以太被发送到指定目标,然后从该状态中删除存储和代码。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;contract Example{constructor(address payable to) payable {// redirect all the `msg.value` to `to` when selfdestructingselfdestruct(to);}
}

如上例所示,这是一个包含着selfdestruct()函数的简单合约。

constructor 构造器,payable关键词使得该合约在被创建时就能够接收以太

selfdestruct()自毁函数,合约在创建之时,就直接自毁,删除代码,并且将合约本身的余额强制发送到to这个地址上;

说的简单点,自毁函数只有两个核心作用

  1. 它使合约变为无效,有效地删除该地址的字节码。
  2. 它把合约的所有资金强制发送到目标地址。

2. Why?

或许你对我上一部分举出的合约例子可能会感到疑惑,为什么不说得简洁一些呢?

那到底为什么要禁用自毁函数呢?

答案就在这个例子中!

这是一个具有攻击性的自毁合约;

刚刚说到,当调用自毁函数之时,合约余额将会被强制发送指定的地址上。

注意强制这一个词,这意味着接收地址合约无论是否拥有接收以太的函数,它都无法拒绝这笔余额打进来。

而这正是自毁函数被禁用的原因

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;//被攻击合约
contract Attacked {//部署时传入0.08 etherconstructor() payable {}//获取合约余额function getBalance() public view returns (uint256 balance) {balance = address(this).balance;return balance;}//提款函数function withdraw(uint256 amount) external {require(address(this).balance > 0.1 ether);require(amount <= address(this).balance);payable(msg.sender).transfer(address(this).balance);}
}

如上例所示:这是一个被攻击的合约

那么问题来了,如何使用上面所学知识,将合约中的0.08 ether装进自己的钱包?

3. Try !

让我们研究一下此合约

  1. receive()、以及任何实现payable的function,说明合约无法正常接收以太交易;
  2. withdraw()是外部函数,并且最关键的限制条件是使合约余额大于0.1 ether;

结论

只要我们能够有办法将0.021个甚至更少的ether打进该合约,让调用withdraw()函数满足条件,就可以成功赚到0.08个ether。

讲到这里,相信大家已经悟了,摩拳擦掌准备大展身手了!

实战 !

  • 被攻击合约本身就有0.08 ether

  • 部署攻击合约,传入大于0.02个ether

  • 查看合约余额是否大于0.1 ether

  • 调用withdraw()函数提取合约所有余额,大功告成!

更多区块链技术干货请关注

岚链技术论坛

77Brother的技术小栈(个人博客)

区块链骇客第二讲: 自毁攻击相关推荐

  1. 区块链骇客第一讲:重入攻击

    本篇文章开启区块链骇客专栏的第一讲,让我决心开写本专栏的首要原因是对未来的职业选择有了一个确定的规划. 日后的更新频率将会不小于等于每周一讲,欢迎各位读者监督和指正,一起学习一同进步!

  2. 视频教程-区块链技术原理精讲-区块链

    区块链技术原理精讲 5年JAVA/Go研发工程师经验.目前作为公司技术负责人从事区块链架构设计.研发工作. 熟悉分布式系统/区块链.云计算/虚拟化技术.敏捷开发等领域技术,开源软件爱好者. 荆帅帅 ¥ ...

  3. 柏链道捷首期“PDJ区块链极客马拉松”:靠谱的区块链项目这样来发掘和开发

    4月22日,首期"PDJ区块链极客马拉松"在北京国家会议中心大酒店举办.这是一场区块链精英专属的Hackathon活动,由柏链道捷(PDJ Education)联合CSDN.产业大 ...

  4. 每期十分钟,听懂区块链,《玲听·区块链通识70讲》重磅上线

    作者:王佳建 这两天,全球央行大放水,美联储一次性降息50个基点.微博上一群炒币的人大惑不解,比特币不是要减半了吗?它不是对抗通胀的数字黄金吗?可为什么还跌啊? 这两天,有些朋友离开了,他们说,一直相 ...

  5. 极客招募令!兄弟杯区块链极客竞技大赛在上海等您来战!

    据悉,由国内首家区块链技术社区区块链兄弟主办,旺链科技.离子链.中国云体系产业创新战略联盟.无退社区.指旺金科等单位强力支持,HiBlock区块链社区.火球财经.布洛克财经.海豚区块链.区块网等百家技 ...

  6. 《区块链编程》-第二章

    文章目录 椭圆曲线 练习1 代码实现 测试 练习2 代码实现 测试 实现加法恒等元的点加法运算 代码实现 测试 练习3 代码实现 练习4 代码实现 运行结果 练习5 代码实现 运行结果 练习6 代码实 ...

  7. 区块链系列课第二讲区块链的核心优势

    第二讲 区块链的核心优势 区块链技术给数字经济时代带来了巨变的曙光. 这种巨变在互联网近50年的历史上曾发生过两次.第一次巨变是全球性的联网--第二次巨变是全球性的应用--第三次巨变正在蕴酿. 不论你 ...

  8. 区块链相关安全名词及常见攻击手法

    钱包 Wallet 钱包(Wallet)是一个管理私钥的工具,数字货币钱包形式多样,但它通常包含一个软件客户端,允许使用者通过钱包检查.存储.交易其持有的数字货币.它是进入区块链世界的基础设施和重要入 ...

  9. w1区块链基础知识25讲

    11讲哈希值在现实世界的应用 哈希函数:以任意长度的数据输入,输出固定长度的数值,比如 32byte .这个值就称为哈希值,也可以称为 摘要 散列 指纹等. 11.1数据对比 目标就是对比两份数据不需 ...

  10. 当当网“夫妻店”官宣分手,李国庆欲以区块链DAPP开启第二春

    今天(2月20日),当当网创始人.CEO李国庆发布公开信,宣布离开当当,开始全新的行程,而这一全新行程就是他多次站台的区块链项目CRYSTO.当当网同时发布人事调整公告,确认李国庆离职,并宣布董事长俞 ...

最新文章

  1. gcc c语言标准,GCC 7.1发布 支持当前所有的C ++ 17标准
  2. 一种集合“相等性”的实现
  3. 14.1 线程回顾和同步函数
  4. stl源码剖析_《STL源码剖析》学习笔记——空间配置器
  5. 数据科学竞赛-房价预测
  6. php swoole websocket vue 实现聊天室案例
  7. 解决mysql表被crash的一次维护始末
  8. 吴恩达机器学习 —— 2.7 计算图
  9. 基于ASP.net的电力系统分析精品课程网站
  10. java抠图边框颜色处理_java 实现抠图(项目应用场景:抠图章)
  11. Vue之不常注意的点
  12. 关于机器学习的十个实例
  13. 矩阵乘法、转置矩阵、对称矩阵
  14. 笔记整理 之 ERROR 1336 (0A000)问题记录
  15. 小红书数据平台:2022年5月彩妆行业数据洞察报告
  16. 如何制作wordpress短代码
  17. [工具]-WIKI/文档编写相关软件
  18. 关于git的使用(十五)------Rebase
  19. ISA(MIPS,ARM,RISC-V)中的算术运算溢出检测逻辑是怎样的?
  20. matplotlib animation动画保存(save函数)详解

热门文章

  1. Inoventica干线网络,600 Gbit / s。
  2. matlab怎么做多元非线性拟合,如何用matlab进行多元非线性拟合
  3. JavaScript(3)基础
  4. 使用PPT画图,取消自动选点(自动吸附点)解决方案
  5. 请收藏ANSYS Fluent电子风扇效能及噪音仿真攻略
  6. ubuntu编译安装PHP5.6 ipArchive支持 configure: error: system libzip must be upgraded to version = 0.11
  7. 桌面上计算机程序包能删吗,不小心卸载了windows驱动程序包(电脑上别乱清理了)...
  8. oracle 返回部分行,求救,返回部分结果后,才报单行子查询返回多行。
  9. LPC2478(6)UART
  10. 研究生英语读写译教程下课文译文及课后答案2