Solidity智能合约安全指南:预防已知攻击的关键.

这篇具有很好参考价值的文章主要介绍了Solidity智能合约安全指南:预防已知攻击的关键.。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

流程图 

Solidity智能合约安全指南:预防已知攻击的关键.,智能合约,安全

账户

账户类型 创建成本 交易发起 使用场景 作用
外部账户(私钥的所有者控制) 创建账户是免费的 可以自主发起交易 外部所有的账户之间只能进行ETH和代币交易 1、接受、持有和发送ETH 和 token 2、与已部署的智能合约进行交互
合约账户(由代码控制,部署在网络上的智能合约) 创建合约存在成本,因为需要使用网络存储空间 只能在收到交易时发送交易 从外部账户向合约账户发起的交易能触发可执行多种操作的代码,例如转移代币甚至创建新合约 1、接受、持有和发送ETH 和 token 2、与已部署的智能合约进行交互

交易

以太坊交易是指由外部账户发起的行动,即由人管理而不是智能合约管理的账户。例如Bob发送Alice 1 ETH,则Bob的账户必须减少1ETH,而Alice的账户必须增加1 ETH。此项操作发生在交易中会变更状态。Solidity智能合约安全指南:预防已知攻击的关键.,智能合约,安全

改变EVM状态的交易需要广播到整个网络。任何节点都可以在EVM上广播交易请求;此后,矿工将执行交易并将此产生的状态变化传播到网络的其他部分。交易的手续费和交易确认上链成为Gas费和挖矿。

 Solidity智能合约安全指南:预防已知攻击的关键.,智能合约,安全

交易对象需要使用发送者的私钥签名,证明交易只可能来自发送者,而不是被篡改或欺诈的交易。交易信息内容如下图所示:

{
  from: "0x2Bfb7fD07459764Dd98FeC880349e86756694739",
  to: "0xac03bb73b6a9e108530aff4df5077c2b3d481e5a",
  gasLimit: "21000",
  maxFeePerGas: "300"
  maxPriorityFeePerGas: "10"
  nonce: "0",
  value: "10000000000",
}

Gas

如上所述,执行交易需要花费Gas。简单的转让交易需要21000个Gas。

假设Bob要向Alice发送1 ETH,需支付190gwei 的 baseFeePergas 和 10 gwei 的 maxPriorityFeePerGas,那么Bob需要支付以下费用:

(190 + 10 )* 21000 = 4,200,000 gwei == 0.0042 ETH

因此Bob的账户将会 -1.0042 ETH,Alice的账户将会 +1.0 ETH。过程中 -0.00399 ETH的基本费用,矿工保留消费 +0.000210ETH

交易生命周期

1、一旦发送交易,加密算法就会生成 交易哈希

2、然后将该交易转播到网络。并且与大量其他交易一起包含在一个集合中

3、矿工必须选择该笔交易并将其包含在一个区块中,用来验证交易并认为他”成功“

  • 如果网络繁忙,矿工未及时选择该交易,该交易将为等待状态

4、该交易收到“确认”后。确认的数量是自包含该交易的区块以来创建的区块数。区块数越大,交易被网络处理和承认的确定性就越强。

  • 最近的区块可能会被重组,但交易仍然有效,但包含在另一个区块中

交易流程实例

交易是以太坊的核心部分,当你和以太坊区块链交互时就是在执行交易并修改状态,一个完整的流程包括以下几点:

  • 构建原生交易对象

假设有一个voteForCandidate函数,是个投票合约,当用Web3js来调用时,就会产生交易对象:

txnCount = web3.eth.getTransactionCount(web3.eth.accounts[0])
var rawTxn = {
    nonce: web3.toHex(txnCount),
    gasPrice: web3.toHex(100000000000),
    gasLimit: web3.toHex(140000),
    to: '0x633296baebc20f35ec2e1c1b105d7cd1f6a0718b',
    value: web3.toHex(0),
    data: 
		'0xcc9ab24952616d6100000000000000000000000000000000000000000000000000000000'
};

交易中的数据说明如下表所示:

  • 对交易进行签名

以太坊网络需要知道交易发起人确实拥有该账户,以确保其他人不会假冒执行此交易。 向网络证明这一点的方法是使用与该账户相对应的私钥签署交易,这是一个证明你是你的过程。 过程像这样:

const privateKey = Buffer.from (
	'e331b6d69882b4ab4ea581s88e0b6s4039a3de5967d88dfdcffdd2270c0fd109', 'hex')
const txn = new EthereumTx(rawTxn)
txn.sign(privateKey)
const serializedTxn = txn.serialize()
  • 本地验证交易

已签名的交易提交给本地以太坊节点。然后本地节点将验证一签名的交易并确保它是真正有当前账户地址签名的。

  • 交易广播

签名交易由发起人的校验节点(eg:geth)广播给其他节点,一旦交易广播到网络,本地节点也会输出可以用来跟踪交易状态的交易ID。此交易标识是已签名交易对象的哈希:

transactionId = sha3(serializedTxn)

如果在公共的以太网网络上执行交易,跟踪交易状态的最佳方式是在etherscan.io上。 Etherscan的人员运行了几个节点,他们有一个很好的前端webapp与之交互。 当交易被他们的节点接受时,我们可以在他们的网站上看到待处理交易。

  • 矿工节点接受交易

矿工们是把交易打包在区块里的人。 在开始评估(gas价格是否合理)之前,矿工会维护一个交易池,一笔笔的交易被添加到交易池。

需要注意的是,矿工交易池可容纳交易的数量是有限的。 假设有一个热门的ICO或一个非常流行的dapp(如Crypto Kitties),人们都会以高gasprice提交交易,希望矿工在其他交易之前先处理。 如果大量较高的gasprice交易填满了交易池,那么我们刚刚发起的低价交易将被丢弃。 在这种情况下,我们甚至可能要重新发起交易。当然在nonce值不能变的前提下,我们提高gasprice就会提高被矿工处理的可能。

  • 矿工节点发现有效区块并向全网广播

一旦矿工选择要打包交易,交易将被验证并包含在待定块中,并且工作量就证明开始了。 矿工节点之一最终找到一个有效的块(通过解决PoW难题)并将该块添加到区块链中。 就像本地节点广播的原始交易会由其他节点接收到一样,矿工节点也将此有效块广播到其他节点中。

  • 本地节点同步新区块

最终,本地节点将收到此新块并将其同步到区块链的本地副本。 在接收到新块时,本地节点执行块中的所有交易。如果使用truffle的话,它会不断向区块链轮询确认, 一旦看到交易被确认,就会执行then()块内的代码(按照我们的程序执行)。

以太坊交易池

  • 交易池的主要功能

1、缓存交易

2、在打包区块前,对交易进行验证

3、过滤无效交易

4、惩罚恶意发送大量交易的账户

  • 流程图Solidity智能合约安全指南:预防已知攻击的关键.,智能合约,安全

用户可通过以太坊钱包或者调用以太坊节点API发送交易交易到一个运行中的以太坊geth节点。因为交易是通过节点的API接受,此交易会被视为来自本地(绿色交易块),经过校验和处理后进入交易池由矿工选择打包;如果交易是非矿工节点广播来的,此交易会被视为来自外来的(红色交易块),也会经过检验和处理进入交易池由矿工选择打包。矿工节点对于本地交易优先级会高于外来的恶交易。

  • 交易管理

主要分为可执行交易和非可执行交易。可执行交易是指从交易池中选出一部分交易执行,打包到区块中。非可执行交易相反,任何刚进入交易池的交易均属于可执行状态,在某一个时刻才会变为可执行状态。两种交易状态分别记录在pending容器中和queue容器中。交易池存在内存中,不会无限大,若超过阀值就需要对交易池中的交易进行清理。pending的容量默认是4096,queued的容量默认是1024。

  • 交易池中数据来源

1、本地提交,第三方应用通过调用本地以太坊节点的RPC服务所提交的交易

2、远程同步,是指通过广播同步的形式,将其他以太坊节点的交易数据同步至本地节点

3、交易池中交易被Miner模块获取并验证,挖矿成功后写进区块并被传播

4、 Miner取走交易是复制,交易池中的交易并不会减少,直到交易被写进规范链后才从交易池删除

5、交易如果被写进分叉,交易池中的交易不会减少,等待重新打包

  • 校验交易合法性

1、不允许交易数据超过32KB,防止DOS攻击

2、不允许转账金额为负数(实际上外部接受的交易数据属于RLP编码,无法处理负数)

3、防止程序错误,每笔交易会有GAS上限,同时为了控制区块大小避免区块的总消耗异常,区块 GAS也有上限。如果超过,交易将不能打包到区块,交易池也会直接拒绝超过限制的交易

4、每笔交易都需要携带交易签名信息,并从签名中解析出签名者地址,若解析失败将拒绝交易

5、以太坊每个账户的存在一个数字类型Nonce字段,是有序数字。每次交易都会+1,该Nonce可以表示为已打包了x次交易。因此交易池中不允许出现交易的Nonce小于账户当前Nonce的交易

6、在交易池中,会检查该账户余额,若资金不足会导致交易失败

7、若交易GAS上限低于已知的最低GAS开销,会导致交易失败

  • 进入交易队列Solidity智能合约安全指南:预防已知攻击的关键.,智能合约,安全

交易池会先采用一个txLookup跟踪所有交易。同时根据本地优先原则将交易划分为queue和pending两部分。在进入交易队列之前,将判断所有交易队列是否达到上限,若达到上限,将会移除掉交易池或当前交易中优先级最低的交易。因本地交易优先级高于外来交易交易,所以当受到外来交易,若低于最低gasPrice就会拒绝该笔交易。

为了高效获得不同价格的交易,交易池已经将交易按gasPrice从低到高实施排列。如果同一笔交易上调交易费上调10%以上的手续费将会被提前交易。文章来源地址https://www.toymoban.com/news/detail-532216.html

到了这里,关于Solidity智能合约安全指南:预防已知攻击的关键.的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 智能合约安全分析,针对 ERC777 任意调用合约 Hook 攻击

    Safful发现了一个有趣的错误,有可能成为一些 DeFi 项目的攻击媒介。这个错误尤其与著名的 ERC777 代币标准有关。此外,它不仅仅是众所周知的黑客中常见的简单的重入问题。 这篇文章对 ERC777 进行了全面的解释,涵盖了所有必要的细节。深入研究 ERC777 代币的具体细节的资源

    2024年02月04日
    浏览(40)
  • 区块链合约安全系列(三):如何认识及预防公链合约中的自毁攻击

    id:BSN_2021 公众号:BSN 研习社 作者:红枣科技张雪良 背景:由于公链环境下所有的信息都是共享的,智能合约相当于是完全透明化,任何人都可以调用,外加一些利益的驱动,导致引发了很多hacker的攻击。其中self destruct攻击也是常见的攻击方式之一。 目标:将目标合约瘫痪

    2024年02月01日
    浏览(42)
  • 智能合约安全,著名的区块链漏洞:双花攻击

    区块链技术通过提供去中心化和透明的系统彻底改变了各个行业。 但是,与任何技术一样,它也不能免受漏洞的影响。一个值得注意的漏洞是双花攻击。 在本文中,我们将深入研究双花攻击的复杂性,探讨其工作原理、开发方法、预防措施及其对区块链生态系统的影响。 区

    2024年02月04日
    浏览(57)
  • Solidity攻击合约:重入攻击与危害分析

             以太坊智能合约 开发中, 重入攻击 是一种常见的安全漏洞。这种攻击通常发生在合约的递归调用中,攻击者通过构造恶意交易,使得原本合约在执行过程中不断调用自身或其他合约,从而耗尽合约的 Gas(交易费用) ,或者导致意外的状态改变。 目录 一、原本

    2024年03月10日
    浏览(95)
  • 智能合约安全分析,假充值攻击如何突破交易所的防御?

    引言 假充值攻击,是指攻击者通过利用交易所在处理充值过程中的漏洞或系统错误,发送伪造的交易信息到交易所钱包地址,这些伪造的交易信息被交易所误认为是真实的充值请求,并将对应的数字资产或货币添加到攻击者的账户中。攻击者利用这种方式,可以获得未经支付

    2024年02月09日
    浏览(48)
  • 【solidity三】Solidity中继承、创建合约和外部调用、合约事件event、solidity中元祖的使用、new、delete关键字的使用、solisity创建合约和外部调用

    - 最重要的两个全局变量 msg.sender 每一次和以太坊交互时都会产生一笔交易,这笔交易的执行人就是msg.sender。简而言之:谁调用的,msg.sender就是谁,每笔交易的msg.sender都可以不同。举例: 部署合约的时候,msg.sender就是部署的账户。 调用setMessage时,msg.sender就是调用账户。

    2024年02月03日
    浏览(46)
  • Solidity智能合约开发 — 3.4-抽象智能合约和接口

    假如一个智能合约中至少一个函数缺省实现时,即某个函数缺少{}中的内容,这个智能合约就当做抽象智能合约。 当我们有一个函数没想好怎么写时,必须将该合约标为 abstract ,不然编译会报错;另外,未实现的函数需要加 virtual ,以便子合约重写。抽象智能合约是将智能合

    2024年02月12日
    浏览(46)
  • 【Solidity】智能合约案例——①食品溯源合约

    目录 一、合约源码分析: 二、合约整体流程:       1.部署合约       2.管理角色       3.食品信息管理       4.食品溯源管理         Producer.sol:生产者角色的管理合约,功能为:添加新的生产者地址、移除生产者地址、判断角色地址是否被授权         Di

    2024年02月08日
    浏览(53)
  • solidity实现智能合约教程(3)-空投合约

    猛戳订阅学习专栏🍁🍁 👉 solidity系列合约源码+解析 👈 🍁🍁 空投就是一种营销策略,通过空投活动将某种数字货币或代币分发给用户,通常需要用户完成一项简单的任务,如分享新闻、介绍朋友或拥有某种数字货币,目前也被广泛应用于宣传新币种,在数字货币市场中

    2024年02月07日
    浏览(78)
  • 以太坊智能合约开发(五):Solidity成绩录入智能合约实验

    每个学生分别部署合约Student.sol ,保证只有自己可以修改姓名。老师部署合约StudentScore.sol,用于录入学生成绩,查询学生信息。查询学生信息时,需要调用学生部署的合约Student.sol。 student.sol合约,用于学生对自己信息进行管理。 学生的基本信息作为状态变量: 声明构造函

    2024年02月07日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包