避免向不存在的账户转账

不存在的账户转账和处罚

除了非法操作外,将 VS / VRC10转移到不存在的账户也会导致 fee_limit的全额罚款 。 用户通常将费用限制设置为1000 VS(上限),因此这是一个重量级的惩罚,如果用户尝试自动重试操作,则成本更高。

被处罚的合同示例

将VS转移到不存在/无效的帐户

pragma solidity ^0.4.23;

contract Invalid {

  function transAddr() public payable {
    address invalid = 0x1234abcd;
    invalid.transfer(10 vs);
  }
  
  function transAddr2(address addr) public payable {
    addr.transfer(10 vs);
  }
}

在上面的例子中, transAddr 总是失败并消耗 fee_limit 。 在较常见的 transAddr2 情况中 ,开发人员应确保 addr 在VisionWeb或其他一些现有地址中预先验证。 否则, 用户将支付 fee_limit 罚款。

将VS转给自己

pragma solidity ^0.4.23;

contract Self {

  function transAddr() public payable {
    address(this).transfer(10 vs);
  }

  function transAddr2(address addr) public payable {
    addr.transfer(10 vs);
  }

  function transAddr3(address addr) public payable {
    require(addr != address(this));
    addr.transfer(10 vs);
  }
}

同样, transAddr 总是会受到 fee_limit 的惩罚。 如果 addr 是合同地址本身, transAddr2 将无法自我转账。 transAddr3 防止自我转移惩罚,但仍然面临上述不存在的帐户问题。

将VRC10代币转移到不存在/无效的帐户

pragma solidity ^0.4.24;

contract VRC10 {

  function sendBalance(address to) public payable {
    vrcToken id = msg.tokenid;
    uint256 value = msg.tokenvalue;
    to.transferToken(value, id);
  }

  function sendBalance2() public payable {
    vrcToken id = msg.tokenid;
    uint256 value = msg.tokenvalue;
    address(this).transferToken(value, id);
  }
}

与上面的VS转移类似,如果转账到不存在的账户, sendBalance 必定失败,受到 fee_limit罚款。 自我转账的案例 sendBalance2 也会导致 fee_limit 罚款。