2017-09-06 8 views
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 및 소유 가능한는 OpenZeppelin 저장소에서 모든 표준 구현입니다. 전체 계약 소스는 here입니다.

기본적으로 내 판매 계약에서는 고정 공급 장치를 사용하여 토큰 계약의 인스턴스를 만들고 모든 토큰을 호출자에게 지정합니다. 그런 다음 창업자 주소로 일부 금액을 이전합니다. 판매 계약에 ethereum을 보내려고하면 일부 토큰을 보낸 사람에게 전송하려고 시도합니다. Remix 브라우저에서 모든 코드를 실행하면 판매 계약의 인스턴스를 만들고 일부 에테르 금액을 지정하는 "대체"메소드를 호출합니다. 그러나 "실행 중 예외 (잘못된 opcode)"와 함께 실패합니다. 자세한 내용은 트랜잭션을 디버그하십시오. " 메시지. 세드릭 나는이 방법으로 단계로 볼 수 아니에요으로

token.transfer(msg.sender, 1); 

내가 이것에 대한 정확한 이유를 볼 수 없습니다 : 디버깅 할 때 내가 볼 수있는 모든 것은 그 코드 라인에 지불 방법에 실패 내부.

재미있는 점은 판매 계약 생성자의 토큰 인스턴스에서 전송 메소드에 대한 호출을 제거 할 때 코드가 예외없이 잘 실행되는 것입니다.

무엇이 누락 되었습니까?

답변

0

나는 리믹스를 사용하여 계약에 디버깅 및 잘못된 연산 코드에 의해 발생합니다 :

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 

를이 데이터가없는 기본 (21,000 가스)/w 기본 sendTransaction 위에 있다는 의미. 즉, 실제 환경에서 여분의 가스를 포함하도록 사용자에게 알리십시오. 그렇지 않으면 OOG 오류로 인해 대체 기능이 실패 할 수 있습니다.