1

我有两个基本合同:一个是代币,第二个是出售。

代币合约

contract MyToken is StandardToken, Ownable {

    string public constant name = "My Sample Token";

    string public constant symbol = "MST";

    uint32 public constant decimals = 18;

    function MyToken(uint _totalSupply) {
       require (_totalSupply > 0);
       totalSupply = _totalSupply;
       balances[msg.sender] = totalSupply;
    }
}

销售合同

contract Sale {
    address owner;

    address public founderAddress;
    uint256 public constant foundersAmount = 50;

    MyToken public token = new MyToken(1000);


    uint256 public issuedTokensAmount = 0;

    function Sale() {
        owner = msg.sender;
        founderAddress = 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c;
        token.transfer(founderAddress, foundersAmount);
    }

    function() external payable {
        token.transfer(msg.sender, 1);
        owner.transfer(msg.value);
    }   
}

StandardTokenOwnable都是来自 OpenZeppelin 存储库的标准实现。完整的合同来源可在此处获得。

所以基本上在我的销售合同中,我创建了一个具有固定供应量的代币合同实例,并将所有代币分配给调用者。然后我将一些代币转移到创始人地址。当我尝试向销售合约发送一些以太坊时,我试图将我的一些代币转移给发送者(在 Remix 浏览器中运行所有代码,我创建了一个销售合约实例并调用“回退”方法指定一些以太币数量)。但是,这会失败并显示“执行期间出现异常。(操作码无效)。请调试事务以获取更多信息。” 信息。调试时我所能看到的只是代码在支付方法中失败:

 token.transfer(msg.sender, 1);

我看不到确切的原因,因为我无法进入此方法并查看内部发生的情况。

有趣的是,当我在销售合同构造函数中删除对令牌实例的传输方法的调用时 - 代码似乎运行良好,没有任何异常。

我错过了什么?

4

2 回答 2

0

这背后的原因是您正在使用后备功能。尝试使用正常功能,它应该会发生。

于 2021-03-11T18:48:34.470 回答
0

我使用 remix 调试到合同中,无效的操作码由以下人员抛出:

290 DUP8
291 DUP1
292 EXTCODESIZE
293 ISZERO
294 ISZERO
295 PUSH2 012f
298 JUMPI
299 PUSH1 00
301 DUP1
302 INVALID

我忽略了其余部分,但本质上它加载了代币合约的地址并调用 EXTCODESIZE 检索合约代码大小,并检查它是否不等于 0(代币合约存在),不幸的是,它确实等于 0。在这一点上,我不确定这是否是混音的限制,或者我误解了设置。

我在 truffle + testrpc 上尝试了相同的合约设置,并成功部署并接受了货币。但是请注意 testrpc 表示:

Gas usage: 59137

这意味着这高于默认的 sendTransaction w/无数据默认值(21,000 gas)。这意味着在实时环境中,请确保通知用户包含额外的气体,否则后备功能可能会由于 OOG 错误而失败。

于 2017-09-08T20:09:21.220 回答