체인의정석

Warning: Return value of low-level calls not used 본문

블록체인/Solidity

Warning: Return value of low-level calls not used

체인의정석 2022. 7. 6. 17:29
728x90
반응형

일단 call 과 delegate call의 경우 관리자가 다른 컨트렉트를 통해서

원래 관리자 함수가 있는 컨트렉트에서 관리자 함수를 호출 할 때 사용할 필요가 있었다.

https://eun97.tistory.com/entry/Solidity-call-delegateCall

 

[Solidity] call, delegateCall

모든 call들은 특정 주소의 다른 컨트랙트를 데이터, 가스, 이더와 함께 특정 함수를 호출합니다. 어떤 호출이냐에 따라 msg.sender나 변동 storage가 바뀌므로 기본 방식을 이해하고 사용하심이 바

eun97.tistory.com

먼저 call을 쓸 때 "Warning: Return value of low-level calls not used" 경고 문구가 나왔는데, 

call을 사용하면 return 값을 가져와서 체크를 해주어야 안전하기 때문에 이러한 메세지가 나타난다.

 

이를 위해서는 호출하는 컨트렉트의 함수의 리턴값이 있어야 한다.

만약 call을 사용하려면 불리는 함수를 이를 염두하여 return을 정의한 형태로 미리 만들어 두어야한다.

 

위 블로그 예시가 매우 잘 나와 있어서 이걸 보고 체크를 하였는데

ERC20.sol (open-zeppelin)

function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
	_transfer(sender, recipient, amount);
	_approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount));
	return true;
}
...
 

MyContract.sol

(bool check, bytes memory data) = address(0xd26114cd6EE289AccF82350c8d8487fedB8A0C07).call(abi.encodeWithSignature("transferFrom(address,address,uint256)",0x4E9ce36E442e55EcD9025B9a6E0D88485d628A67,0xaA6C6E60D77674AD15aF8cbD9a9c406D5c83d8ca,100000 ether));

(bool returnBool) = abi.decode(data, (bool))

다음과 같이 실행하면 된다. 

 

나의 경우는 return 하는 값이 uint256이였기 때문에

    (bool check, bytes memory data) = address(컨트렉트주소).call(abi.encodeWithSignature("function 함수이름(변수1, 변수2, 변수3)));
    require(check == true, "컨트렉트이름: 오류메세지");
    (uint256 number) = abi.decode(data, (uint256));
    return number;

위와 같이 체크하는 과정을 추가하였다.

728x90
반응형
Comments