Gas Smashing
Sui의 모든 Transaction은 성공적으로 실행되기 위해 가스 수수료를 지불해야 한다. Gas smashing은 단일 코인 대신 여러 코인을 사용해 이 수수료를 지불할 수 있도록 한다. 이는 소액 코인이 많거나 계정의 코인 수를 줄이고자 할 때 유용하다. Gas smashing은 GasCoin이 programmable transaction block (PTB) 인자로 함께 사용할 때 가장 강력하다.
Smashing gas
Gas smashing은 여러 코인을 가스 수수료로 제공할 경우 Transaction 내에서 자동으로 발생한다. Sui가 Transaction을 실행할 때, Sui는 가스를 지불하기 위해 제공된 모든 코인을 하나의 코인으로 병합(smashes)한다. 이 병합은 코인의 금액이나 Transaction에 지정된 가스 예산과 관계없이(최소 및 최대 가스 예산 범위 내에서라면) 발생한다. Sui는 Transaction의 실행 결과와 상관없이 단일 코인에서 가스 수수료를 공제한다. 특히, 실행 오류 등으로 인해 Transaction이 실패하더라도 가스 코인으로 제공된 코인들은 Transaction 실행 후에도 병합된 상태로 유지된다.
핵심 요점:
- Transaction은 실행 성공 여부와 관계없이 병합된 코인에서 가스를 공제한다.
- 실행이 실패하더라도 가스 코인들은 Transaction 이후 병합된 상태로 남는다.
- 병합된 코인은 가스 공제 후 남은 SUI를 전송하는 등 동일한 PTB 내에서 다른 작업에 사용할 수 있다.
이 설계는 Gas smashing을 코인 관리와 가스 지불을 동시에 수행할 수 있는 실용적인 방법으로 만든다. 예를 들어, 여러 개의 소액 코인을 병합하면서 동시에 별개의 작업을 하나의 PTB에서 실행할 수 있다.
제한사항 및 영향:
- 하나의 PTB에서 최대 256개의 코인만 병합할 수 있다. 256개를 초과하는 가스 코인을 가진 Transaction은 실패한다.
- 첫 번째 코인을 제외한 나머지 코인들은 삭제되며, 이 과정에서 storage rebate가 발생할 수 있다.
- Rebate는 동일한 Transaction 내에서 가스 지불에 사용할 수 없으며, 대신 실행 완료 후 첫 번째 코인에 rebate와 가스 공제 후 잔액이 함께 적립된다.
Running out of gas with a refund
병합은 항상 발생하기 때문에, storage rebate로 인해 Transaction이 가스를 소진하면서도 순 환급(net refund)을 발생시키는 특이한 결과가 생길 수 있다.
예시:
- Transaction
T의 가스 예산은5000이다. - 다음 다섯 개의 코인을 각각 해당하는 잔액과 함께 제공한다:
C1 = 1000,C2 = 2000,C3 = 3000,C4 = 4000,C5 = 5000. - 코인당 storage rebate는
2000이다. - 가스 비용이
5000예산을 초과하면T는OutOfGas로 실패한다.
그러나 병합과 rebate 이후에는 다음과 같다:
Final balance in C1 =
(1000 + 2000 + 3000 + 4000 + 5000) // 모든 코인 잔액
- 5000 // 가스 비용
+ (2000 * 4) // 삭제된 코인에 대한 rebate
= 15000 - 5000 + 8000
= 18000
이 경우 T는 실패하지만 여전히 순 환급 3000을 받게 된다.