Hacking智能合约:入门指南

智能合约的基础知识概述

Hacking智能合约:入门指南

智能合约的基础知识概述

用最简单的话来说,智能合约不过是一个在区块链上运行的计算机程序。虽然让现实世界的合同通过代码执行的主要目标是减少将自然语言合同转化为可执行代码的成本和时间,但围绕智能合同的用例数量已经有了巨大的增长。

如果你对智能合约这整个概念感到陌生,并且不知道从哪里开始,这里有一些东西可能会帮助你

什么是智能合约?

一个智能合约可以被定义为区块链内两个人之间的协议。这种协议最重要的部分是,它是自我执行的,安全的,不需要任何第三方的参与,如律师或银行。它还消除了对手方的风险,允许用户在任何时间点检查他们的余额,并确保没有人在未经双方同意的情况下改变他们的余额。理解我们说的 “智能合约 “是什么意思的最好方法是将它的名字一块一块地分解:1)合同。随着时间的推移,各种法律因不同的原因被添加到上面后,合同变得不仅仅是两个人之间的承诺交换。一份精心起草的协议将包含各种陈述、保证和条款,旨在保护双方在交易过程中发生的意外事件。2)智能:这是指这些协议在现实生活中与实际需要时的自我执行能力。现在我们知道什么是智能合约,让我们看看一些现实世界的例子!一个简单的例子是每个月从你的银行账户直接转钱到你朋友的账户,不需要你(或你朋友)手动

为什么会使用它们?
因为智能合约的设计方式,它们可以实现代码的无信任执行。这意味着我们可以创建不需要由中央机构控制的自治组织。它们降低了交易成本,并消除了对可信第三方的需求。为什么这很重要?因为它允许我们自动进行相互之间的交易,并确保它们以所有各方都同意的方式发生(正确的金额,在正确的时间发送,等等)。它还减少了对手工处理这一过程的第三方的需求(如银行或律师)。

它们是由什么组成的?
智能合约是一种计算机协议,旨在以数字方式促进、验证或执行合同的谈判或履行。智能合约允许在没有第三方的情况下进行可信的交易。这些交易是可追踪和不可逆转的。

智能合约是由在区块链技术上运行的软件代码组成。这种代码与区块链的原生账本互动,在满足某些条件时执行特定功能。代码可以用各种编程语言编写,如Solidity(Ethereum使用)、Simplicity(Blockstream使用)等,取决于用于部署智能合约的区块链类型。

一般来说,智能合约的创建有两个主要原因。

以透明、无冲突的方式存储两个人之间协议的数据,同时避免中间人的服务
根据该协议自动运行一个应用程序

Solidity
Solidity是编写Ethereum智能合约的最流行语言。它是一种面向合约的语言,这意味着它是为编写智能合约而建立的,并模仿了现实世界的合约概念,如类、状态变量、函数、继承和库。Solidity也继承了JavaScript和Python语言的一些语法。

Solidity代码是用ECMAScript(或JavaScript)编写的,并被编译为EVM的字节码。它是静态类型的,支持继承和库。

你如何开始?
要开始学习智能合约黑客技术,你需要做以下工作。

安装Metamask
在Metamask中创建一个新的钱包,并保存你的种子短语
从一个水龙头(https://faucet.ropsten.be/https://faucet.metamask.io/)获得免费的测试以太币
通过Metamask页面顶部的下拉菜单,连接到Metamask中的以太坊测试网络(Ropsten)。
安装Remix (https://remix.ethereum.org/)
安装Solidity编译器 (https://solidity.readthedocs.io/en/develop/installing-solidity.html#binary-packages)
使用 npm install -g truffle 安装 Truffle (http://truffleframework.com/)
使用 npm install -g solidity-linter 安装 Solidity Linter (https://github.com/duaraghav8/SolidityLinter)

常见的漏洞和利用方法
智能合约中存在几个漏洞,可被恶意行为者利用。这些攻击可以让攻击者获得代码执行的控制权,并窃取资金,删除数据,或改变合同的状态(又称改变它被编码为应用的规则)。

最突出的漏洞被称为 “重放攻击”,因为它允许攻击者在智能合约上重复执行操作(如发送交易),而不花任何自己的资金 — 这违背了使用平台的初衷 如果你发送了一笔交易,并且你的合约代码接受了这笔交易,以达到某种目的(例如发行代币),那么以后任何不同输入的交易都应该被你的合约逻辑拒绝,因为这些账户之间没有资金转移!这就是为什么你的合约会被拒绝。不幸的是,这并不总是发生,因为攻击者往往能够编写不检查重复交易的自定义合同。

另一个主要问题是整数溢出和下溢。当一个函数溢出其有限的可用数字范围时,就会发生整数溢出(例如,将一百万美元加到0美元,评估为一百万美元)。当试图将一个大数转换为另一个大数时,就会发生下溢(例如,将10亿美元转换为40亿美元)。

重心是另一种常见的攻击机制:攻击者获得对你的代码的控制权后,可能会利用这种权限自己运行进一步的动作,以利用你的代码的其他部分,甚至访问你在这个平台上控制的其他账户 这类问题发生在采用那些设计成可以接受多个参数以执行额外代码的函数 — 通常被称为回调函数。

重放攻击
重放攻击是指一个交易被恶意行为者广播到网络上,然后在它最初被开采成区块后被同一行为者重复。

重放攻击发生在攻击者向网络广播一个交易,然后在矿工有时间将其挖成区块之前试图重新广播同一交易。这可能导致该交易的第一次广播被取消,因为矿工会忽略具有相同nonce和发送者的额外交易。

这可以通过确保发件人的账户和每笔交易的nonce是唯一的来防止。

这种攻击的一个例子是,如果Alice向Bob发送了10个以太坊,但Eve(他可以访问Alice的私钥)在它被开采成区块之前再次转播Alice向Bob发送10个以太坊。在这种情况下,Eve的两次尝试性的以太币转移中只有一次会成功通过。如果两个都被接受了,我们可以说Eve的以太币转移是 “双倍花费 “的。

整数溢出和下溢
首先,我们必须了解一下什么是整数溢出和下溢。这两个函数允许溢出和下溢 — 这些都是不可能的结果,会导致坏事发生。一个整数基本上是一个整数,如1、5或45;它是计算机数据的基本单位。溢出和下溢都会导致一个整数值大于或等于原始数字和小于原始数字 — 换句话说,它们都代表了一种不可能的情况!

重入式攻击
什么是重入式攻击?重心攻击是一个区块链漏洞,允许黑客窃取智能合约的余额。它发生在智能合约调用一个不受信任的外部地址,而该外部地址能够在第一笔交易完成之前再次调用原始合约。这可以让攻击者的恶意代码在第一个账户执行完毕之前就把它的资金耗尽。

你如何抵御这种情况?这里有两种方法可以保护你的合同不受攻击。

你应该在你的函数每次转移以太币时使用require()或assert()语句,并确保没有来自同一账户的未决提款。然而,请注意__这并不包括所有的情况,因为提取部分余额仍然可以让攻击者使用重入法提取更多的余额。
保护自己免受重入攻击的最好方法是通过精心设计。例如,在某些情况下,使用提款模式等机制,而不是直接将以太币从你的合约中转出,可能会更好(后面会有更多的介绍。)
你可以在我的另一篇关于再入性的文章中阅读更多这方面的内容。

为什么这对你的项目很重要?
智能合约是代码。而代码,正如我们都知道的,可以被黑掉。鉴于公共领域对智能合约的关注程度,如果黑客试图利用智能合约的安全漏洞,没有人应该感到惊讶。

牢记这一点,你不要把智能合约的安全视为理所当然,这一点至关重要。你需要通过使用测试自动化工具来测试你的智能合约,并在经验丰富的工程师和其他专门从事区块链技术的专家的帮助下审计其安全性。

对你来说,了解你所使用的工具,甚至了解其他人的代码是如何工作的也很重要,这样你就可以在交易执行过程中出现问题之前发现潜在问题。

智能合约技术将继续存在。
希望你喜欢这个关于智能合约的简短介绍,并且现在想知道你如何能参与到这个领域。如果是这样,我有个好消息要告诉你!你已经具备了一些必要的技能。你已经具备了一些所需的技能。

如果你对Javascript有扎实的了解,或者对C++/Python(Ruby)/GoLang和Linux有所了解,那么这绝对是值得进一步探索的事情。这些是大多数区块链项目用于编写智能合约的主要语言。此外,如果你有使用Ethereum的Solidity语言的经验,那就更好了!如果没有,那也不用担心。如果没有,那也不用担心! 有很多在线资源可以帮助你在短时间内学习基础知识。你也可以加入各种社区的Slack频道,在你开始学习这项令人兴奋的新技术时,人们会愿意回答任何可能出现的问题。


原文链接:https://learn.block6.tech/hacking-smart-contracts-beginners-guide-9c84e9de7194