o几年前我重新安装了电脑,丢了BitcoinCore钱包,但我还有私钥。。有办法把钱包拿回来吗?
比特币核心
私钥
丢失的钱包
分享
改进这个问题
跟随
5小时前问的
阿里昂
1
新贡献者
添加评论
1个答案
0
对。你的私钥是你钱包的重要部分。请参见:https://developer.bitcoin.org/reference/rpc/importprivkey.html
分享
改进这个答案
跟随
5小时前回答的
铸币者
1
我们怎样才能从最低的哈希值中导出系统上所做的所有工作?
如果不是数学上的(我想证明可能相当严格),你能提供一个直观的解释为什么最低的哈希值接近系统上所做的工作总量吗?资料来源:https://youtu.be/zYzEmBlJ77s?t=4720
我的想法是:我们可以计算出找到比我们找到的哈希值低的哈希值的概率。从那里,我们可以找到一个分布的“中点”,即需要多少次尝试才能找到这样一个散列。所以它给了你一个关于分布的点。
谢谢您!
搞砸
分享
改进这个问题
跟随
5小时前问的
鲍勃
111青铜徽章
新贡献者
添加评论
1个答案
0
在比特币中使用的工作证明依赖于寻找低散列,换句话说,寻找以一定数量的零开始的散列。要找到二进制表示以30个零开始的散列,平均需要做2^30次尝试。当你找到这个散列并呈现它时,它就证明你确实做了同样多的工作。它是双向的,当你尝试2^30次时,你得到的最低哈希值将以大约30个零开始。
重要的是,这在任何规模上都有效。我能找到的最小的块散列从23个十六进制零或92个二进制零开始,这表明网络已经计算了大约2^92个散列。
如果您想更直观地看到它,请从另一个线程中查看这个答案,该线程显示了有史以来最低哈希中的零数是如何随时间而增加的。
分享
改进这个答案
跟随
4小时前回答的
伏伊特ěch标准
5122青铜徽章
比特币cli如何在不同节点上获得钱包余额?
我正在制作一个比特币移动应用程序,并试图从运行在单独节点上的守护进程中获取手机上钱包的余额。移动钱包连接到此节点,可以使用任何CLI命令,如getinfo getbalance等。
我应该将哪些CLI命令传递给守护进程,以便在我的移动应用程序上提供钱包余额?
比特币核心
比特币cli
平衡
守护进程
客户端
分享
改进这个问题
跟随
7月10日18点54分问
巴尼钱伯斯
33322银牌1212铜牌
添加评论
2个答案
5
你不能,因为比特币核心不存储这样的信息。比特币核心并不存储所有地址的所有信息,它只存储自己地址的信息以及验证交易所需的较低级别的信息(地址是较高级别的抽象)。没有命令允许您获取比特币核心钱包中没有的给定地址的余额或交易,因为此类信息不可用。
分享
改进这个答案
跟随
7月10日6:01答复
麻吉弟弟周立铭♦
53.4k44金徽章5656银徽章109109青铜徽章
添加评论
0
您可以从blockchair.com下载数据库转储https://gz.blockchair.com/bitcoin/addresses/ 数据库每天更新,并且包含网络上每个地址的satoshis余额。
分享
改进这个答案
跟随
4小时前回答的
1葛兰科
111青铜徽章
新贡献者
添加评论
使用tor连接比特币网络的安全方法是什么?
我记得的一个案例是,有人因为审查而无法将他的比特币完整节点连接到网络:https://twitter.com/TheBlueMatt/status/1161291626553270272
马特建议对无法连接的人使用TOR网桥(直接/vpn/TOR无网桥)
有什么更安全的方法连接到Tor网络以便您可以使用比特币?
完整节点
托尔
分享
改进这个问题
跟随
8月30日20:50问
普拉扬克
380711金徽章66银徽章1818铜徽章
添加评论
1个答案
0
Tor和比特币
最近我读了一篇博客文章,其中强调了使用tor bridges所涉及的问题,我将总结一些我觉得有趣的事情:
作者要求不要使用未上市或私人桥梁,这与马特在上述推文中所说的相反。
收集未列出的桥梁:http://hackerfactor.com/blog/index.php?/archives/892-Tor-0day-Finding-Bridges.html文件
公共网桥:你的Tor连接看起来像成千上万的其他用户。这在数量上提供了安全性。在最坏的情况下,对手可以看到你在使用Tor,但看不到你在Tor网络上做什么。此外,如果您断开连接,然后稍后从其他位置重新连接,则不会有任何东西将您的新连接链接到以前的连接;这降低了基于连接方法进行跟踪的风险。
使用Tor有时会给你带来风险:中国和印度
如果Tor的使用可以唯一地与您关联,那么您是可识别的。可识别意味着你可能被监视。你如何连接到Tor允许你被识别。在高风险地区,使用Tor会让你成为嫌疑犯,而未列出的桥梁会让你很容易被追踪。然而,如果你被逮捕,那么官方的指控很可能是关于一个与Tor无关的话题(规避审查、散布骚乱等)。
未上市和私人网桥用户也面临着最大的风险,因为他们位于禁止直接和公共网桥连接的许可区域
如果它们是阻塞的,那么它们显式地寻找Tor用户。
白俄罗斯互联网中断印度互联网关闭
未列出的桥集非常独特,而且非常独特
如果将Tor浏览器配置为使用网桥,则在启动期间,它会立即连接到所有配置的网桥。网络上的观察者将看到从当前真实IP地址到“非常独特且有效唯一”的网桥集的连接请求。这使得跟踪你的对手知道建立连接的IP地址就是你。结合历史观察,他们可以确定您第一次请求这组桥的时间、每次访问Tor时您在哪里以及您当前所在的位置。
在浏览器关闭之前,它不会断开与已建立的网桥连接的连接。一个敌手能准确地看到你所处的桥位和你所切换到的桥位。
如果您的所有网桥都匹配我收集的一组网桥,那么我就确切地知道您使用的是哪个torexit节点以及您使用它的时间范围。虽然你不是独一无二的,但你非常与众不同。这允许我将您的真实IP地址与来自已知Tor出口节点的流量相关联。
您的未列出(或专用)网桥集存储到磁盘。如果您使用的系统从不保存到磁盘,例如Tails,那么您就可以了。只是不要重复使用桥牌。但是如果你在桌面或移动设备上使用Tor浏览器,那么你就足够独特了。
对手将用户置于一个角落:使用具有唯一跟踪属性的Tor,或者不使用Tor(为什么他们不封锁所有未上市的桥梁?也许他们还没有润滑油。或者,追踪和识别内部持不同政见者可能比阻止他们的联系要好。他们可能故意阻止安全和匿名方式连接到Tor网络,以便将您清除。)
从实际的角度来看,Tor用户应该考虑发现和连接性之间的权衡。如果您所处的环境不允许直接连接,也不允许公共网桥,那么使用Tor网络可能不够安全。
这篇博文提到了Tor浏览器的使用,当你在机器上使用带有Tor代理的Bitcoin full node时,情况可能就不一样了。然而,如果你生活在一个有政府定期审查网络的地区,提到的很多事情都很重要。
资料来源:http://hackerfactor.com/blog/index.php?/archives/893-Tor-0day-Tracking-Bridge-Users.html
可以在Windows或Ubuntu中使用Tor browser配置网桥:
Tor浏览器桥
Tails OS和其他一些Linux发行版可能有不同的设置来配置网桥:https://tails.boum.org/doc/first_steps/welcome_screen/bridge_mode/index.en.html
如果您想使用带有torproxy的网桥,则必须在/etc/tor/torrc文件中添加一些内容,并且您可以将更改与torrc文件进行比较
我应该在比特币核心提取请求的描述中包括什么?
我应该在向比特币核心回购(Bitcoin Core repo)开放的拉取请求(pull request,PR)的描述中包括什么,以帮助审阅者快速高效地审阅和测试PR?
比特币核心开发
比特币核心评论
分享
改进这个问题
跟随
昨天编辑的
昨天问
迈克尔·福克森
597277银牌2222铜牌
添加评论
1个答案
1
目前在contribution.md中有一些(有限的)指导。
拉请求的标题应以拉请求影响的组件或区域作为前缀
e、 g.共识:为BIP-XXXX OP\U CHECKAWESOMESIG添加新的操作码
pull请求的主体应该包含对补丁做了什么的充分描述,更重要的是,为什么要这样做,以及理由和推理。您应该包括对任何讨论的引用(例如,其他问题或邮件列表讨论)。
很难准确地解释PR描述中应该包含什么,因为这在很大程度上取决于它是什么类型的pull请求(新请求的描述不应该包含任何@提及。)一个小文档PR只需要一两句话来解释更改和进行更改的理由。在另一个极端,一个共识的改变将需要一个长的,详细的描述,解释历史背景,链接到以前的讨论(例如BIPs,邮件列表),并说服评论者,社区对这个改变有共识。
然而,公关作者应该设法使公关审查尽可能容易。理想情况下,评审人员应该能够从PR描述中了解PR试图做什么以及为什么,而不必探索PR链以获得所需的上下文。另外,关于审阅者应该注意什么的指针(特别是如果有特定的安全考虑)或者关于审阅者如何测试PR的指导也可能被证明是有用的。如果它很容易被审查,那么它更有可能被审查。
fanquake在这个公关评论中提供了一些额外的指导:
PR描述(和commit消息)可能包括:正在更改什么,为什么它等同于以前的检查?什么时候变的?e、 qt5.12并不是我们构建Qt的唯一版本,我们支持的最低版本仍然是5.9.x。如果所构建的Qt版本与此更改无关,为什么会这样?链接到相关的上游变更(如适用)。
您如何验证/评审员应如何验证这是一个无操作?e、 g.“如果这是对配置检查的更改,那么在更改之前和之后生成的二进制文件应该是相同的。你可以用build for compare.py来证明这一点。”
添加更多的信息不仅意味着更多的贡献者可以,或者将更有可能进行审查,而且任何与安全相关的更改都应该比“依赖项头中发生的某些更改”更好地进行总结。
公关作者还应该考虑使公关容易测试新的/经验不足的审查,尤其是如果它不是一个复杂的公关,需要大量的上下文理解。
一个很好的例子,公关的描述,为经验较少的评论家是这一个从乔恩阿塔克。它精确地列出了审阅者需要做什么来验证功能是否如所描述的那样工作,包括审阅者可以运行的确切命令。
欢迎测试和审核!如何测试:
要运行full-live仪表板(在Linux上):$`watch–interval 1
要运行完整的仪表板:$./src/bitcoin cli-netinfo 4
要查看帮助:$./src/bitcoin cli-netinfo help
查看帮助摘要:$./src/bitcoin cli-help | grep-a4netinfo
这里有Jon Atack关于向比特币核心提交拉取请求的额外指导。
分享
改进这个答案
跟随
如何在Windows、Ubuntu和Android上运行Bitcoin核心洋葱服务?
你试过在不同的平台上运行比特币核心监听吗?你有什么经验,你面对的问题,黑客,解决方法等。?
比特币核心
托尔
分享
改进这个问题
跟随
9月8日15:56问
普拉扬克
380711金徽章66银徽章1818铜徽章
添加评论
1个答案
0
窗户
您可以执行第2步和第3步中的一个步骤。第2步使用cookie进行身份验证,第3步使用密码。
下载并安装比特币核心https://bitcoincore.org/bin/bitcoin-core-0.20.1/bitcoin-0.20.1-win64-setup.exe
编辑bitcoin.conf文件,输入以下内容并保存。文件的默认位置是%UserProfile%\AppData\Roaming\Bitcoin\Bitcoin.conf
倾听=1
调试=1
logips=1
测试网=1
列表=1
onlynet=洋葱
代理=127.0.0.1:9150
扭矩控制=127.0.0.1:9151
如何为Tor控件设置cookie验证?
打开C:\Users\Prayank\Desktop\Tor Browser\Browser\TorBrowser\Data\Tor\Torc并添加以下行:
HCookie身份验证1
如果已经执行了步骤2,请忽略此步骤。编辑bitcoin.conf文件,输入以下内容并保存。文件的默认位置是%UserProfile%\AppData\Roaming\Bitcoin\Bitcoin.conf
倾听=1
调试=1
logips=1
测试网=1
列表=1
onlynet=洋葱
代理=127.0.0.1:9150
扭矩控制=127.0.0.1:9151
密码=XYZ
XYZ:用明文密码替换它
如何设置Tor控件的密码?
打开命令提示符/PowerShell并运行以下命令:
cd“C:\Users\Prayank\Desktop\Tor Browser\Browser\TorBrowser\Tor”
tor—哈希密码“XYZ”>torhash.txt
打开torhash.txt文件,复制下面最后一行内容,粘贴到C:\Users\Prayank\Desktop\Tor Browser\Browser\TorBrowser\Data\Tor\torrc并保存:
哈希控制密码16:1CEDITEDOMERANDOMSHITCF8EBCD9A50CLOLCDACF
在命令提示符或PowerShell中运行以下命令,以确保与Tor control的连接正常工作:
telnet 127.0.0.1 9151验证“XYZ”
启动Tor浏览器
使用带有绿色图标的快捷方式启动Bitcoin Core Wallet(Testnet),或在命令提示符或PowerShell中运行“C:\Program Files\Bitcoin\Bitcoin qt.exe”-Testnet并相应更改路径
在控制台窗口中运行getnetworkinfo并检查localaddresses。检查是否创建了testnet3/onion\u私钥文件,并分析debug.log文件中的日志。
比特币核心
乌班图
您可以执行第2步和第3步中的一个步骤。第2步使用cookie进行身份验证,第3步使用密码。
下载比特币核心并运行以下命令:
tar xzf比特币-0.20.0-x86_64-linux-gnu.tar.gz
sudo安装-m 0755-o root-g root-t/usr/local/bin比特币-0.20.0/bin/*
/usr/local/bin/比特币qt
编辑.bitcoin/bitcoin.conf文件,输入以下内容并保存。
倾听=1
调试=1
logips=1
测试网=1
列表=1
onlynet=洋葱
代理=127.0.0.1:9050
如何设置Tor?
sudo apt安装程序
打开/etc/tor/torrc并添加以下行:
控制端口9051
Cookie身份验证1
CookieAuthFileGroup1
重启Tor:sudo/etc/init.d/Tor restart
将用户添加到Tor组:sudo usermod-a-G debian Tor<username>
运行比特币核心:/usr/local/bin/Bitcoin qt
如果已经执行了步骤2,请忽略此步骤。编辑bitcoin.conf文件,输入以下内容并保存。
倾听=1
调试=1
logips=1
测试网=1
列表=1
onlynet=洋葱
代理=127.0.0.1:9150
密码=XYZ
XYZ:用明文密码替换它
如何设置Tor控件的密码?
打开命令终端并运行以下命令:
torpass=$(tor—哈希密码“我的tor密码”)
printf“HashedControlPassword$torpass\n控制端口9051\n”| sudo tee-a/etc/tor/torrc
在控制台窗口中运行getnetworkinfo并检查localaddresses。检查是否创建了testnet3/onion\u私钥文件,并分析debug.log文件中的日志。
调试日志
比特币核心
安卓
下载、安装并运行ABCore或Nayuta Core。
纳尤塔-1纳尤塔-2纳尤塔-3
我在ABCore的设置中选择了比特币结,但是也可以选择使用比特币核。
ABCore-1 ABCore-4 ABCore-3 ABCore-2
分享
改进这个答案
跟随
9月9日9:29编辑
寻找一个小的go/golang片段来连接到比特币核心json-rpc
我以前在C++中做过,现在我正在学习Go/Gangon
我宁愿“从头开始”而不是信任第三方的图书馆
只要从golang调用json-rpc调用getrpcinfo就足够让我动起来了!
到目前为止,我的搜索只找到了整个库和应用程序
json rpc
分享
改进这个问题
跟随
问5月7日9:11
奈杰尔·夏普
2122青铜徽章
添加评论
1个答案
0
啊。。。我自己从多个渠道拿到的东西!
下面是代码片段:
包装总管
导入(
“fmt”
“io/ioutil”
“网络/http”
“字符串”
)
函数main(){
testRequest:=`{“jsonrpc”:“1.0”,“id”:“,”method“:”getrpcinfo“,”params“:[]}`
请求:=http.NewRequest(“POST”,”http://127.0.0.1:8332/“,strings.NewReader(testRequest))
请求设置密码(“,”notmypassword“)
req.Header.Add(“内容类型”,“text/plain;”)
res,e:=http.DefaultClient.Do(请求)
如果e!=无{
格式打印(e)
}其他{
延迟res.Body.Close()
正文:=ioutil.ReadAll(res.body)
fmt.Println(字符串(正文))
}
}
分享
改进这个答案
跟随
比特傻观点:大选择
我们要学会暴跌配置,而不是暴涨加仓……
菜大哥投资日记 副船长 2021-06-03 10:30:20 发布在 区块链社区
19806 0
如果你之前有遗憾没买的币,趁着这轮暴跌没破新高之前,可以配置配置。
比如你有100万资产,主要仓位集中在比特币/以太坊。你觉得BNB不错,之前没买,想配置10万。那么可以趁暴跌,每天定投1万块,定投10天。
同时你又看上了另外一个币,但是这个币比起BNB还是差了点。那理应配置的比BNB少一些。可以趁暴跌配置5万,每天定投1万,定投5天。
在暴跌中配置资产,可以克制冲动,该买多少钱,心里有数。
新高之后是不适合配置资产的,因为币价一旦暴涨,你内心是冲动的。一冲动就容易失去理智,越涨越加仓,倾其所有重仓买入,仓位管理不当酿成大错。
我们要学会暴跌配置,而不是暴涨加仓。
说得好每天一篇文章+一条说说的,今天又超发了,不行,得克制克制。
知道创宇区块链安全实验室|深入理解重入攻击漏洞
创宇区块链安全实验室 水手 2021-06-03 11:09:47 发布在 区块链社区
25227 0
前言
智能合约(英文:Smart contract )的概念于 1995 年由 Nick Szabo 首次提出,它是一种旨在以信息化方式传播、验证或执行合同的计算机协议,它允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。然而智能合约也并非是安全的,其中 重入 (Re-Entrance) 攻击漏洞是以太坊中的攻击方式之一,早在 2016 年就因为 The DAO 事件而造成了以太坊的硬分叉。
漏洞概述
在以太坊中,智能合约能够调用其他外部合约的代码,由于智能合约可以调用外部合约或者发送以太币,这些操作需要合约提交外部的调用,所以这些合约外部的调用就可以被攻击者利用造成攻击劫持,使得被攻击合约在任意位置重新执行,绕过原代码中的限制条件,从而发生重入攻击。重入攻击本质上与编程里的递归调用类似,所以当合约将以太币发送到未知地址时就可能会发生。
简单的来说,发生重入攻击漏洞的条件有 2 个:
- 调用了外部的合约且该合约是不安全的
- 外部合约的函数调用早于状态变量的修改
下面给出一个简单的代码片段示例:
上述代码片段就是最简单的提款操作,接下来会给大家详细分析重入攻击造成的原因。
漏洞分析
在正式的分析重入攻击之前,我们先来介绍几个重点知识。
01 转账方法
由于重入攻击会发送在转账操作时,而 Solidity 中常用的转账方法为
<address>.transfer(),<address>.send() 和 <address>.gas().call.vale()(),下面对这 3 种转账方法进行说明:
- <address>.transfer():只会发送 2300 gas 进行调用,当发送失败时会通过 throw 来进行回滚操作,从而防止了重入攻击。
- <address>.send():只会发送 2300 gas 进行调用,当发送失败时会返回布尔值 false,从而防止了重入攻击。
- <address>.gas().call.vale()():在调用时会发送所有的 gas,当发送失败时会返回布尔值 false,不能有效的防止重入攻击。
02 fallback 函数
接着我们来讲解下 fallback 回退函数。
回退函数 (fallback function):回退函数是每个合约中有且仅有一个没有名字的函数,并且该函数无参数,无返回值,如下所示:
回退函数在以下几种情况中被执行: * 调用合约时没有匹配到任何一个函数; * 没有传数据; * 智能合约收到以太币(为了接受以太币,fallback 函数必被标记为 payable)。
03 漏洞代码
下面的代码就是存在重入攻击的,实现的是一个类似于公共钱包的合约,所有的用户都可以使用 deposit() 存款到 Reentrance 合约中,也可以从 Reentrance 合约中使用 withdraw() 进行提款,当然了所有人也可以使用 balanceof() 查询自己或者其他人在该合约中的余额。
首先使用一个账户 (0x5B38Da6a701c568545dCfcB03FcB875f56beddC4) 扮演受害者,将该合约在 Remix IDE 点击 Deploy 按钮进行部署。
在部署合约成功后在 VALUE 设置框中填写 5,将单位改成 ether,点击 deposit 存入 5 个以太币。
点击 wallet 查看该合约的余额,发现余额为 5 ether,说明我们的存款成功。
而下面的代码则是针对上面存在漏洞的合约进行的攻击:
使用另外一个账户 (0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2) 扮演攻击者,复制存在漏洞的合约地址到 Deploy 的设置框内,点击 Deploy 部署上面的攻击合约。
部署成功后先调用 wallet() 函数查看攻击合约的余额为 0。
攻击者先存款 1 ether 到漏洞合约中,这里设置 VALUE 为 1 ether,之后点击攻击合约的 deposit 进行存款。
再次调用合约的 wallet 函数查看漏洞合约的余额,发现已经变成了 6 ether。
攻击者 (0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2) 调用攻击合约的 attack 函数模拟攻击,之后调用被攻击合约的 wallet 函数去查看合约的余额,发现已经归零,此时回到攻击合约查看余额,发现被攻击合约中的 6 ether 已经全部提款到了攻击者合约中,这就造成了重入攻击。
04源码分析
上面讲解了如何进行重入攻击已经漏洞原因,这里梳理了漏洞源码和攻击的步骤,列出了关键代码。
相关案例
2016 年 6 月 17 日,TheDAO 项目遭到了重入攻击,导致了 300 多万个以太币被从 TheDAO 资产池中分离出来,而攻击者利用 TheDAO 智能合约中的 splitDAO() 函数重复利用自己的 DAO 资产进行重入攻击,不断的从 TheDAO 项目的资产池中将 DAO 资产分离出来并转移到自己的账户中。
下列代码为 splitDAO() 函数中的部分代码,源代码在 TokenCreation.sol 中,它会将代币从 the parent DAO 转移到 the child DAO 中。平衡数组 uint fundsToBeMoved = (balances[msg.sender] * p.splitData[0].splitBalance) / p.splitData[0].totalSupply 决定了要转移的代币数量。
下面的代码则是进行提款奖励操作,每次攻击者调用这项功能时 p.splitData[0] 都是一样的(它是 p 的一个属性,即一个固定的值),并且 p.splitData[0].totalSupply 与 balances[msg.sender] 的值由于函数顺序问题,发生在了转账操作之后,并没有被更新。
paidOut[_account] += reward 更新状态变量放在了问题代码 payOut 函数调用之后。
对_recipient 发出 .call.value 调用,转账_amount 个 Wei,.call.value 调用默认会使用当前剩余的所有 gas。
解决办法
通过上面对重入攻击的分析,我们可以发现重入攻击漏洞的重点在于使用了 fallback 等函数回调自己造成递归调用进行循环转账操作,所以针对重入攻击漏洞的解决办法有以下几种。
01使用其他转账函数
在进行以太币转账发送给外部地址时使用 Solidity 内置的 transfer() 函数,因为 transfer() 转账时只会发送 2300 gas 进行调用,这将不足以调用另一份合约,使用 transfer() 重写原合约的 withdraw() 如下:
02先修改状态变量
这种方式就是确保状态变量的修改要早于转账操作,即 Solidity 官方推荐的检查-生效-交互模式 (checks-effects-interactions)。
03使用互斥锁
互斥锁就是添加一个在代码执行过程中锁定合约的状态变量以防止重入攻击。
04使用 OpenZeppelin 官方库
OpenZeppelin 官方库中有一个专门针对重入攻击的安全合约:
https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/security/ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/** * @dev Contract module that helps prevent reentrant calls to a function. *
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot’s contents, replace the bits taken up by the boolean, and then write // back. This is the compiler’s defense against contract upgrades and // pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction’s gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor () { _status = _NOT_ENTERED; }
/** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, “ReentrancyGuard: reentrant call”);
// Any calls to nonReentrant after this point will fail _status = _ENTERED;
_;
// By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; }}