두 가지 기본 계약이 있습니다. 하나는 토큰 용이고 다른 하나는 판매 용입니다.다른 계약 내에서 계약 인스턴스를 작성하고 그 메소드를 호출하면 예외가 발생합니다.
토큰 с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);
내가 이것에 대한 정확한 이유를 볼 수 없습니다 : 디버깅 할 때 내가 볼 수있는 모든 것은 그 코드 라인에 지불 방법에 실패 내부.
재미있는 점은 판매 계약 생성자의 토큰 인스턴스에서 전송 메소드에 대한 호출을 제거 할 때 코드가 예외없이 잘 실행되는 것입니다.
무엇이 누락 되었습니까?