일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- 러스트 기초
- SBT표준
- 스마트컨트렉트프록시
- 러스트기초
- ambiguous function description
- nest.js설명
- 프록시배포구조
- 스마트 컨트렉트 함수이름 중복
- 오블완
- Vue.js
- ethers
- vue기초
- 티스토리챌린지
- Vue
- 스마트컨트렉트테스트
- ethers websocket
- 체인의정석
- 스마트컨트렉트 함수이름 중복 호출
- ethers typescript
- multicall
- chainlink 설명
- 머신러닝기초
- ethers type
- ethers v6
- rust 기초
- 스마트컨트렉트 예약어 함수이름 중복
- 러스트 기초 학습
- 컨트렉트 동일한 함수이름 호출
- 컨트렉트 배포 자동화
- git rebase
Archives
- Today
- Total
체인의정석
Solidity 내부에서의 string과 bytes의 형변환 시 나는 오류 본문
728x90
반응형
요청에 따라 컨트렉트를 작성하고 있었는데, 컨트렉트 내부에서 byte타입을 string으로 변환하려면 바로 형변환이 안되고 오류가 났었다.
string만 받는 기본 ERC721의 tokenURI에 bytes를 넣고 함수내부적으로도 가져와서 사용해야 하는 상황이다.
이런 경우에는 형변환을 추가적으로 해주어야 하는데 아래 함수를 쓰면 된다. 이건 stack overflow에서 가져왔다.
https://ethereum.stackexchange.com/questions/126899/convert-bytes-to-hexadecimal-string-in-solidity
function iToHex(bytes memory buffer) internal pure returns (string memory) {
// Fixed buffer size for hexadecimal convertion
bytes memory converted = new bytes(buffer.length * 2);
bytes memory _base = "0123456789abcdef";
for (uint256 i = 0; i < buffer.length; i++) {
converted[i * 2] = _base[uint8(buffer[i]) / _base.length];
converted[i * 2 + 1] = _base[uint8(buffer[i]) % _base.length];
}
return string(abi.encodePacked("0x", converted));
}
반면 반대로 bytes를 string으로 하는것도 요구사항에 필요해서 이건 따로 매핑을 내부적으로 만들어서 해결했다.
정석은 원래 오프체인에서 인풋값으로 bytes형태를 넣어주는게 맞지만 때에 따라선 이런것을 특정 표준이나 기존 코드에 맞추어서 내부적으로 해주어야 하기에 이런 방법을 쓸 수 있다.
728x90
반응형
'블록체인 > Solidity' 카테고리의 다른 글
Ethers Estimate Gas & Error: execution reverted (unknown custom error) (0) | 2024.11.14 |
---|---|
Maker DAO Multicall , Multicall 설명 (0) | 2024.09.12 |
Solidity 컨트렉트에서 서명 검증하기 (4) | 2024.08.21 |
Tally와 호환되는 DAO 컨트렉트 (timelock & erc20) 구현하기 (0) | 2024.08.09 |
다양한 체인에 동일한 주소로 배포가 가능한 Create3 자세히 살펴보기 (1) | 2024.07.02 |
Comments