일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- ethers v6
- rust 기초
- 스마트컨트렉트 함수이름 중복 호출
- 컨트렉트 동일한 함수이름 호출
- 스마트컨트렉트프록시
- 러스트 기초 학습
- git rebase
- SBT표준
- 스마트컨트렉트테스트
- nestjs 튜토리얼
- ethers type
- 체인의정석
- vue기초
- Vue
- 러스트기초
- multicall
- ethers typescript
- 컨트렉트 배포 자동화
- 깃허브명령어
- 러스트 기초
- 프록시배포구조
- nest.js설명
- ethers
- Vue.js
- 스마트 컨트렉트 함수이름 중복
- 스마트컨트렉트 예약어 함수이름 중복
- 머신러닝기초
- chainlink 설명
- ethers websocket
- ambiguous function description
Archives
- Today
- Total
체인의정석
Warning: Return value of low-level calls not used 본문
728x90
반응형
일단 call 과 delegate call의 경우 관리자가 다른 컨트렉트를 통해서
원래 관리자 함수가 있는 컨트렉트에서 관리자 함수를 호출 할 때 사용할 필요가 있었다.
https://eun97.tistory.com/entry/Solidity-call-delegateCall
먼저 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
반응형
'블록체인 > Solidity' 카테고리의 다른 글
DelegateCall에서 값을 가져오는 케이스 (0) | 2022.07.08 |
---|---|
하나의 컨트렉트를 여러개로 분리해서 만들 때의 주의 사항 (0) | 2022.07.07 |
Solidity constants vs immutable 차이 (0) | 2022.07.06 |
Solidity 코드 분리하기 , 분리하며 나오는 Contract should be marked as abstract 에러 해결 (0) | 2022.07.06 |
이더리움에서 데이터 서명관련 EIP 정리 (EIP1271 & EIP2098) (0) | 2022.06.27 |
Comments