이더리움 가스 요금의 2가지 키와 21개의 EIP
이 글은 백계획에 게시되었으며, 저자: Li입니다.
Gas 비용 문제는 현재 이더리움 1.0 체인이 직면한 가장 심각한 문제 중 하나입니다. 이더리움의 해시 파워는 많지만, 블록체인의 구조적 문제(각 풀 노드가 동일한 데이터를 계산하므로 작업이 단일 노드의 계산 자원을 놓고 경쟁하게 됨)로 인해 이더리움은 대량의 작업을 처리할 때 혼잡해지고, 혼잡해지면 Gas 비용이 매우 높아집니다.
DeFi 애플리케이션의 폭발적인 성장은 이러한 현상을 더욱 악화시켰습니다. 여기서 언급할 점은 이더리움이 블록체인 거래를 패키징하는 것 외에도 스마트 계약 등도 체인에 배포된다는 것입니다. 따라서 스마트 계약이 체인에서 실행될 때 자원을 소모하게 되며, DeFi에서 사용자가 수행하는 거의 모든 단계는 Gas 비용을 지불해야 합니다. 이것이 Gas 모델의 문제 중 하나입니다.
최근 이더리움 커뮤니티는 EIP-1559에 대한 논의가 더욱 격렬해졌습니다. 많은 채굴 풀들이 이 제안의 배포에 동의하지 않기 때문입니다. 이 제안은 Gas 비용의 구성을 조정하며, Gas 비용이 높다는 문제를 해결할 수는 없지만, Gas 비용에 대한 기대를 높이고 경험을 개선할 수 있습니다.
또한 최근 관련 소식으로, 3월 16일 이더리움 개발자 Philippe Castonguay가 또 다른 제안 EIP-3382를 제안했습니다. 이 제안은 블록 Gas 제한을 블록당 12,500,000 Gas로 고정할 것을 제안하며, Gas 제한이 12,500,000이 아닐 경우 블록이 무효가 되는 블록 검증 규칙을 업데이트합니다. 이는 블록 Gas 제한에 대한 합의를 이루고, 채굴자의 제약을 받지 않기 위함입니다.
원래의 규칙에서 블록 Gas 제한은 이더리움에서 유일하게 노드의 일관성에 의해 결정되지 않는 데이터 부분으로, 채굴자가 선택하는 매개변수입니다. 그는 이것이 중요한 매개변수이며, 소수의 참여자가 네트워크의 나머지 부분에 갑작스럽고 해로운 변화를 가하는 것을 피하기 위해 노드의 일관성이 필요하다고 생각합니다.
EIP1559, EIP-3382와 같이 Gas 비용을 조정하는 제안이 많습니다. Gas 비용은 이더리움 운영 과정에서 중요한 위치를 차지하므로, Gas 비용에 대한 많은 역사적 이야기가 있습니다. Gas 비용에 대한 모든 정보를 살펴보면, Gas 비용 문제를 해결하는 것이 결코 쉬운 일이 아님을 알 수 있습니다.
오늘 백계획 팀은 독자들에게 이더리움의 Gas 비용 관련 자료를 대략적으로 언급할 것입니다. 여기에는 설계 변경, EIP 수정 등이 포함됩니다. 유용하게 사용하시길 바랍니다.
Gas 비용을 이해하고 싶다면, TXStreet의 동적 이미지를 통해 쉽게 이해할 수 있습니다.
TXStreet는 이더리움 블록 패키징 과정을 교통 운송으로 시각화합니다.
블록 패키징을 자동차 승객 운송 과정으로 추상화하면, 도로 폭과 자동차 용량의 제한으로 인해 자동차에 탑승하는 과정에서 경쟁이 발생하게 됩니다. 이는 가격이 높은 쪽이 우선하는 것으로 이해할 수 있으며, 평균 비용도 혼잡으로 인해 "부풀려질" 수 있습니다.
자동차가 주행하는 도로는 기본 자원으로, "통행료"를 지불해야 하며, 패키징에 필요한 Gas 비용은 "Gas 비용"입니다. 결국 Gas 비용은 이더리움의 자원 사용에 대한 비용입니다.
초기 Gas에 대한 첫 번째 키
Gas의 개념은 컴퓨터 분야에서 유래되었으며, 이더리움에서는 이더리움 백서에서 처음 등장했습니다. 백서의 저자는 Polkadot의 창립자 Gavin입니다. 이더리움 백서에서는 이론적으로 거래에 포함된 Gas는 임의의 값이 될 수 있다고 명시하고 있습니다. 이론적으로 더 많은 거래를 포함해야 하며, 최대 2^256까지(알려진 우주 내 원자 수와 거의 동일한 거래 수를 포함할 수 있음) 가능합니다.
디자인은 무한하지만, 처리 능력은 제한적입니다. Geth 1.6 버전에서 Gas 계산은 64비트 값으로 전환되었으며, 이로 인해 64비트의 단일 블록이 수용할 수 있는 거래량은 인체 내 적혈구 수의 44배에 달합니다. 그러나 이는 이론적이며, 현실은 훨씬 다릅니다.
이 버전이 확인되기 전, Vitalik이 설계한 이더리움 Gas 모델에서 Gas 비용 지불 과정이 기본적으로 계약 내에서 이루어지며, 즉 계약 실행 과정에서 계약 내 잔액이 감소합니다. 만약 잔액이 실행 소모로 인해 부족해지면 계약이 중단됩니다.
초기 이더리움 계약 내 실행 설정의 내장 비용 차감
그 후 Gavin이 이더리움에 참여하게 되었고, 들어온 후 Gas 지불 메커니즘을 수정하여 계약 실행 지불에서 송금인이 지불하도록 변경했습니다. 즉, 계약 실행자가 지불하게 된 것입니다. Vitalik은 이를 "계약 지불" 방식에서 "송신자 지불" 방식으로 전환했다고 설명했습니다. 이는 각 개별 거래 단계에서 즉시 약간의 ETH를 가져가는 방식입니다.
이더리움 초기 Vitalik과 Gavin이 미니 해커톤에서, 가운데의 신은 Jeffrey입니다.
이것은 "Gas 비용 지불"을 이해하기 쉽게 설명합니다. 더 세부적인 부분을 해부하려면, 우리는 백서에서 Gas와 관련된 부분을 살펴봐야 합니다.
Gas는 이더리움 내 모든 계산량의 가격 단위로, 이더리움에서 더 많은 계산을 수행하려면 더 많은 Gas를 지불해야 합니다.
이러한 사용자 지불 모델은 자원 남용을 방지할 수 있습니다. 개발자가 각 연산에 대해 비용을 지불하게 되면, 코드를 최대한 간결하고 효율적으로 작성하려고 할 것입니다. 또한 Gas의 존재는 공격자가 무효 연산을 통해 이더리움 네트워크에 플러딩 공격을 하는 것을 방지할 수 있습니다. 아래에서 통계된 EIP 중 하나는 계정 접근에 대한 Gas 값을 높여 공격 가능성을 줄이는 것입니다.
Gas를 지불해야 하는 곳을 아는 것 외에도, GasPrice와 GasLimit에 대해서도 이해해야 합니다.
GasPrice는 거래 송신자가 각 단위 Gas에 대해 지불할 의향이 있는 가격(Wei로 측정)입니다. 거래 송신자는 각 단위 Gas 가격을 사용자 정의할 수 있습니다. 예를 들어, 한 거래가 10 Gas를 소모해야 하고, 송신자가 3 Wei/Gas를 지불할 의향이 있다면, 거래의 총 비용은 30 Wei가 됩니다. 우리가 사용하는 지갑에는 Gas 비용을 조정할 수 있는 고급 옵션이 있습니다.
GasLimit는 거래 송신자가 거래 실행에 사용할 수 있는 최대 Gas 양입니다. 만약 GasLimit가 없다면, 송신자의 계좌 잔액이 잘못 소모될 수 있으며, GasLimit는 계좌의 모든 ETH가 소모되는 것을 방지하는 안전 메커니즘입니다.
또한 GasLimit는 선불 Gas로 정의될 수도 있습니다. 노드가 거래를 검증할 때, 먼저 GasPrice에 GasLimit를 곱하여 거래의 고정 비용을 계산합니다. 만약 거래 송신자의 계좌 잔액이 거래의 고정 비용보다 적다면, 해당 거래는 무효로 간주됩니다. 거래가 실행된 후 남은 Gas는 송신자 계좌로 반환되며, 이것이 우리가 MetMask를 사용하여 계약을 실행할 때 Gas를 예상할 때 비쌀 수 있지만, 실행 후 가격이 그렇게 높지 않은 이유입니다.
하나의 블록에 포함된 내용
이것은 블록 내固有内容입니다. 거래 부분에는 237건의 송금과 39건의 계약 내부 거래가 있으며, 거래를 구체적으로 살펴보면 더 자세한 Gas 비용 지출을 확인할 수 있습니다. 연료 제한은 12493113으로, 글의 시작 부분에서 언급한 EIP-3382에서 각 블록의 Gas 제한을 12500000으로 제한하는 것입니다. 이렇게 하면 각 블록에서 얻는 보상의 총합이 비교적 제어 가능해집니다.
ETH1.0 체인에 대해 각 작업 코드의 Gas 비용 계산이 있으며, 우리는 그 중 가격이 높은 부분을 발췌하여 독자에게 참고용으로 제공합니다. 작업 코드는 체인의 실행과 자원 사용을 결정합니다. 예를 들어, 계약을 생성한다고 가정할 경우 비용 계산은 다음과 같습니다:
고유 비용 = Gtransaction + Gtxdatazero * Nzeros + Gtxdatanonzero * Nnonzeros + Gtxcreate
여기서:
- Gtransaction = 21,000 Wei
- Gtxcreate = 32,000 Wei
- Gtxdatazero = 4 Wei
- Gtxdatanonzero = 68 Wei (이스탄불 업그레이드 시 16 wei로 변경됨)
다음의 작업 코드에 대해 확인해 보세요.
이더리움 1.0 체인의 작업 코드에 해당하는 Gas 값 소모
위의 설명을 통해 우리가 얻을 수 있는 기본적인 이해는 Gas 비용은 이더리움의 체인 자원을 사용함으로써 발생하며, 계산이 많을수록 Gas가 높아진다는 것입니다. 스마트 계약의 각 개별 단계에서도 Gas를 지불해야 합니다. 추가로, 송신자가 Gas를 매우 높게 설정하면, 채굴자는 거래를 우선적으로 실행합니다. 왜냐하면 채굴자는 특정 거래를 우선적으로 패키징할 수 있기 때문입니다.
Gas 비용과 밀접한 관련이 있는 21개의 EIP
이제 Gas에 대한 EIP 제안에 대해 자세히 살펴보겠습니다. 제안은 대략 시간 순서대로 배열되어 있습니다.
EIP-5: RETURN 및 CALL의 Gas 사용량 조정
이 EIP는 RETURN 문자열 및 기타 동적 크기 배열의 함수를 호출할 수 있게 합니다. 현재 이더리움 가상 머신 내부에서 다른 계약/기능을 호출할 때 출력 크기를 미리 지정해야 합니다. 또한 쓰이지 않은 메모리에 대해 비용을 지불해야 하므로 동적 크기 데이터를 반환하는 것이 비싸고 유연성이 떨어져 사실상 사용할 수 없습니다. 이 EIP에서 제안된 해결책은 CALL 반환 시 실제로 쓰인 메모리에 대해서만 비용을 지불하는 것입니다.
EIP-150: 대량 IO 작업의 Gas 비용 변화
- EXTCODESIZE의 Gas 비용을 20에서 700으로 증가시킵니다.
- EXTCODECOPY의 기본 Gas 비용을 20에서 700으로 증가시킵니다.
- BALANCE의 Gas 비용을 20에서 400으로 증가시킵니다.
- SLOAD의 Gas 비용을 50에서 200으로 증가시킵니다.
- CALL, DELEGATECALL, CALLCODE의 Gas 비용을 40에서 700으로 증가시킵니다.
- SELFDESTRUCT의 Gas 비용을 5000에서 5000으로 유지합니다.
만약 SELFDESTRUCT가 새로 생성된 계좌에 적중하면 25000의 추가 Gas 비용이 발생합니다( CALL과 유사). - 제안된 Gas 제한 목표를 550만으로 높입니다.
EIP-158: 상태 정리
어떠한 경우에도 call 잔액 등이 0인 계좌는 더 이상 25000의 계좌 생성 Gas 비용을 소모하지 않습니다.
EIP-1108: alt_bn128 사전 컴파일 Gas 비용 감소
타원 곡선 계산 사전 컴파일의 현재 가격이 너무 높습니다. 사전 컴파일의 재가격 책정은 이더리움의 많은 프라이버시 솔루션 및 확장 솔루션에 큰 도움이 될 것입니다. 이더리움 기반의 zk-SNARK 프로토콜에 대해 EIP-1108은 zk-SNARK 검증의 Gas 비용을 크게 줄일 뿐만 아니라 여러 zk-SNARK 증명을 배치로 결합하는 데도 도움이 됩니다. 이는 단일 zk-SNARK 회로를 더 작은 개별 회로 크기를 가진 zk-SNARK로 분할하는 데 사용할 수 있는 기술이기도 하며, zk-SNARK를 더 쉽게 구성하고 배포할 수 있게 합니다.
현재 이러한 거래의 비용은 약 6,000,000Gas입니다. 이 EIP는 이를 1,000,000Gas로 줄일 수 있어 이 프로토콜을 더욱 실용적으로 만듭니다.
EIP-1283: SSTORE 작업 코드의 Gas 조정
이 EIP는 SSTORE 작업 코드의 측정 변경을 제안하여 계약 저장의 새로운 용도를 실현하고, 대부분의 구현 작업 방식과 일치하지 않는 곳에서 과도한 Gas 비용을 줄입니다. 이는 EIP-1087의 대안으로 사용될 수 있으며, EIP-1087에서는 캐시 사용 변경에 대해 서로 다른 최적화 전략의 구현을 보다 친숙하게 만들려고 시도합니다.
EIP-2028: 거래 데이터 사용 Gas 비용 감소
Calldata(GTXDATANONZERO)의 Gas 비용을 현재의 68 바이트에서 16 바이트로 줄일 것을 제안하며, 수학적 모델링 및 경험적 추정을 통해 이를 지원합니다.
EIP-2200: 순수 Gas 측정의 구조적 정의
이 EIP는 SSTORE 작업 코드에 대해 순수 Gas 측정 변경의 구조적 정의를 제공하여 계약 저장의 새로운 용도를 실현하고, 대부분의 구현 작업 방식과 일치하지 않는 곳에서 과도한 Gas 비용을 줄입니다. 이는 EIP-1283 및 EIP-1706의 조합으로 사용될 수 있습니다.
EIP-2565: ModExpGas 비용
ModExp 사전 컴파일의 실제 작업 비용을 정확하게 반영하기 위해, 이 EIP는 Gas 비용을 계산하는 알고리즘을 지정합니다. 이 알고리즘은 곱셈 복잡도 비용을 추정하고, 이를 실행에 필요한 반복 횟수의 근사값으로 곱합니다.
EIP-1559: ETH 1.0 체인의 요금 시장 변화
이더리움은 간단한 경매 메커니즘을 사용하여 역사적 가격으로 거래 비용을 책정합니다. 사용자는 입찰("Gasprices")로 거래를 전송하고, 채굴자는 가장 높은 입찰의 거래를 선택하여 포함시킵니다. 이는 비효율성을 초래합니다.
이 EIP에서 제안된 것은 기본 비용 금액에서 시작하는 것으로, 이 비용은 프로토콜에 의해 네트워크의 혼잡 정도에 따라 상하 조정됩니다. 네트워크가 각 블록 Gas의 목표 사용량을 초과할 경우 기본 비용이 약간 증가하고, 용량이 목표 수치보다 낮을 경우 기본 비용이 약간 감소합니다.
이러한 기본 비용의 변화는 제한을 받기 때문에, 서로 다른 블록 간 기본 비용의 최대 차이는 예측 가능하게 됩니다. 이는 지갑이 사용자에게 Gas 비용을 자동으로 설정할 수 있게 해줍니다. 예상되는 바에 따르면, 네트워크가 활성화된 기간에도 대부분의 사용자는 수동으로 Gas 비용을 조정할 필요가 없습니다. 대부분의 사용자에게 기본 비용은 그들의 지갑이 추정하게 될 것입니다.
EIP-2929: 상태 접근 작업 코드의 Gas 비용 증가
SLOAD(0x54)의 Gas 비용을 2100으로 증가시키고, *CALL 작업 코드 계열(0xf1, f2, f4, fA), BALANCE 0x31 및 EXT* 작업 코드 계열(0x3b, 0x3c, 0x3f) 및 2600 면 CD(ⅰ) 사전 컴파일에 대해 증가시킵니다. 또한 SSTORE 측정 방식을 개혁하여 SELFDESTRUCT와 같은 작업 코드에서固有的인 "실제 저장 부하"에 대해 올바르게 가격을 책정하도록 보장합니다.
일반적으로 작업 코드 Gas 비용의 주요 기능은 해당 작업 코드를 처리하는 데 필요한 시간을 추정하는 것입니다. 목표는 Gas 제한이 블록 처리에 필요한 시간의 제한에 해당하도록 하는 것입니다. 그러나 저장 접근 작업 코드(SLOAD 및 CALL, BALANCE 및 EXT 작업 코드)는 역사적으로 과소 평가되었습니다. 2016년 상하이 DoS 공격에서 가장 심각한 클라이언트 오류가 수정된 후, 공격자가 사용한 전략 중 하나는 단순히 접근 가능하거나 많은 계좌를 호출하는 거래를 보내는 것이었습니다.
제안된 EIP는 이러한 작업 코드의 비용을 약 3배 증가시켜 최악의 경우 처리 시간을 약 7-27초로 줄입니다. 데이터베이스 레이아웃의 개선은 클라이언트를 재설계하여 저장소를 직접 읽도록 하여 Merkle 트리를 건너뛰는 것을 포함하며, 이는 이러한 상황을 더욱 줄일 수 있습니다. 그러나 이러한 기술은 완전히 출시되기까지 오랜 시간이 걸릴 수 있으며, 이러한 기술을 채택하더라도 저장소 접근의 IO 오버헤드는 여전히 실질적일 것입니다.
EIP-1077: 계약 호출의 Gas 중계
DApp의 주요 장애물은 체인 작업을 수행하기 위해 여러 토큰이 필요하다는 것입니다. 사용자가 실행 의도를 표시하기 위해 메시지에 서명할 수 있지만, 제3자 중계자가 메시지를 실행하도록 허용하면 이 문제를 피할 수 있습니다. 이더리움 거래는 항상 ETH가 필요하지만, 스마트 계약은 EIP-191 서명을 채택하고 신뢰할 수 없는 당사자가 거래를 실행하도록 지불을 전송할 수 있습니다. 이를 통해 그들의 일반 형식을 표준화하고, 사용자가 토큰으로 거래 비용을 지불할 수 있는 방법을 허용하여 애플리케이션 개발자에게 큰 유연성을 제공하며, 애플리케이션 사용자가 블록체인과 상호작용하는 주요 방법이 될 수 있습니다.
EIP-1087: SSTORE 작업에 대한 Gas 측정
이 EIP는 EVMSSTORE 작업의 Gas 청구 방식을 변경하여 불필요한 Gas 비용을 줄이고 계약 저장에 대한 새로운 사용 사례를 제공합니다.
EIP-1285: CALL 작업 코드에 GcallstipendGas 추가
Gcallstipend는 CALL 작업 코드의 비용 매개변수를 2,300에서 3,500Gas 단위로 증가시킵니다.
EIP-1380: 내부 호출의 Gas 비용 감소
내부 호출의 Gas 비용을 줄이면 Solidity 및 Vyper와 같은 스마트 계약 언어에 큰 혜택을 줄 수 있습니다. 이를 통해 그들은 CALL을 사용하여 JUMP 내부 작업 호출을 대체할 수 있습니다.
EIP-1613: Gas 스테이션 네트워크
계약이 "대리 수금"을 수락하고 Gas 비용을 지불할 수 있도록 하여 비 ETH 사용자가 스마트 계약에 접근할 수 있게 합니다(예: dapp).
dapp과 통신하려면 현재 ETH에 Gas 비용을 지불해야 하며, 이는 dapp의 채택을 이더리움 사용자로 제한합니다. 따라서 계약 소유자는 사용자 확보를 늘리기 위해 Gas 비용을 지불하고 싶어할 수 있으며, 사용자가 법정 화폐로 Gas 비용을 지불할 수 있도록 할 수 있습니다. 또는 제3자가 특정 계약의 Gas 비용을 보조하고 싶어할 수 있습니다. EIP-1077에서 설명한 해결책은 ETH가 포함되지 않은 주소에서 거래를 허용할 수 있습니다.
EIP-1930: 엄격한 Gas 의미의 CALL. 충분한 Gas가 없으면 롤백
특정 수의 Gas를 사용하여 CALL을 실행하는 기능을 추가합니다. 이를 수행할 수 없는 경우 실행을 롤백해야 합니다.
EIP-2045: EVM 작업 코드의 세분화된 Gas 비용
EVM 작업 코드(ADD, SUB, MUL 등)의 계산은 일반적으로 저장 작업 코드의 I/O(SLOAD, SSTORE 등)에 비해 과대 평가됩니다. 현재 최소 Gas 비용은 1(즉, 하나의 Gas 단위)이며, 대부분의 계산 작업 코드의 비용은 1에 가깝습니다(예: 3, 5 또는 8). 따라서 비용을 낮출 수 있는 범위가 제한적입니다. "세분화된"이라는 새로운 최소 Gas 단위는 Gas의 일부로, Gas 비용 범위를 확장하여 현재의 최소 수준 이하로 낮출 수 있습니다.
EIP-2046: 정적 호출에 대한 사전 컴파일의 Gas 비용 감소
사전 컴파일을 호출하는 기본 Gas 비용 STATICCALL을 700에서 40으로 줄입니다. 이는 사전 컴파일을 보다 효율적으로 사용하고, 총 비용이 700 이하인 사전 컴파일을 허용합니다.
EIP-2542: 새로운 작업 코드 TXGASLIMIT 및 CALLGASLIMIT
스마트 계약이 현재 거래 및 실행 프레임워크의 Gas 제한에 대한 정보를 접근할 수 있도록 합니다. 중계, 메타 거래, Gas 비용 및 계좌 추상화와 같은 개념의 보급으로 인해 특정 계약에 대해 Gas 지출을 절대적으로 정확하게 추적하는 것이 중요해졌습니다.
EIP-3322: 계좌 Gas 저장 작업 코드
Gas를 수요가 적은 블록에서 수요가 많은 블록으로 이동시켜 Gas 공급의 탄력성과 가격 안정성을 가져옵니다. 불행히도, 이는 불필요한 상태 증가에 보상을 줍니다. 고급 Gas 저장 메커니즘을 도입함으로써 Gas 시장은 더 적은 저장소와 계산을 필요로 하게 됩니다.
EIP-2780: 내부 거래 Gas 감소
내부 거래의 비용을 21,000에서 7,000Gas로 줄입니다.
현재 21,000 거래의 Gas 내부 비용은 ETH를 전송하는 비용을 매우 높게 만들며, 소규모(수십 달러)의 비용은 일반적으로 매우 비쌉니다. 다른 EIP(예: EIP-1559)도 Gas 가격 및 최초 가격 경매의 변화를 고려했지만, 안전한 방식으로 ETH 전송 비용을 대폭 낮추고 이러한 거래의 수를 늘리는 것은 긍정적일 것입니다.
두 번째 키: Rollup과 Gas
초기 Gas 이야기는 이더리움 Gas 비용 모델의 제정에 관한 것이었으며, 현재로서는 Gas 비용을 낮추는 것 외에도 가장 좋은 확장 및 Gas 비용 절감 방법은 거래 데이터 압축입니다.
이는 Rollup과 큰 관련이 있습니다.
간단한 이더리움 거래(ETH 전송)는 약 110바이트가 필요합니다. 그러나 Rollup 내 ETH 전송은 단 12바이트를 차지합니다. 따라서 Rollup은 기본 체인의 확장성을 약 10배 향상시킬 수 있으며, 특정 계산에서는 Rollup을 사용하여 확장성이 100배 이상 향상될 수 있습니다.
이는 절대적으로 주목할 만한 성과이며, 이것이 Eth2.0이 Rollup 중심의 개발 경로가 된 이유입니다.
Gas 비용 조정은 오랜 개념과 과정으로, 수많은 이더리움 엔지니어들이 세부 수정을 통해 이루어진 결과입니다. 단일 Gas EIP의 조정만으로는 Gas 비용의 중요성과 조정의 어려움을 충분히 느낄 수 없습니다. 그러나 확실한 것은 이더리움 Gas 문제의 최종 해결책은 반드시 Eth2.0이 될 것이며, 기대하는 마음을 유지하시길 바랍니다.