ethernaut 小问题汇总

发布时间:2022-06-29 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了ethernaut 小问题汇总脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

Ethernaut题库链接

https://ethernaut.openzeppelin.com/

参考答案链接

https://blog.riskivy.com/

https://hitcxy.com/2019/ethernaut/

https://ainevsia.github.io/2021/02/21/Ethernaut/#more

receive()与fallback()

  • receive() 一个合约只能有一个receive函数,该函数不能有参数和返回值,需设置为external,payable;当本合约收到ether但并未被调用任何函数,未接受任何数据,receive函数被触发;

  • fallback() 一个合约只能有一个receive函数,该函数不能有参数和返回值,需设置为external;可设置为payable;当本合约的其他函数不匹配调用,或调用者未提供任何信息,且没有receive函数,fallback函数被触发;

原文链接:https://blog.csdn.net/hahadesu/article/details/117913695

transfer()

	Account.transfer(msg.value);

合约发起方向Account地址转入msg.value个以太币

	owner.transfer(address(this).balance)

this代表的是合约地址;msg.sender是调用合约的账户地址;

所以代表,合约里的钱转入合约的拥有者账户。

Require(), Assert(), Revert()的用法和区别

  • revert

  revert的用法和throw很像,也会撤回所有的状态转变。但是它有两点不同

  1.它允许你返回一个值;

  2.它会把所有剩下的gas退回给caller

  调用起来就像这样子:

  revert(‘Something bad happened’);

  require(condition, ‘Something bad happened’);

  • require
  1. 验证一个用户的输入是否合法:require(input<20);
  2. 验证一个外部协议的响应:require(external.send(amount));
  3. 判断执行一段语句的前置条件,验证合约执行前的状态: require(block.number > SOME_BLOCK_NUMBER) or require(balance[msg.sender]>=amount);
  4. require应该被最常使用到;一般用于函数的开头处
  • assert
  1. 检查有没有上溢overflow或者是下溢underflow: ie. c = a+b; assert(c > b)
  2. 检查常数非变量(invariants):assert(this.balance >= totalSupply); 在完成变化后检查状态,避免本不应该发生的情况出现,如程序的bug; assert不应该被经常利用到,一般用于函数结尾处
  3. 验证改变后的状态;预防不应该发生的条件。

基本上,require() 应该被用于函数中检查条件,assert() 用于预防不应该发生的情况,但不应该使条件错误。另外,除非认为之前的检查(用 require )会导致无法验证 overflow,否则不应该盲目使用 assert来检查 overflow

delegatecall()

两种底层调用方式 calldelegatecall的区别

  • call: 最常用的调用方式,调用后内置变量 msg 的值会修改为调用者,执行环境为被调用者的运行环境

  • delegatecall: 调用后内置变量 msg 的值不会修改为调用者,但执行环境为调用者的运行环境

简而言之,区别仅在于后者仅使用给定地址的代码,其它信息则使用当前合约(如存储,余额等等)。

selfdestruct

析构函数和构造函数对应,构造函数是初始化数据,而析构函数是销毁数据。

selfdestruct(address recipient):destroy the current contract, sending its funds to the given Address

transferFrom()和approve()

function approve(address _spender, uint _value) returns (bool success)

​ 此函数的调用方授权给定的地址可以从其地址中提款。

function transferFrom(address _from, address _to, uint _value) returns (bool success)

​ 该函数允许智能合约自动执行转账流程并代表所有者发送给定数量的通证。例如:你可以与银行签订自 动代支付协议。 这就像使用transferFrom() :银行的机器会自动以你的名义进行转账支持。 有了这个函数, 合约就可以代表你自动发送通证到另一个地址,而无需你的干预。

脚本宝典总结

以上是脚本宝典为你收集整理的ethernaut 小问题汇总全部内容,希望文章能够帮你解决ethernaut 小问题汇总所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: