Solidity Gas Optimizations pt.4 - 효율적인 문자열

이전 레슨에서 우리는 solidty 컴파일러와 EVM이 32바이트 '버킷' 또는 '슬롯'에 데이터를 저장하는 방법에 대해 조금 보았습니다. 이는 스토리지를 다루는 모든 작업에 적용됩니다. 문자열을 다룰 때, 특히 revert() 또는 require() 를 사용할 때 유용할 수 있습니다.

문자열이란 무엇입니까?



Solidity Documentation에서 다음을 볼 수 있습니다.

Variables of type bytes and string are special arrays. The bytes type is similar to bytes1[], but it is packed tightly in calldata and memory. string is equal to bytes but does not allow length or index access.



기본적으로 문자열은 UTF-8 문자의 배열이며 배열은 기본적으로 서로 옆에 위치한 고정 길이 시퀀스의 스토리지 슬롯입니다. 따라서 다른 모든 것과 마찬가지로 스토리지 버킷 측면에서 생각해야 합니다.

이것을 우리에게 유리하게 사용하는 방법



즉, 계약을 컴파일할 때 사용하는 문자열에 대해 단일 슬롯을 사용하는 것을 선호합니다.

문자열의 각 문자는 UTF-8로 인코딩된 바이트입니다. 즉, 단일 스토리지 슬롯에 포함될 이모지와 같이 특별히 인코딩된 문자를 사용하지 않는 경우 문자열 길이가 최대 32자일 수 있습니다.

A Note About UTF-8
UTF encoding is a standard for how computers represent each character in a language. All the standard English characters take up one byte, but things get a bit more difficult when we start with characters like 💩 which takes up 4 bytes (64 bits).
Here's a great resource to look up how many bytes a string takes up under UTF-8 Encoding. https://mothereff.in/byte-counter



따라서 기본적으로 예를 들어 revert 문에서 이것을 모든 곳에서 사용할 수 있을 때 이러한 메시지를 32바이트의 배수에 맞추는 방법을 생각할 수 있습니다.

그래서 이것을 갖는 대신에:

// 40 bytes or two slots
revert(condition, "User has insufficient funds for transfer")


다음을 고려하십시오.

//32 bytes or one slot
revert(condition, "Insufficient funds for transfer.")


다시 말하지만, 때때로 장황하게 말하는 것이 모든 사람이 무슨 일이 일어나고 있는지 아는 데 더 좋으므로 장단점을 고려하십시오. 이는 추가 문자가 함수 호출에 상당한 비용을 추가할 수 있는 경우에 가장 잘 작동합니다.

UTF-8 문자에 대한 추가 정보: https://blog.hubspot.com/website/what-is-utf-8

좋은 웹페이지 즐겨찾기