type
status
date
slug
summary
tags
category
icon
password
一、什么是区块链、以太坊、智能合约?
1.区块链相关特性:
- 多元化数据库:区块链是一个特殊的多元化数据库系统,其中每台计算机上都存储相同的数据信息。即使某台计算机发生故障,其上的信息也不会丢失,因为这些数据还保存着在网络的其他计算机上。
- 去中心化结构:与传统数据库不同,区块链是完全分散的,没有中心节点。每一个加入网络的节点(无论是服务器、笔记本电脑还是手机)都存储有一个完整实时同步的数据。
- 与传统体系的区别:与传统的银行体制形成对比,银行将每一笔交易记录在自己的系统中。而区块链则通过公开透明的规则和协议(如特定算法)来操作,所有的操作全部由机器完成,除了人为主体。这改变了我们从依赖对人的信任转向对技术的信任。
2.浅谈区块链技术的诞生:
尤瓦尔·赫拉利在《人类简史》中有提到货币的诞生是基于人们之间的共同信任。在早期的交易方式(以物易物)中,交换物品的两方都必须对所交换的物品有需求。但货币改变了这一情况,人们不再直接交换物品,而是使用一个普遍接受的中介——货币。这时为货币背书的可能是一个国家的君主,一个宗教的神灵,为了增强货币的公信力,在铸造货币时往往会刻上其标志或肖像。货币的价值不在于它自身,而在于人们对其所寄予的信任。货币本质上是一种集体的“心理建构”,即使是金币或银币,其价值也远超过它们的物质价值。
基于一个国家或一个宗教的权威而发行和管理的货币交易体系,可以被视为中心化的交易模式。然而,随着数字化时代的到来,中心化的信任机制开始面临挑战。如何在一个去中心化的网络中确保交易的安全性和真实性,成为了一个迫切的问题。
区块链技术的诞生,就是对信任机制的一次重构。与传统的货币不同,区块链技术的信任是建立在技术基础上,而不是集体心理或中心机构。如赫拉利描述的,货币的价值来源于人们的共同信任,而区块链技术则将这种信任转移到了技术上。通过去中心化的结构,区块链确保了数据的不可篡改性和透明性,从而建立了一个新的信任机制。
3.什么是以太坊:
区块链提供了比特币的公共分类账,是一个有序和有时间标记的交易记录,用于防止重复支出或修改交易记录。
和其他区块链一样,以太坊也拥有原生加密货币,叫作Ether (ETTH)。ETH是一种纯数字货币,可以被即时发送给世界上任何地方的任何人。ETH是去中心化且具稀缺性的。
与以bitcoin为首的第一代区块链不同的是,以太坊可以做更多的工作。以太坊是可编程的,开发者可以用它来构建不同于以往的应用程序。这些去中心化的应用程序(或称dapps)基于加密货币与区块链技术,因而值得信任。也就是说,dapps一旦被上传到以太坊,将始终按照编好的程序运行。这些应用程序可以控制数字资产,以便创造新的金融应用。以太坊具有以下特性。
- 内建货币与支付。
- 用户拥有个人数据主权,且不会被各类应用监听或窃取数据。
- 人人都有权使用开放的金融系统。
- 基于中立且开源的基础架构,不受任何组织或个人控制。
- 是世界上第一个可编程区块链,开发者可以在以太坊区块链上部署智能合约,从而对区块链上的数据进行修改或者使用。
以太坊存在多个网络版本。最核心、也是交易价值最大的,被称为“
主网络
”或“主链
”。此外,还有为了开发和测试目的而设立的“测试网络”,其中一个常用的测试网络(测试链)
是Ropsten
。这些测试网络允许开发者免费获取测试用的以太币,以方便进行智能合约的测试和验证。此外,还可以自建私有的以太坊网络,称为“私链”。正因为这样的设置,让我们可以不需花费任何成本就能学习智能合约。4.智能合约概念介绍(Smart Contract)
智能合约是一组自动执行预定义规则的代码,类似于我们生活中的自动售货机。当用户选择商品并支付后,售货机会自动释放商品,用户不必担心交易的信任问题,因为售货机按照预设的程序操作。类似地,信用卡的自动还款也是一种实现了智能合约逻辑的机制:在设定自动还款之后,到期时系统会自动扣款。
智能合约的这一概念,在数字货币和区块链领域得到了更深入的应用和发展。2008年,一个化名为中本聪的人或团队发表了《比特币:一种点对点的电子现金系统》论文,这标志着比特币的诞生。比特币的底层技术框架,即
区块链
,后来成为了许多技术创新的基础。2013年,受比特币启发,维塔利克·布特林提出了以太坊
概念,这被称为第二代区块链平台
。以太坊的独特之处在于它引入了智能合约功能,使其不仅仅是一个数字货币,而是一个完整的编程平台。在以太坊上,任何掌握Solidity
(这个语言与JavaScript的语法类似)的人,只要支付足够的矿工费,都可以编写和部署智能合约。简单来说,以太坊智能合约就是一段可以运行在以太坊上的代码。之所以被称作合约,是因为用户可以通过这段运行在以太坊上的代码控制有价值的事物,例如ETH或其他数字资产。
二、围绕区块链技术的几个问题:
1.信任的构建:

从上图中可以看到信任的两种情况,前一种也就是所谓的三人成虎,第二种就是一个公信度极高人的背书。
金融交易基于信任。一个国家的货币之所以有价值,很大程度上是因为人们对该国有信心。例如,人们相信一些画家的画很有价值,这幅画就可以卖出高价。所以无论是什么东西只要人们相信它具有价值那么他就是有价值的。

上图是金融交易试的两种信任情况的具体表现,中本聪提出的比特币就属于后者的情况,其核心思想是创建一个去中心化的货币系统,其中通过特定的技术和协议确保每一笔交易的完整性、安全性和不可篡改性。
2.交易的公正与透明:
中本聪通过比特币展示了如何在一个去中心化的网络中记录交易。矿工的引入不仅确保了交易信息的录入,还通过奖励机制激励了他们。

3.如何保证每笔交易的安全性和不可篡改性:
区块链保证交易安全性和不可篡改性的关键在于其独特的结构以及对密码的应用:
- 链式结构:区块链是由一系列区块组成的链条。每个区块包含了一批交易记录,并且还有前一个区块的哈希值。这意味着,为了修改任何一个区块中的信息,不仅需要修改该区块,还需要修改它后面的所有区块,这在实际操作中几乎是不可能的。
- 哈希函数:每个区块都通过哈希函数生成一个唯一的哈希值。哈希函数的特性是,即使只修改区块中的一个微小的数据,产生的哈希值也会完全不同。因此,任何篡改都会被立刻被检测到。
4.有很多人记账后,选择谁写的账单:
在一个没有中心化机构的网络中,如何确保账本的真实性?工作量证明策略被提出,旨在提高伪造账本的成本,确保每一个交易的真实与不变。

工作量证明(Proof of Work,PoW)机制:
1. 为什么需要PoW机制:
在去中心化的网络中,记账节点间可能出现分歧,导致不同的账本版本。面对多个版本,如何判断哪一个是正确的呢?在没有中心权威进行确认的情况下,这是个大问题。而"少数服从多数"的原则在此处并不适用,因为恶意攻击者可以创建众多伪造的节点来占据多数,这种攻击被称为“女巫攻击”。简单地提高加入网络的成本是无法防止此类攻击的,因为对于某些攻击者来说,这只是一次性成本。
2. PoW机制的目的:
工作量证明机制的目的是确保对网络的攻击成本极高,使得攻击变得不实际。为了篡改区块链上的数据,攻击者不仅需要控制超过50%的网络算力,还需要重新完成所有篡改后的区块的计算,这对攻击者来说是巨大的资源消耗。
3. PoW机制的工作方法:
- 区块构建:矿工从交易池中选取交易,将它们打包成一个区块。
- 计算Merkle树:矿工计算所有交易的Merkle树的根哈希值,并将其包含在新区块的头部。
- 计算区块哈希:矿工在新区块头部中添加上一个区块的哈希值、Merkle根和其他必要信息。
- 找到符合条件的哈希:矿工开始变更头部的一个字段,通常称为“随机数”(nonce),并计算新区块的哈希值,直到找到一个满足网络当前难度目标的哈希值。
- 广播新区块:一旦找到了满足条件的哈希值,矿工就可以将新区块广播到整个网络,其他节点会验证新区块,并决定是否将其添加到自己的区块链版本中。
三、智能合约环境搭建:
1.环境准备:
- Chrome
- MetaMask插件
- Remix
2.常用测试链介绍:
- Rinkeby:只支持geth客户端,一个POW的区块链,非常类似于以太坊主网
- Kovan:只支持Parity客户端。一个POA的区块链,不能挖矿,只能申请。
- Ropsten:支持geth和Parity客户端。一个POA的区块链,不能挖矿,只能申请。
三、智能合约基本操作演示:
1.在测试链上实现账户之间的交易:
Toggle
创建MetaMask账户
- 创建第一个账户,并且往钱包里面弄几个ETH(以太币):
- 在MetaMask中选择Ropsten测试链:
- 此时测试链里只有一个账户。ETH为0,点击“购买”下滑到测试水管,选择获取Ether
- 点击四五下“request 1 ether from faucet”以获取ETH



- 创建一个新的账户:账户名:lual

- 实现第一笔交易:
- 复制被转账账户的地址:
- 回到第一个账户,选择发送,粘贴lual的账户地址:
- 下一步之后确认就行了:



2.部署智能合约:
实验附件:
- 在Remix里将程序编译好:
打开Remix网站后,新建一个babysol.sol文件,将附件里的代码贴进去

这里注意一下第一行代码,
pragma
表示的是solidity
编译器的版本,这个代码的依赖的版本号为0.4.22到0.6.0。可以在网站的最右边选择编译器的版本,这里选择0.4.26,然后勾选Auto complile,编译器就会自动编译程序。
- 部署到测试链:
选择编译的下面那个图标,并在
ENVIRONMENT
中选择“Injected Web3
”:
tips:JavaScript VM是在本地做测试
这时MetaMask会弹出一个窗口,这里是想要申请相应权限:

这里将所有账户全部添加进去,之后就是下一步然后连接即可。
连接成功后会在
Account
中看到自己的钱包地址:(这里显示的是我的devil账户钱包的地址)
之后选择下方的黄底按钮(Deploy)将合约推送至测试链,点完之后注意到编译器下方显示的信息,这里会有一定的等待时间:

直到编译器下方出现一个对勾,就表示部署成功了:

此时左边窗格也会出现和合约交互的一个接口:

- 测试合约交互功能:
- 重入
- 访问控制
- 整数溢出
- 未检查返回值的低级别调用
- 拒绝服务
- 错误随机
- 竞争条件
- 时间戳依赖
- 短地址攻击
- 未知
- 整数溢出与下溢:当整数变量的值超出其允许的范围时,可能会发生溢出或下溢,导致不可预测的结果。
- 重入攻击:在一个函数调用中,被调用的合约再次调用原函数,可能导致不希望的多次执行。例如,著名的DAO攻击就是重入攻击的一种。
- 短时间浮动:在区块链上,时间和块高度可以被操纵。攻击者可以利用这点,通过挖矿操作来操纵合约的时间逻辑。
- 随机性问题:在以太坊等区块链平台上,产生随机数是有挑战的,因为所有信息都是公开的。攻击者可能预测或操纵随机结果。
- 委托调用:使用
delegatecall
或其他低级调用可能导致合约中的状态被意外修改。 - 异常处理不当:如果合约在遇到异常时没有正确处理,可能导致资金丢失或被锁定。
- 未初始化的存储指针:如果合约使用了未初始化的存储指针,可能会导致存储被意外修改。
- 控制流可预测性:如果攻击者可以预测或操纵合约的控制流,他们可能会利用这点执行恶意操作。
- 前端/后端不匹配:智能合约的后端代码和前端应用的逻辑可能存在不匹配,导致用户资金损失。
- 权限过于宽松:如果合约的权限控制设置得过于宽松,攻击者可能利用这点执行不应允许的操作。
- 固定合约逻辑:由于智能合约一旦部署就无法更改,任何发现的漏洞都无法直接修复。需要有升级机制来处理此问题。
Solgraph
是一个漏洞可视化检测工具,可以根据合约的代码生成一个无向图,显示可能存在的漏洞。 下载地址为:。SEecurify 2.0
是由以太坊基金会和 ChainSecurity合作开发的合约安全扫描器。当前支持对38个漏洞的检测,下载地址为:Mythril
是一款强大的EVM字节码安全分析工具。它从字节码人手,利用多种手段,从多个方向为Ethereum、Hedera、QuorumVechain、 Roostock,Tron和其他秉容EVM(以太坊虚拟机)的区块链提供智能合约漏洞检测,下载地址为:。- 部署合约
- 查看自己账户的余额
- 放入1个token,取走2个token
- 买flag
- 用户触发转账事件,提取100ETH
- 合约接受请求
- 在合约中进行判断取出的钱是否小于等于现有的余额
- 如果满足条件则进入转账进程,向用户发送请求
- 如果此时我们再次申请转账,我们余额是没有变的,这就是重入漏洞的一个大概逻辑
可以看到合约交互的接口有两个功能一个是变更合约的拥有者一个是查看当前合约的拥有者,这些功能都是之前代码写了的,这里详细分析一下代码:
也就是说我们只要在MetaMask插件里换一个账户然后选择changeowner,合约的所有者就切换了:

四、智能合约相关漏洞简介
1.DASP top 10:
2.各漏洞简介:
智能合约是运行在区块链上的自动执行代码。由于它们的不可逆性和与金钱相关的特性,智能合约的安全问题受到了广泛关注。以下是一些常见的智能合约漏洞:
相关工具介绍:
1.账户:
Account(账户)对应的是十六进制串。MetaMask插件界面正上方的选择框为网络选择框,点击头像可以切换账户。Ethereum主网使用的代币为Ether,即以太币。
2.Geth:
Geth是以太坊的 Go客户端,可以对合约进行交互、部署等操作。下载地址为:
3.安全测试工具:
Solgraph对函数的解析如图所示:

4.Remix:
Remix是一款为以太坊智能合约量身定故的在线IDE,地址为https://remix.ethereum.org/
智能合约漏洞举例:
举例分析一:整数溢出漏洞
Example 1:
balances[msg.sender]
和_amout
都是无符号的int型本身不存在小于0的情况,这里的两个值只要不相等,判断就会成立,就可以通过第四行达到一个减法下溢。Example 2:
当数组
arrayOfThings
长度为0时,同样会造成一个减法下溢,从而导致可以以此来控制其他地方的变量。Example 3:
var
是一个uint8
类型,假设somethingLarge
是一个uint256
类型的值,那么这里的i
永远不会超过256.漏洞防止措施:
加法溢出:
减法溢出:
乘法溢出:
具体实例分析:
解体思路:
将题目部署到测试链上面后,审一下代码:
分析代码可以知道。flag需要用币买下来,但是我们要花10000000000及以上的币才能买到flag,如果一个币一个币的申请将会十分耗时,不知道要猴年马月才能买下flag。仔细观察
withdraw
函数是存在一个整数下溢的漏洞的,变量_amount
和balances[msg.sender]
都是uint256
类型,所以不存在负数,就没有小于0这一说,当我们的余额小于要取出的余额就会导致最后我们的余额超级翻倍,这里可以先获得一个币,再取两个币。这样根据uint类型的一个回还,最终我们的账户就有了2^256-1个币。操作一下通过
bavanceOf
函数查看余额:
正好是2^256-1,此时就可以购买flag了
举例分析二:重入漏洞
条件:逻辑顺序(检查、取钱、扣除余额)
攻击条件:多次提钱/绕过验证逻辑
For Example:
注意这行代码,和之前的整数溢出里的实例不同,这里一开始就有一个if判断,保证了取的金额一定小于账户的余额。
这里虽然没有整数溢出,但是又引出了一个新的问题,注意第三行代码,这里做的是一个取钱的操作,取完之后再做的第四行从余额里扣掉取出的钱数。那么假设我在第一次取钱之后马上又做一次取钱操作,账户余额中的钱数是没有变的(因为在执行第三行代码的时候余额还没有被改变)。
这里我们简单分析一下记账的流程:

所以重入漏洞是一种基于逻辑上的漏洞,这里代码的思路是先check,然后就做了取款操作,之后才更新余额。
这里的修复方法是,check后先更新余额再做取款操作。
- 作者:Reveone
- 链接:http://www.reveone.cn/article/77b85ce5-2675-4e78-9aab-d706b32e19af
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。