// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
contract Telephone {
address public owner;
constructor() public {
owner = msg.sender;
}
function changeOwner(address _owner) public {
if (tx.origin != msg.sender) {
owner = _owner;
}
}
}
Claim ownership of the contract below to complete this level.
Things that might help
See the Help page above, section "Beyond the console"
ownership 가져오기
tx.origin
은 msg.sender
와 비슷한 의미를 가진다. 하지만 위 설명처럼 연쇠적으로 호출할 때 가장 처음에 호출한 계정을 의미한다. 따라서 tx.orgin
은 컨트랙트 계정이 될 수 없다.
ownership을 가져오려면 tx.origin
과 msg.sender
값이 달라야 한다. 그럼 외부 컨트랙트에서 changeOwner()
함수를 호출하면 되지 않을까?
예를 들어 Calling
컨트랙트를 만들어서 changeOwner()
함수를 호출한다고 했을 때, 컨트랙트를 만들고 호출한 내 메타마스크 계정이 tx.origin
이 되고 Calling
컨트랙트가 자체적으로 changeOwner()
함수를 호출하니까 msg.sender
가 되서 결국 ownership이 넘어오지 않을까 하는 생각이다.
컨트랙트는 간단하다. 그냥 changeOwner()
함수만 호출했다.
ownership 가져오기 성공! 이번 예제의 교훈은 tx.origin
으로 권한설정하지 말 것.