
머리말
머리말
얼마 전 Etherscan에서 트랜잭션을 확인했을 때 매우 흥미로운 주소인 0x00000000a03396F6F864B496713f2623b6756Be2를 발견했습니다. 이 주소는 0 x 00000000으로 시작합니다. 미지의 세계를 탐험하려는 의도로 주소를 검색했는데 주소가 단순하지 않다는 것을 알았습니다. 독특한 구조를 가지고 있을 뿐만 아니라 가스비도 절약할 수 있습니다.
첫 번째 레벨 제목
가스란?
가스는 이더리움 네트워크의 계산 단위인 이더리움 블록체인에서 특정 작업을 수행하는 데 필요한 계산 노력을 측정하는 데 사용되는 단위입니다. Gas는 이더리움 네트워크의 정상적인 작동을 보장하는 휘발유로 간단히 이해할 수 있습니다. 이더리움 블록체인에서 쓰기 작업을 수행하려면 특정 가스 요금이 필요합니다.
2.1 Gas Price
이더리움에서 통화는 이더(ether), 1이더 = 1 x 10 18 웨이입니다. 토큰 전송, 계약 호출 등과 같은 이더리움 블록체인에서의 작업은 해당 Gas를 지불해야 하며 단위는 Wei로 계산됩니다. Wei는 ETH의 가장 작은 기본 단위이며 ETH가 소비하는 가스 단위는 Gwei, 1 Gwei = 1 x 10 9 Wei입니다.
2.2 Gas Limit
보조 제목
가스 가격은 이더리움에서 가스 1개 소비에 해당하는 Gwei의 양입니다.물론 트랜잭션 발신자는 가스 단위당 가격을 사용자 정의하여 지불할 수 있습니다. 예를 들어 트랜잭션 발신자의 트랜잭션은 10 Gas를 소비해야 하고 트랜잭션 발신자는 3 Wei/Gas를 지불할 의사가 있으며 총 트랜잭션 비용은 30 Wei입니다. 우리가 사용하는 지갑(예: MetaMask)에는 가스 요금을 조정하는 고급 옵션이 있습니다. 가스 가격이 높을수록 패키징 우선 순위가 높아집니다.
Gas Limit은 Gas를 소비하는 제한 단위, 즉 트랜잭션 발신자가 각 트랜잭션을 완료할 때 트랜잭션을 실행하는 데 사용할 수 있는 최대 Gas 양입니다. Gas Limit이 없는 경우 잘못된 연산으로 인해 트랜잭션 발신자의 계정 잔액이 소진될 수 있으며, Gas Limit은 계정의 모든 ETH가 소비되지 않도록 하는 안전 장치입니다.
2.3 고유 비용 가스
트랜잭션 전송 비용은 두 부분으로 구성됩니다.
1. 고유비용
2. 집행비용
실행 비용은 이름에서 알 수 있듯이 실행과 관련이 있으며 트랜잭션을 실행하는 작업이 많을수록 더 많은 EVM 리소스를 사용해야 하고 실행 비용이 높아집니다.
고유 비용은 트랜잭션 부하에 따라 결정됩니다.
1. 스마트 계약을 생성하는 부하는 스마트 계약의 EVM 코드를 생성하는 것입니다.
2. 스마트 컨트랙트 기능 호출 부하는 메시지 실행 시 입력한 데이터
Ethereum Yellow Paper의 부록 G에서 계약 생성 및 트랜잭션 실행과 관련된 가스를 알 수 있습니다.
우리는 $N{zeros}$가 0바이트인 트랜잭션 로드의 총 바이트 수를 나타내고 $N{nonzeros}$가 0바이트가 아닌 트랜잭션 로드의 총 바이트 수를 나타낸다고 가정합니다. 옐로북 6.2 실행설명에 따르면 고유비용을 구할 수 있다.
첫 번째 레벨 제목
이더리움 주소에서 0으로 시작하는 주소
현재 가스비가 상대적으로 비싸기 때문에 가스비를 최적화하는 것이 매우 중요합니다. 우리는 평소보다 0바이트가 더 많은 주소(즉, 해밍 가중치)를 사용하고 경우에 따라 시작 부분에 0바이트가 더 많은 주소를 사용하여 많은 유형의 트랜잭션에서 가스를 절약할 수 있습니다.
해밍 가중치는 일련의 기호에서 0이 아닌 기호의 수입니다. 모두 0인 기호의 해밍 가중치는 0이고 1101의 해밍 가중치는 3입니다.
Ethereum Yellow Paper의 부록 G에서 볼 수 있듯이 0바이트를 사용하는 경우 4 Gas가 필요하고 0이 아닌 바이트를 사용하는 경우 16 Gas가 필요합니다.
0이 아닌 바이트 대신 0바이트를 사용할 때마다 16 Gas를 절약하므로 msg.data에서 0이 아닌 바이트를 0 바이트로 교체할 때마다 12 Gas를 절약할 수 있습니다. 이더리움에서 주소는 바이트 문자열을 16진수 형식으로 볼 때 0 x로 시작하는 40개의 임의 문자로 구성된 16진수 문자열(20바이트)입니다. = 2 8 = 256비트) 따라서 단일 16진수 0 또는 두 개의 서로 다른 바이트에 인접한 0은 단어 문자열의 해밍 가중치를 줄이지 않으므로 두 개의 연속 16진수 0만 해밍 가중치를 줄입니다. 0바이트의 순서도 결과적인 가스 최적화에 영향을 미치지 않습니다(예: 주소 0x00a0009e638D25EFE5a894f6a36F42734477dECa에는 2 0바이트가 있음).\,ERC 20 transfer() 함수에서 msg.sender의 해밍 가중치에는 차이가 없지만 transfer() 함수의 일부로 msg.data에 전달되는 _to address 매개 변수에는 차이가 없습니다.\times 12 = 48 \,OpenZeppelin의 StandardToken을 참조 예제로 사용하십시오. 0바이트가 없는 주소(예: 0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2)로의 표준 전송 비용은 35039 Gas인 반면 4 0바이트가 있는 주소로의 전송(예: 0x00000000b011402777E34EFf44905BE85e3CdD01) 즉, 주소에 0이 4쌍 있음) 34991만 전송 가스, $35039 - 34991 = 48의 차이가 있습니다.
가스$. 그리고 이전에 우리는 0이 아닌 바이트 대신 0바이트를 사용할 때마다 12 Gas를 절약할 수 있다고 말했습니다(그리고 이전 버전의 Ethereum에서는 최대 64 Gas까지 절약할 수 있습니다). 여기서 48 Gas는 $로 표현할 수 있습니다. 4
Gas$, 노란색 종이에서 예상한 대로.
두 개의 0바이트 주소 0x00a0009e638D25EFE5a894f6a36F42734477dECa와 위의 두 값의 차이는 각각 24 Gas로 역시 기대에 부합함을 보여준다.
하지만 주소 끝에 0바이트가 있으면 짧은 주소의 공격을 받기 쉽기 때문에 0 x 00으로 시작하는 여러 개의 0바이트 주소가 더 나은 선택이 됩니다. 주소에 최소 4개의 선행 0바이트(즉, 16진수 인코딩 형식의 선행 0 8개)가 있는 경우 각 주소는 16바이트만 차지하면 2개의 주소가 최대 32바이트 패킷에 맞을 수 있습니다. 이러한 종류의 최적화는 $G_{txdatazero}$에 의해 가져온 Gas 최적화 때문일 뿐만 아니라 호출 데이터에서 더 많은 바이트를 읽고 쓸 필요가 없기 때문에 더 많은 Gas를 절약할 수 있으므로 이러한 주소 는 주소가 계약 주소인지 일반 계좌 주소인지에 관계없이 약 5%의 비용을 절약할 수 있습니다.
분산형 거래소 애그리게이터 1inch.exchange가 개발한 CHI GasToken은 이러한 원칙을 채택하고 있으며 많은 일반 계정 주소는 선행 0을 자신의 주소로 사용합니다.
선행 0으로 시작하는 더 많은 주소를 얻는 방법은 여러분이 본 이더리움 베니티 넘버의 생성과 동일하며 여기서는 생성 방법을 제공하지 않습니다. 허점). 물론 얻고자 하는 시작 0이 많을수록 더 어렵고 더 오래 걸립니다.
주소에서 0 0 바이트를 찾을 확률은 92.47%입니다.
0바이트를 찾을 확률은 7.25%입니다.
0.00000106%의 확률로 4 0 바이트를 찾을 수 있습니다.
추신
Gas를 최적화하는 방법에는 여러 가지가 있습니다. 여기서는 EVM의 최하위 계층의 관점에서 Gas를 절약하는 방법을 연구합니다. 연구를 통해 결론을 얻을 수 있습니다. 이더리움 주소에 00이 많을수록(여기서는 0은 쌍으로 나타나며, 4)에서 언급한 이유는 주소가 계약주소인지 정상주소인지, 입출금주소인지 입출금주소인지에 상관없이 많은 Gas가 저장할 수 있습니다.