合约有状态变量,其中一些可以在合约创建时由创建者实例化,这些在之后是不能更改的,而那些在创建合约时没有实例化的内容可以在之后修改。

由于这些变量可以在之后更改,因此如果该变量对合约的安全性至关重要,那么则需要采取适当的谨慎措施。

以下合约模仿了一个发生在名为Parity的多重签名钱包上的攻击,攻击者盗取了3100万美元。

请注意,实际的攻击涉及的内容要更广泛,但这个简化版的实例展示了它的核心内容。

合约有一个owner,它不是在创建时实例化的,而是在后来通过函数initowner()进行的。

在实例化后,owner可以调用transferTo()并将合约中指定的_amount转给特定的_recipient。

contract UnsafeContract2{/* Define the contract owner*/address owner;/* This function sets the owner of the contract */function initowner(address _owner) { owner = _owner; }/* Function to transfer the funds in the contract */function transferTo(uint _amount, address _recipient) {if (msg.sender == owner)_recipient.transfer(_amount);}}

显然,owner是一个关键的状态变量,应该以适当的方式实例化。

不幸的是, initowner()函数允许任何包括恶意的用户调用,并将owner设置为他选择的任何地址。一旦owner被设置,owner就有可能盗取资金并将其转给任何收款方recipient()。

实例3:终止合约

我们来扩展一下前面的实例,一旦设置了关键变量owner,攻击者就可能调用除transferTo()之外的函数。例如,如果合约为owner提供了一个接口来终止合约,那么整个代码可能会与其他任何状态变量一起被删除。

contract UnsafeContract3{

/* Define the contract owner*/

address owner;

/* This function sets the owner of the contract */

function initowner(address _owner) { owner = _owner; }

/* Function to destroy the contract */

function kill() { if (msg.sender == owner) suicide(owner); }

}

类似的攻击最近发生在Parity上,结果攻击者(或很有可能是一个好奇的新手,信息来源:https://blog.springrole.com/parity-multi-sig-wallets-funds-frozen-explained-768ac072763c?gi=c41592bf2d43)冻结了大约1.5亿美元。

作者:Zilliqa爱好者中文社区
链接:https://www.jianshu.com/p/5379e44280f5
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

区块链 智能合约安全 对关键状态变量的意外更改相关推荐

  1. 论述《区块链智能合约的合同效力认定》去中心化金融的钞能力赛道

    | 没有喧嚣,没有问候的"沉默",请安静听完这段征途故事! 摘要 智能合约是自动执行合同条款的代码协议,其以代码替代传统人为执行合同,本质上是运用代码"编译"传 ...

  2. android区块链 钱包_区块链研究实验室|从Android调用区块链智能合约

    本教程将展示如何直接从Android开发环境-Android Studio中调用智能合约. 环境要求 我们将使用Tezos区块链.为了使我们的Android java代码与现有的.部署的智能合约交互, ...

  3. 什么是智能合约 区块链_什么是区块链智能合约?

    什么是智能合约 区块链 关于区块链智能合约的第一件事是它们不是智能合约,或者不是区块链上的合约. 实际上,它们的名字是奇异的. 1 ,让我们将按照相反的顺序这些问题,我们应该搞清楚一个聪明的合同实际上 ...

  4. [区块链安全-Ethernaut]区块链智能合约安全实战-已完结

    [区块链安全-Ethernaut]区块链智能合约安全实战-已完结 准备 0. Hello Ethernaut 准备工作 创建实例并分析 合约交互 总结 1. Fallback 创建实例并分析 合约交互 ...

  5. 10采用区块链智能合约管理智能城市房地产交易的概念框架

    原文标题: A conceptual framework for blockchain smart contract adoption to manage real estate deals in s ...

  6. 区块链智能合约入门:Hello world(2)

    这次的基础合约Hello world 有所升级,增加了updateMessage,让你可以随时更新自己想说的话. 其实在区块链智能合约入门:Hello world(1)这篇文章里已经介绍过,Hello ...

  7. 区块链 智能合约 简介

    根据谷歌趋势数据显示,目前,程序员对智能合约编程的兴趣已经处于历史最高水平,其中中国高居全球榜首,随着区块链技术的发展,相信日后智能合约将会与我们的生活密切相关,今天就为大家介绍一下什么是智能合约. ...

  8. 智能合约重构社会契约(11)天德区块链智能合约系统

    智能合约是可以运行在区块链上的合约代码,是一种运行在区块链之上的电子协议,它允许在没有第三方的情况下进行可信执行. 1. 设计原则 智能合约数据来源于链上. 智能合约的输人是从区块链的数据库里出来的. ...

  9. 了区块链开放平台baas_区块链开放平台 BaaS 系统开发,区块链智能合约撰写服务...

    区块链开放平台 BaaS 系统开发,区块链智能合约撰写服务 什么是区块链即服务? 区块链即服务是一种独特的经济模型,允许消费者使用基于云的服务来开发,使用和托管其区块链应用,功能和智能合约.  源中瑞 ...

  10. 区块链智能合约教材出版

    庆祝我们的区块链智能合约教材出版.感谢电子工业出版社的章海涛编辑和合著者华科软件学院的黄立群教授,华科计算机学院黄晓涛教授.购买链接在:https://detail.tmall.com/item.ht ...

最新文章

  1. phpstrom 里面的 文件修改后 的*怎样设置
  2. 处理上百万条的数据库如何提高处理查询速度
  3. 厉害了!这里藏着通关学霸的秘籍
  4. 《PostgreSQL 指南:内幕探索》之基础备份与时间点恢复(上)
  5. Windows Store App 图像
  6. .Net语言 APP开发平台——Smobiler学习日志:用Gridview控件设计较复杂的表单
  7. 数据库SQL语言的使用
  8. 关于在CSDN中写博客时如何插入图片
  9. EF Code First 更新数据库, 数据库迁移
  10. ATTCK实战系列——红队实战(二)
  11. win7系统没有telnet服务器,Win7系统没有telnet协议服务解决方法
  12. mysql 在线ddl_MySQL5.7—在线DDL总结
  13. 速率法和终点法的区别_速率法,终点法
  14. react-router-dom ^6.0.2使用过程中报错 Error: A <Route> is only ever to be used as the child of <Routes>
  15. Python基础,day2
  16. 写脚本的作用是什么?做自媒体,什么样的视频一定要写脚本?
  17. 期权希腊值之delta【python复现】
  18. 比较IC卡、ID卡、M1卡、CPU卡它们之间有什么区别?
  19. java语言基础知识
  20. 三星正整合Bada与Tizen系统

热门文章

  1. 编译HG255D的openwrt固件
  2. 网桥和交换机的工作原理及区别
  3. Mastering Oracle SQL学习笔记(join句法专题第五部份)
  4. 无法获取有关 Windows NT 组/用户 'WIN-*******\********' 的信息,错误代码 0x534。 [SQLSTATE 42000] (错误 15404))....
  5. Thymeleaf 随记
  6. linux UVC and hardware viewer
  7. Python内置函数(17)——chr
  8. VCF (Variant Call Format)格式详解
  9. 维护LINQ to SQL多对多表间关系[转]
  10. 个类似GoogleMap的客户端JS开源库