체인의정석

Solidity 0.5.0 버젼 오류해결 ) Invalid implicit conversion from uint256 to bytes memory requested 본문

블록체인/Solidity

Solidity 0.5.0 버젼 오류해결 ) Invalid implicit conversion from uint256 to bytes memory requested

체인의정석 2022. 1. 25. 17:46
728x90
반응형
  • memory (whose lifetime is limited to a function call)
  • storage (the location where the state variables are stored)
  • calldata (special data location that contains the function arguments, only available for external function call parameters).

https://ethereum.stackexchange.com/questions/63247/calldata-keyword-as-parameter-in-solidity-v0-5-0-function

 

calldata keyword as parameter in solidity v0.5.0 function?

What purpose does the "calldata" serve in this parameter _owners? Is it a new keyword? function setup(address[] calldata _owners, uint256 _threshold, address to, bytes calldata data) Taken from

ethereum.stackexchange.com

먼저 0.5 버전에서의 저장공간은 3개로 구분된다.

메모리 : 콜에서만 쓰이는 부분이다.

스토리지 : 상태변화를 일으키는 부분이다.

콜데이터: 외부 함수 호출을 부르는 파라미터에서 쓰는 데이터이다. 

 

즉 외부 함수 호출, external을 사용할때는 memory대신에 자료를 calldata에 저장해야한다.

0.5.0 버전에 대한 문서를 보고 서칭한 결과 

implicit conversion 지정해 두지 않고 자료형을 암묵적으로 변형하는 행위는 업데이트가 되면서 허용되지 않고 있다.

 

따라서 

      uint256 value = abi.decode(bytes(inputData),(uint256));

다음과 같이 인코딩 된 데이터를 디코딩 할때 bytes를 inputData안에 넣어서 외부에서 받아온 calldata에 있는 inputData를 명시적으로 형태를 한번 더 지정해 주어야한다. 지정해주지 않을 시 0.5.0 버전에서는 자동 형변환 명령어가 들어가서 오류가 나는것 같다.

 

https://ethereum.stackexchange.com/questions/69288/abi-encode-decode-using-strings-instead-of-bytes

 

Abi encode / decode using strings instead of bytes

For some reason beyond my control, I need to store encoded data in a string variable. I know abi.encode and abi.decode usually work on bytes memory but I also believe that string memory can be cas...

ethereum.stackexchange.com

이는 아래의 예시 코드를 보고 하였으며, 추후 테스트코드 작성시에 제대로 작동되는지 테스트 하는 과정이 필요할 것으로 보인다.

 

또한 byte, byte32 두가지 타입이 주로 쓰이므로 이에 맞추어서 형태를 명시해주어야 오류가 나지 않는다.

 

728x90
반응형
Comments