首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

智能合约安全——溢出漏洞

但是溢出漏洞是存在版本限制的,在 Solidity = 0.8 时溢出会报错。...所以当我们看到 0.8 版本以下的合约时,就要注意这个合约可能出现溢出问题。...很明显地,防止数据数值溢出就能修复这些漏洞了,那么就给大家一些防止数据数值溢出的建议吧!1....使用 Solidity 0.8 及以上版本来开发合约,这里还有一点:需要慎用 unchecked,因为在 unchecked 修饰的代码块里面是不会对参数进行溢出检查的;2....使用SafeMath方法库,SafeMath只提供简单的四则运算方法,但是在计算溢出时,它会抛出错误;除此之外,作为一名合约编写者,还需要慎用变量类型强制转换,因为不同的类型,其数值范围是不同的,类型强制转换有可能导致数值溢出

61130
您找到你想要的搜索结果了吗?
是的
没有找到

智能合约编程语言-solidity快速入门(下)

错误处理 在很多编程语言中都具有错误处理机制,在solidity中自然也不例外,solidity最开始的错误处理方式是使用throw以及if … throw,后来因为这种方式会消耗掉所有剩余的gas,所以目前...revert(string reason) 同上,提供一个错误信息 solidity中的错误处理机制和其他大多数编程语言不一样,solidity是通过回退状态来进行错误处理的,就像数据库事务一样,也就是说...solidity之所以使用这种方式处理错误,是因为区块链就类似于全球共享的分布式事务性数据库(公链)。...另外,如果我们正确使用assert,使用一些solidity分析工具就可以帮我们分析出智能合约中的错误,帮助我们发现合约中有逻辑错误的bug。...函数要少,所以当我一个函数只能被外部调用时尽量使用external修饰 同样的,我们来看一个简单的例子,代码如下: ?

1.3K21

深入Solidity数据存储位置

就像我父亲一样,一个不同类型的建设者,也就是人们在 web3 中所说的 "建设者"。但当我回头看这个工业工厂时,发现它的内部与 EVM 的内部有很多共同之处。...,你会得到1。...建议:强烈建议使用 evm.codes 网站来测试这两个函数,并分析操作码和存储/内存中一个一个操作码的变化。...这就是你将得到错误。 结论 你应该使用storage, memory, 还是calldata取决于你在合约中试图做什么。 对于某些数据类型,如果数据很大,把它们从存储空间复制到内存中可能会很昂贵。...,在某些情况下,使用memory而不是calldata可以提高可组合性 最后,请注意,在你的函数中不使用适当的数据位置会导致潜在的错误和漏洞。

1K10

solidity教程【0.5.7】 原

例如萨拉分$10000,本得到$5000,朱丽叶得到$2000。代码执行后,资产以代币或加密货币的形式自动分配给这些家庭成员,而无需人工介入。...这个选项的意思是使用一个内存仿真以太坊节点作为你的solidity智能合约的运行平台,这样就不用考虑与实际的以太坊主网交互所需要的账号、资金、计算费用等问题,而可以先把精力聚焦在学习如何使用solidity...2、声明solidity编译器版本 solidity还是很早期阶段的语言,从语法到编译器都在不断地演化,所以在solidity代码的第一行,一定要用pragma关键字声明这个文件中的solidity代码需要哪个版本的编译器...当我们在solidity中定义变量时,必须先声明其类型。address是solidity中一种特殊的类型,它表示一个以太坊地址。address类型的变量有一些特殊的方法,我们在后面会进一步了解。...例如,假设一个用来关灯的方法,同时有一个修饰符要求灯开关必须处于on状态,那么我们就可以在方法上附加声明这个修饰符,以便确保只有在灯开关处于on状态时,才可以调用这个方法,否则就抛出异常。 ?

1.1K10

Solidity 简易教程

源码都必须冠以 "version pragma" — 标明 Solidity 编译器的版本....例如: pragma solidity ^0.4.0; (当前 Solidity 的最新版本是 0.4.0)....程序有时需要对不同类型的数据进行操作,因为 Solidity 是静态类型语言,对不同类型的数据进行运算会抛出异常,比如: uint8 a = 5; uint b = 6; // 将会抛出错误,因为 a...* b 返回 uint, 而不是 uint8: uint8 c = a * b; a * b 返回类型是 uint, 但是当我们尝试用 uint8 类型接收时, 就会造成潜在的错误。...在智能合约中使用随机数很难保证节点不作弊, 这是因为智能合约中的随机数一般要依赖计算节点的本地时间得到, 而本地时间是可以被恶意节点伪造的,因此这种方法并不安全。

59210

Foundry教程|如何调试和部署Solidity智能合约

Foundry 简介 [视频] Foundry 入门 使用 Foundry 的 Hardhat 使用 Solidity 测试 Foundry 作弊代码 部署和使用合约 Foundry 简介 制作了一个...就个人而言,喜欢 Hardhat 的脚本环境(特别是对于复杂的部署),但也认识到使用 Foundry 进行测试和模糊处理的好处。在同一个代码库中使用这两个应用程序,可以提供两个最佳选择。...为了使用 slither,一般会切换到 WSL(linux 的 Windows 子系统),它可以用以下命令安装(注意 0.8.13 是目前 foundry 演示合约中使用的 solc 版本。...你可以把它修改为 Solidity 文件中设置的任何版本)。...abc123 Windows Powershell: --privateKey $env:privateKey $env:privateKey = "0x123abc" 私钥不应该包含 0x 前缀,否则你会得到一个错误

1.9K20

蚂蚁区块链第12课 如何使用命令行编译工具solcjs编译Solidity智能合约?

本文介绍由蚂蚁区块链平台提供的 Solidity 编译工具 solc-js 的 下载、安装 和 使用方式 。...说明: 蚂蚁区块链对 Solidity 语言的支持与原生的 Solidity 语言不同,因此不能使用外部社区的 solc-js 编译工具。...BaaS 平台提供的 solc-js:alipay-solc-0.1.12.tgz 可兼容 Solidity 语言 0.4.24 版本之前的语法(不包含 0.4.24)。...: solcjs --bin hello.sol 如果编译通过,此目录会得到包含字节码的结果文件 hello_sol_Hello.bin,如果编译失败则提示错误信息。...在 JS 代码中编译 Solidity 合约后,得到编译字节码和合约接口说明(ABI),进而可直接使用 JS SDK 来部署、调用合约。

1.6K00

合约开发全新技术栈:Buidler + Ethers + Waffle + Typescript【译】

Ethers.js (替代Web3.js) Ethers.js[7] 是一个Javascript SDK,用于与以太坊区块链进行交互。之前使用Solidity开发时,一直使用Web3.js。...当我第一次尝试Ethers.js时,对它如此简单及API的出色程度感到震惊。推荐曾经使用Web3.js的任何人尝试一下Ethers.js。...Ethers.js是一个Javascript SDK,用于与以太坊区块链进行交互。当我开始进行Solidity开发时,长期使用Web3.js。...当我第一次尝试Ethers时,对它的设置如此简单以及API的出色程度感到震惊。敦促曾经使用Web3.js的任何人尝试一下Ethers。...Compiled 2 contracts successfully Buidler使用AMAZING 来对Solidity进行版本控制。

2K40

如何利用OpenZeppelin编写可升级的智能合约

最明显的方式将是这样的: •创建并部署新版本的合约。•手动将所有状态从旧合约迁移到新合同。 这似乎可行,但是有几个问题。 1.迁移合约状态可能代价非常大。2.当我们创建和部署新合约时,合约地址将更改。...继续操作时,请勿输入$字符,否则会出现一些奇怪的错误。 我们将在本教程中使用本地区块链网络。最受欢迎的本地区块链是Ganache。...•当我们从TodoList2中获得2个项目时,这表明状态在整个更新过程中都得到保留。...修改合约 由于新功能或错误修复,在编写合同的新版本时,还要遵守其他限制:您不能更改合同状态变量的声明顺序或类型。您可以通过了解代理[23]来了解有关此限制背后原因的更多信息。...违反变量存储布局限制将导致合同的升级的版本混淆存储值,并可能导致程序严重错误

3.6K61

解析 Solidity 0.6 新引入的 trycatch 特性

在以太坊中对智能合约进行编程与常规开发人员所用的编程有很大不同,并且缺乏基本处理错误工具一直是一个问题,经常导致智能合约逻辑“破裂”。...• 我们想在同一个交易中重试调用、存储错误状态、对失败的调用做出处理等等。...参考文档: Solidity中文 文档-外部调用[5] 如果我们想在合同中的内部调用中使用try/catch模式(如第一个示例),我们仍然可以使用前面介绍的低级调用的方法,或者可以使用全局变量this来调用内部函数...每当我们尝试使用try/catch语法进行低级调用时,编译器都会返回TypeError错误提示。...计划在将来的Solidity版本使用更多条件的catch子句。 Gas 失败 如果交易没有足够的gas执行,则out of gas error 是不能捕获到的。

3.9K30

不同步节点在线使用Remix开发以太坊Dapp及solidity学习入门 ( 一 ):智能合约HelloWorld

由于版本更新,可能会出现不同,但该教材代码均适用于在0.4.20 版本使用 一:以太坊智能合约之经典打招呼——“HelloWorld” 以太坊智能合约开发使用solidity语言,如果有多年开发经验...,那么这个语言应该应该都随便看得懂,所以第一个helloworld就不做过多解释了。...本文使用开发工具为web版本的Remix的Solidity IDE。...可以增加速度 2.没有本地环境那么方便,不过还好了,如果你是一个不会同步节点的,和我一样的lowb,而且又很懒,那么使用在线的开发环境是一个很好的选择 环境: IDE:在线的Remix Solidity...默认选择最新版本,当然: pragma solidity ^0.4.20; 这句代码的意思是:的代码是 0.4.2及以上代码都可以用,但是本人确实出现过错误,所以简单的只需要在刚刚如图所示位置选择对应的版本即可

1.1K20

101项智能合约安全检查清单

相信这份方便的 "安全智能合约检查清单 "将有助于开发者/审核员在以太坊上使用 Solidity 构建更安全和稳健的智能合约。 智能合约安全检查清单 Solidity 版本。...使用非常老的 Solidity 版本,无法从错误修复和较新的安全检查中获益。使用最新版本可能会使合约容易受到未发现的编译器错误的影响。...合约应使用与其测试过的编译器版本/标志去部署。锁定 pragma(例如在pragma solidity 0.5.10中不使用 ^ ) 可以确保合约不会意外地被部署到一个有未修正错误的旧编译器版本。...(见这里[17]) 同时使用多个 Solidity pragma。最好在所有合约中使用一个 Solidity 编译器版本,而不是使用有不同错误和安全检查的不同版本。...这是由于v0.4.5中引入的一个编译器错误,在v0.6.8中得到了修复。

1.6K10

Solidity 0.7.0 新变化

://learnblockchain.cn/docs/solidity/ 在2020年7月28日,Solidity编译器的版本小幅升级到0.7.0。...它还附带了一个 版本更新日志2[5] 上面有32个要点和一整页的 专注于突破性变化2的文档[6]....最后,列出了认为不需要太多补充解释的任何变化。 最显著的变化 外部函数和合约创建调用有了新的语法,这些语法对于同样使用过Web3.js的Solidity开发人员可能会很熟悉。...仍然可以察觉到变化 用'var关键字声明一个变量,这样它的类型就会被隐式赋值已经被废弃了,已经有几个版本赞成使用显式类型的变量。但是,编译器仍然会识别出var语法,编译的时候抛出类型错误。...0.7.0 的中文文档: https://learnblockchain.cn/docs/solidity/ [5] 版本更新日志2: https://github.com/ethereum/solidity

1.2K20

用Hardhat和Ethers引入并测试知名NFT智能合约

因为知道 Bored Ape Yacht Club 使用符号 BAYC,所以我可以使用 Etherscan 搜索该符号: 可以看到这是一个经过验证的 ERC-721 代币合约,其名称是我们正在寻找的...要为 Solidity 文件添加语法突出显示和类型提示,Juan Blanco 称为“solidity”[13]制作了一个很棒的 VSCode 扩展 - 建议安装 它使开发 Solidity 更容易:...使用一个名为 “Solidity Visual Developer[14] ” 的 VSCode 扩展,你会在 VSCode 市场中找到更多。...我们可以使用内置的 compile 任务来执行此操作 - 我们需要做的就是运行: npx hardhat compile 当我使用 Hardhat 编译合约时,将为每个合约生成两个文件,并放置在 artifacts...如果你更改 withArgs 中的任何值,你将得到一个失败的测试 - 正是期望的那样!

1.1K30

搞定EVM中的内存数据区,学他!

首先,当我们写入一个单字节数据 0x22 到内存中,然后用 MLOAD8 到内存位置 0x20(十进制:32)取数据时,得到的不是 而是 你也许会问了,我们只写入了一个字节,怎么会有这么多的零?...如果你写到一个以前没有被写过的内存区域,那么第一次使用该区域会有一个额外的内存扩展费用。当写到以前未使用的内存空间时,内存以 32 字节(256 位)的增量进行扩展。...实际合约中的内存 为了巩固我们到目前为止所学到的知识,我们要看一下内存和空闲内存指针是如何在真实的 solidity 代码中更新的。创建了一个 MemoryLane 合约,并有意让它变得非常简单。...已经将一个简化版本提取到 EVM Playground 中,并将在下面运行它。简化版按顺序组织操作码,去掉了 JUMP 和任何与内存操作无关的操作码。代码中加入了注释,以解释现在在做啥。...不能不强调,使用 EVM Playground 和自己按步执行操作码是多么重要。这将大大促进你的学习。现在让我们来看看这 6 个部分。

91210

Solidity语法知识点(文末有彩蛋)

一、文件名 solidity文件的扩展名为*.sol 二、指定编译器版本 pragma solidity ^0.4.0; 表示源程序在大于等于0.4.0版本的编译器可以正常工作,在大于等于0.5.0版本中的编译器中无法工作...而在remix调试程序时,传入的地址参数却需要双引号括起来,新手一开始经常会遇到这个错误。 地址有合约地址和普通的钱包地址两种。 3)结构struct 与C语言非常相似,不用多说。...b.push(1); b.push(2); 用b.length得到数组的长度,还可以直接修改length来删除元素。...对可变数组使用delete,会删除所有元素,其长度变为0。 对定长数组使用delete,则会重置所有元素为0,也可以重置指定位置的元素。 对map类型使用delete,什么也不会发生。...对map类型的一个使用delete,则会删除与该键相关的值。 学习合约编程的目的是什么呢? 1、手工用imtoken钱包给许多人发代币是一件非常费力且容易出错的事,想写一个合约来自动完成这件事。

1.3K50

Solidity番外篇(一)Solidity在线or插件使用

在学习以太坊合约的过程中会需要自己编写智能合约,官方提供了几种方式供大家使用。下面分别简单介绍一下,如果有错误的地方,还留言指正补充。...DAPP IDE 说实话,这个版本IDE还没有使用过,只提供一个连接地址供大家参考。 The-DApp-IDE 此连接中有具体的使用描述。...在线编程 Solidity支持在线编程,在线编程网址为: https://ethereum.github.io/browser-solidity/#version=soljson-v0.4.4+commit...使用简介 在线编程和浏览器插件页面初始化时已经提供了一个投票的合约,可以具体阅读以下代码。 也可以通过左上角的按钮新建自己的合约。在编写代码的过程中两个插件都会进行自动的错误提示。...不同的是,在线版本的需要制定solidity版本。 页面的其他功能大家就慢慢摸索吧。

42120
领券