非法操作和处罚

从智能合约编译的非法操作/无效操作代码不仅无法部署/执行,还会产生 fee_limit 的全额罚款。 由于用户通常将费用限制设置为10000 TRX(上限),所以这是一个力度很大的惩罚;如果用户尝试自动重试操作,则付出的代价会更高。

触发无效操作代码有两种常见形式:

  1. 用户手动尝试将任意无效的操作代码插入智能合约字节码。
  2. 用户在新操作代码被支持之前使用较新的编译器。 特别是之前的一个例子,在“TRC-10代币在智能合约中进行转账”这个功能被支持以前 (https://tronscan.org/#/proposal/15),如果用户恰好在使用心得编译器来部署/执行智能合约,fee_limit 的全额罚款就会从用户账户中被扣除。
pragma solidity ^0.4.24;

contract transferTokenContract {
    constructor() payable public{}
  
    function() payable public{}
  
    function transferTokenTest(address toAddress, uint256 tokenValue, trcToken id) payable public {
        require(id > 1000000);
        toAddress.transferToken(tokenValue, id);
    }
  
    function msgTokenValueAndTokenIdTest() public payable returns (trcToken, uint256) {
        trcToken id = msg.tokenid;
        uint256 value = msg.tokenvalue;
        return (id, value);
    }
  
    function getTokenBalanceTest(address accountAddress) payable public returns (uint256) {
        trcToken id = 1000001;
        require(id > 1000000);
        return accountAddress.tokenBalance(id);
    }
}

在上面的例子中, transferToken 映射到操作码 0xd0 tokenBalance 映射到操作码 0xd1 msg.tokenid 映射到操作码 0xd2 msg.tokenvalue 映射到操作码 0xd3 。 如果在网络激活新的TRC-10转移提议之前用户使用了其中任何一项功能,TVM将拒绝此操作并惩罚整个 fee_limit

常规操作是是始终使用最新的Tron-Web / Tron-Box来编译/部署/执行合同。 当用户在测试网和主网之间切换时,务必重新编译所有合同,以防不同网络参数定义了不同的有效操作代码集。