2017-09-06 3 views
1

2つの基本契約があります.1つはトークン用で、もう1つは販売用です。別の契約の中で契約のインスタンスを作成し、そのメソッドを呼び出すと例外がスローされます

トークンсontract

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); 
    } 
} 

StandardTokenとOwnableはOpenZeppelinリポジトリからすべての標準実装があります。完全契約ソースはhereです。

基本的に私の販売契約では、私は固定供給でトークン契約のインスタンスを作成し、すべてのトークンを呼び出し元に割り当てます。その後、ある程度の量のトークンを創始者の住所に移します。販売契約にいくつかのethereumを送信しようとすると、私はいくつかのトークンを送付者に転送しようとしています(Remixブラウザですべてのコードを実行すると、販売契約のインスタンスを作成し、エーテル量を指定する "フォールバック"メソッドを呼び出します)。ただし、これは「実行中の例外(無効なオペコード)」で失敗します。詳細については、トランザクションをデバッグしてください。メッセージ。

token.transfer(msg.sender, 1); 

私は、このメソッドにステップして起こっていただきました!見ることはできませんよと、私はこの正確な理由を見ることができない:私はデバッグがそのコードが行に支払われる方法で失敗したときに見ることができるすべての内部。

面白いのは、販売契約コンストラクタのトークンインスタンスで転送メソッドへの呼び出しを削除すると、コードが例外なく正常に実行されているようです。

私には何が欠けていますか?

答えて

0

私がリミックスを使用して契約をデバッグ、および無効なオペコードがでスローされます。私は残りの部分を残しますが、基本的にそれはトークン契約のアドレスをロードし、取得したEXTCODESIZEを呼び出し

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

コードサイズを契約し、それが0(トークンコントラクトが存在する)でないことをチェックします。残念ながら、それは0と同じでした。この時点では、これがリミックスの制限であるかどうかは不明です。

私はtruffle + testrpcで同じ契約セットアップを試してみて、それを展開し、通貨を正常に受け入れました。注意してくださいしかし、そのtestrpcが示された:

Gas usage: 59137 

を、これはデータなしのデフォルト(21000のガス)/ wのデフォルトsendTransactionの上にあることを意味します。つまり、実際の環境では、余分なガスを含めるようにユーザーに通知する必要があります。そうしないと、OOGエラーのためにフォールバック機能が失敗する可能性があります。

関連する問題