避免向不存在的账户转账
不存在的账户转账和处罚
除了非法操作外,将 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 罚款。
Updated almost 4 years ago